Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > int 20h


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

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

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

Так как 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 итд итп... smile

Автор: Merlin27 4.11.2006, 16:59
anwe, ты действительно не понял о чем я говорю. smile


dumb, я подумаю какой вариант использовать.... Если сделать свой "интерфейс" то досовский ком не запустишь smile  Переопределить прерывание чисто в академических целях интереснее smile

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

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

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

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

Я пока выхожу из "приложений" c помощь ret. Он передает управление на cs:0000 а туда я предварительно вставляю retf. В сегмент стека "приложения" также предварительно заношу дальний адрес возврата. Т.о. такое "приложение" запускается и в ДОСе и в моей "ОС" smile

Автор: Akina 5.11.2006, 12:59
???

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

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

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

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

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

чтобы запускать "досовский" ком, он все равно должен быть написан с кучей ограничений: выход по ret/int 20, вызов только bios-int'ов итд итп... хотя, даже с такими ограничениями можно что-то "неигрушечное" написать. так что, возможно, овчинка и стоит выделки...

Автор: Merlin27 5.11.2006, 16:52
Akina, я почти ниче не понял smile


dumb, а мне ниче грандиозного и не надо smile. Это ведь учебная ОСь. И очень удобно когда можно ее запустить в ДОСе/Винде и дебажить тут же. Для этого я и затеял совместимость smile

Автор: Akina 5.11.2006, 23:28
Цитата(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 и адрес возврата в стек.

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

ты б хотя бы пробежал глазами тему с начала... smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)