| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > int 20h |
| Автор: Merlin27 28.10.2006, 15:49 |
| Куда передается управление при вызове Int 20h в com-файле? Случайно не в CS:0 ? Тогда при загрузке программы туда можно было бы вставить retf... для возврата в собственную ОС или чтото в этом роде. Или придется ловить это прерываение и самостоятельно обрабатывать? Подскажите как бы сделать завершение проги, чтобы она ничем не отличалась по коду от обычно запускаемой в досе. Чтобы можно было запускать и нормально завершать на собственной ОС com- программы, написанные для DOS. |
| Автор: anwe 28.10.2006, 16:13 | ||||
Нет, немного не так. Туда передает управление команда ret. А уже по этому адресу находится int 20h, которая и завершает программу.
Так как com-файл весь находится в одном сегменте, то retn Можно еще просто написать ret 20h, хотя она длинее на 1 байт. А, вообще-то ret нормально завершает программу. |
| Автор: Merlin27 29.10.2006, 12:15 |
| Значит чтобы моя ОС завершала программу по Int 20h нужно это прерываение както отлавливать? Retf я имел в виду в продолжеии темы о передаче управления программе http://forum.vingrad.ru/topic-118336.html. Мне нужно чтобы по int 20h завершалась загруженная таким образом прога. |
| Автор: anwe 29.10.2006, 12:40 |
| Своим последним высказыванием ты меня совершенно запутал. Я понимаю так: ты пишешь программу, запускающую другую программу пусть даже и по другому адресу. Получается когда ты выходишь из запускаемой проги командойretf, она уже закончила свою работу. Теперь тебе надо завершить вызывающую прогу. Заканчивай ее либо ret либо int 20h. |
| Автор: dumb 29.10.2006, 18:13 |
| я так понял Merlin27 пишет микро-аналог ДОС'а. ret и int 20h относятся к интерфейсу ДОС'а, и необязательно делать так же. тем более, что для такой эмуляции нужно перехватывать хотя бы int 20h и, для обеспечения выхода по ret, копировать действия загрузчика досового - создавать типа psp, в его начало класть "cd 20", и перед передачей управления вызываемой программе класть на стек указатель на начало psp. проще уж определить свой "интерфейс" - "...программа завершается по retf.." а то так потом еще начнется копирование int 21 итд итп... |
| Автор: Merlin27 4.11.2006, 16:59 |
| anwe, ты действительно не понял о чем я говорю. dumb, я подумаю какой вариант использовать.... Если сделать свой "интерфейс" то досовский ком не запустишь |
| Автор: Akina 4.11.2006, 23:51 |
Управление передается на обработчик этого прерывания в ДОСе. Который должен сделать кучу дел - совободить блоки памяти, которые были заняты завершаемой программой, в т.ч. блок среды, сформировать нулевой код возврата, восстановить обработчик критической секции, освободить блок стека, выделенного для организации загрузки и выполнения, и т.п... там все очень даже непросто. Выполнив всю работу, ДОС передает управление в точку вызова родительской программы, на следующую после вызова дочерней программы инструкцию. И одним ret-ом тут не отделаешься. Даже дальним. |
| Автор: Merlin27 5.11.2006, 04:44 |
| Akina, Я пока выхожу из "приложений" c помощь ret. Он передает управление на cs:0000 а туда я предварительно вставляю retf. В сегмент стека "приложения" также предварительно заношу дальний адрес возврата. Т.о. такое "приложение" запускается и в ДОСе и в моей "ОС" |
| Автор: Akina 5.11.2006, 12:59 |
| ??? Я не понял, кто тебе мешает производить самостоятельное распределение памяти в зависимости от потребностей программы и загружать-стартовать их, исполльзуя механизмы загрузки оверлея? А переключение исполнения действительно производить по таймеру. Впрочем переключение по таймеру - плохое решение. Вдруг в этот момент точка исполнения окажется не в теле программы, а в вызванном программно прерывании? особенно в его критической секции? Ты же не сохраняешь контекст исполнения... Возможны любые неожиданности, вплоть до подвиса ящика и потери данных на дисках. лучше для переключения использовать именно вызовы программой прерывания ДОС, а вот флаг возможности переключения задачи задавать в прерывании таймера. Я уж не говорю о том что завершение программы инструкцией int 20h или ret - это оставлено для обратной совместимости и плохо. Есть для этой цели целых 2 функции прерывания 21h. |
| Автор: dumb 5.11.2006, 16:03 |
| Akina, вернись из ностальгических воспоминаний о ДОС'е - Merlin27 пишет свою мини-ОС. чтобы запускать "досовский" ком, он все равно должен быть написан с кучей ограничений: выход по ret/int 20, вызов только bios-int'ов итд итп... хотя, даже с такими ограничениями можно что-то "неигрушечное" написать. так что, возможно, овчинка и стоит выделки... |
| Автор: Merlin27 5.11.2006, 16:52 |
| Akina, я почти ниче не понял dumb, а мне ниче грандиозного и не надо |
| Автор: dumb 6.11.2006, 03:31 | ||
ты б хотя бы пробежал глазами тему с начала... |