Поиск:

Ответ в темуСоздание новой темы Создание опроса
> int 20h, Как работает? 
V
    Опции темы
Merlin27
Дата 28.10.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 1.10.2006

Репутация: нет
Всего: нет



Куда передается управление при вызове Int 20h в com-файле? Случайно не в CS:0 ? Тогда при загрузке программы туда можно было бы вставить retf...  для возврата в собственную ОС или чтото в этом роде. Или придется ловить это прерываение и самостоятельно обрабатывать?
Подскажите как бы сделать завершение проги, чтобы она ничем не отличалась по коду от обычно запускаемой в досе. Чтобы можно было запускать и нормально завершать на собственной ОС com- программы, написанные для DOS.

Это сообщение отредактировал(а) Merlin27 - 28.10.2006, 15:56
PM MAIL   Вверх
anwe
Дата 28.10.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 1
Всего: 23



Цитата
Куда передается управление при вызове Int 20h в com-файле? Случайно не в CS:0 ?

Нет, немного не так. Туда передает управление команда ret. А уже по этому адресу находится int 20h, которая и завершает программу.
Цитата
можно было бы вставить retf

Так как com-файл весь находится в одном сегменте, то retn
Можно еще просто написать ret 20h, хотя она длинее на 1 байт. А, вообще-то ret нормально завершает программу.
PM MAIL   Вверх
Merlin27
Дата 29.10.2006, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 1.10.2006

Репутация: нет
Всего: нет



Значит чтобы моя ОС завершала программу по Int 20h нужно это прерываение  както отлавливать?  Retf  я имел в виду в продолжеии темы о передаче управления программе вот тут.
Мне нужно чтобы по int 20h завершалась загруженная таким образом прога.
PM MAIL   Вверх
anwe
Дата 29.10.2006, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 1
Всего: 23



Своим последним высказыванием ты меня совершенно запутал.
Я понимаю так: ты пишешь программу, запускающую другую программу пусть даже и по другому адресу. Получается когда ты выходишь из запускаемой проги командойretf, она уже закончила свою работу. Теперь тебе надо завершить вызывающую прогу. Заканчивай ее либо ret либо int 20h.
PM MAIL   Вверх
dumb
Дата 29.10.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



я так понял Merlin27 пишет микро-аналог ДОС'а.
ret и int 20h относятся к интерфейсу ДОС'а, и необязательно делать так же. тем более, что для такой эмуляции нужно перехватывать хотя бы int 20h и, для обеспечения выхода по ret, копировать действия загрузчика досового - создавать типа psp, в его начало класть "cd 20", и перед передачей управления вызываемой программе класть на стек указатель на начало psp.
проще уж определить свой "интерфейс" - "...программа завершается по retf.."
а то так потом еще начнется копирование int 21 итд итп... smile
PM MAIL   Вверх
Merlin27
Дата 4.11.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 1.10.2006

Репутация: нет
Всего: нет



anwe, ты действительно не понял о чем я говорю. smile


dumb, я подумаю какой вариант использовать.... Если сделать свой "интерфейс" то досовский ком не запустишь smile  Переопределить прерывание чисто в академических целях интереснее smile
PM MAIL   Вверх
Akina
Дата 4.11.2006, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Цитата(Merlin27 @  28.10.2006,  16:49 Найти цитируемый пост)
Куда передается управление при вызове Int 20h в com-файле?

Управление передается на обработчик этого прерывания в ДОСе. Который должен сделать кучу дел - совободить блоки памяти, которые были заняты завершаемой программой, в т.ч. блок среды, сформировать нулевой код возврата, восстановить обработчик критической секции, освободить блок стека, выделенного для организации загрузки и выполнения, и т.п... там все очень даже непросто. Выполнив всю работу, ДОС передает управление в точку вызова родительской программы, на следующую после вызова дочерней программы инструкцию.

И одним ret-ом тут не отделаешься. Даже дальним.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Merlin27
Дата 5.11.2006, 04:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 1.10.2006

Репутация: нет
Всего: нет



Akinasmile ну вот в ближайшие пару недель мне предстоит еще и с этим всем попариться (правда не в таком масштабе). Надо реализовать многозадачность в реальном режиме... В той учебной учебном GlukOS с сайта codenet.net есть примеры. Предлагают перехватывать прерывание int08h для переключения задач и int 20h для выгрузки программы. Но это уже другая история.

Я пока выхожу из "приложений" c помощь ret. Он передает управление на cs:0000 а туда я предварительно вставляю retf. В сегмент стека "приложения" также предварительно заношу дальний адрес возврата. Т.о. такое "приложение" запускается и в ДОСе и в моей "ОС" smile
PM MAIL   Вверх
Akina
Дата 5.11.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



???

Я не понял, кто тебе мешает производить самостоятельное распределение памяти в зависимости от потребностей программы и загружать-стартовать их, исполльзуя механизмы загрузки оверлея? А переключение исполнения действительно производить по таймеру.

Впрочем переключение по таймеру - плохое решение. Вдруг в этот момент точка исполнения окажется не в теле программы, а в вызванном программно прерывании? особенно в его критической секции? Ты же не сохраняешь контекст исполнения... Возможны любые неожиданности, вплоть до подвиса ящика и потери данных на дисках. лучше для переключения использовать именно вызовы программой прерывания ДОС, а вот флаг возможности переключения задачи задавать в прерывании таймера.

Я уж не говорю о том что завершение программы инструкцией int 20h или ret - это оставлено для обратной совместимости и плохо. Есть для этой цели целых 2 функции прерывания 21h.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
dumb
Дата 5.11.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



Akina, вернись из ностальгических воспоминаний о ДОС'е - Merlin27 пишет свою мини-ОС.

Цитата(Merlin27 @  4.11.2006,  16:59 Найти цитируемый пост)
Если сделать свой "интерфейс" то досовский ком не запустишь

чтобы запускать "досовский" ком, он все равно должен быть написан с кучей ограничений: выход по ret/int 20, вызов только bios-int'ов итд итп... хотя, даже с такими ограничениями можно что-то "неигрушечное" написать. так что, возможно, овчинка и стоит выделки...
PM MAIL   Вверх
Merlin27
Дата 5.11.2006, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 1.10.2006

Репутация: нет
Всего: нет



Akina, я почти ниче не понял smile


dumb, а мне ниче грандиозного и не надо smile. Это ведь учебная ОСь. И очень удобно когда можно ее запустить в ДОСе/Винде и дебажить тут же. Для этого я и затеял совместимость smile
PM MAIL   Вверх
Akina
Дата 5.11.2006, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Цитата(dumb @  5.11.2006,  17:03 Найти цитируемый пост)
 вернись из ностальгических воспоминаний о ДОС'е - Merlin27 пишет свою мини-ОС.

Я отвечаю на поставленный вопрос, и не обязан проштудировать все труды автора вопроса, не так ли? и если он формулирует только половину условий - это его проблемы, а не мои.

Цитата(dumb @  5.11.2006,  17:03 Найти цитируемый пост)
чтобы запускать "досовский" ком, он все равно должен быть написан с кучей ограничений: выход по ret/int 20, вызов только bios-int'ов итд итп... 

Int 20h - это прерывание ДОСа. Все-таки. Так что если запускать скомпилированный для ДОС СОМ-файл и из него вызвать int 20h - неизвестно, куда улетит управление. Так что именно ret - в ДОСе для этого специально помещается ноль, а по адресу CS:0 записывается инструкция int 20h, но ДОСа-то нет... так что туда придется записывать длинный jmp в точку возврата или retf и адрес возврата в стек.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
dumb
Дата 6.11.2006, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



Цитата(Akina @  5.11.2006,  23:28 Найти цитируемый пост)
Я отвечаю на поставленный вопрос, и не обязан проштудировать все труды автора вопроса, не так ли?

ты б хотя бы пробежал глазами тему с начала... smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0822 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.