![]() |
|
![]() ![]() ![]() |
|
Merlin27 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 1.10.2006 Репутация: нет Всего: нет |
Куда передается управление при вызове Int 20h в com-файле? Случайно не в CS:0 ? Тогда при загрузке программы туда можно было бы вставить retf... для возврата в собственную ОС или чтото в этом роде. Или придется ловить это прерываение и самостоятельно обрабатывать?
Подскажите как бы сделать завершение проги, чтобы она ничем не отличалась по коду от обычно запускаемой в досе. Чтобы можно было запускать и нормально завершать на собственной ОС com- программы, написанные для DOS. Это сообщение отредактировал(а) Merlin27 - 28.10.2006, 15:56 |
|||
|
||||
anwe |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 1 Всего: 23 |
Нет, немного не так. Туда передает управление команда ret. А уже по этому адресу находится int 20h, которая и завершает программу.
Так как com-файл весь находится в одном сегменте, то retn Можно еще просто написать ret 20h, хотя она длинее на 1 байт. А, вообще-то ret нормально завершает программу. |
||||
|
|||||
Merlin27 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 1.10.2006 Репутация: нет Всего: нет |
Значит чтобы моя ОС завершала программу по Int 20h нужно это прерываение както отлавливать? Retf я имел в виду в продолжеии темы о передаче управления программе вот тут.
Мне нужно чтобы по int 20h завершалась загруженная таким образом прога. |
|||
|
||||
anwe |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 1 Всего: 23 |
Своим последним высказыванием ты меня совершенно запутал.
Я понимаю так: ты пишешь программу, запускающую другую программу пусть даже и по другому адресу. Получается когда ты выходишь из запускаемой проги командойretf, она уже закончила свою работу. Теперь тебе надо завершить вызывающую прогу. Заканчивай ее либо ret либо int 20h. |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 4 Всего: 158 |
я так понял Merlin27 пишет микро-аналог ДОС'а.
ret и int 20h относятся к интерфейсу ДОС'а, и необязательно делать так же. тем более, что для такой эмуляции нужно перехватывать хотя бы int 20h и, для обеспечения выхода по ret, копировать действия загрузчика досового - создавать типа psp, в его начало класть "cd 20", и перед передачей управления вызываемой программе класть на стек указатель на начало psp. проще уж определить свой "интерфейс" - "...программа завершается по retf.." а то так потом еще начнется копирование int 21 итд итп... ![]() |
|||
|
||||
Merlin27 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 1.10.2006 Репутация: нет Всего: нет |
anwe, ты действительно не понял о чем я говорю.
![]() dumb, я подумаю какой вариант использовать.... Если сделать свой "интерфейс" то досовский ком не запустишь ![]() ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 454 |
Управление передается на обработчик этого прерывания в ДОСе. Который должен сделать кучу дел - совободить блоки памяти, которые были заняты завершаемой программой, в т.ч. блок среды, сформировать нулевой код возврата, восстановить обработчик критической секции, освободить блок стека, выделенного для организации загрузки и выполнения, и т.п... там все очень даже непросто. Выполнив всю работу, ДОС передает управление в точку вызова родительской программы, на следующую после вызова дочерней программы инструкцию. И одним ret-ом тут не отделаешься. Даже дальним. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Merlin27 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 1.10.2006 Репутация: нет Всего: нет |
Akina,
![]() Я пока выхожу из "приложений" c помощь ret. Он передает управление на cs:0000 а туда я предварительно вставляю retf. В сегмент стека "приложения" также предварительно заношу дальний адрес возврата. Т.о. такое "приложение" запускается и в ДОСе и в моей "ОС" ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 454 |
???
Я не понял, кто тебе мешает производить самостоятельное распределение памяти в зависимости от потребностей программы и загружать-стартовать их, исполльзуя механизмы загрузки оверлея? А переключение исполнения действительно производить по таймеру. Впрочем переключение по таймеру - плохое решение. Вдруг в этот момент точка исполнения окажется не в теле программы, а в вызванном программно прерывании? особенно в его критической секции? Ты же не сохраняешь контекст исполнения... Возможны любые неожиданности, вплоть до подвиса ящика и потери данных на дисках. лучше для переключения использовать именно вызовы программой прерывания ДОС, а вот флаг возможности переключения задачи задавать в прерывании таймера. Я уж не говорю о том что завершение программы инструкцией int 20h или ret - это оставлено для обратной совместимости и плохо. Есть для этой цели целых 2 функции прерывания 21h. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 4 Всего: 158 |
Akina, вернись из ностальгических воспоминаний о ДОС'е - Merlin27 пишет свою мини-ОС.
чтобы запускать "досовский" ком, он все равно должен быть написан с кучей ограничений: выход по ret/int 20, вызов только bios-int'ов итд итп... хотя, даже с такими ограничениями можно что-то "неигрушечное" написать. так что, возможно, овчинка и стоит выделки... |
|||
|
||||
Merlin27 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 1.10.2006 Репутация: нет Всего: нет |
Akina, я почти ниче не понял
![]() dumb, а мне ниче грандиозного и не надо ![]() ![]() |
|||
|
||||
Akina |
|
||||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 454 |
Я отвечаю на поставленный вопрос, и не обязан проштудировать все труды автора вопроса, не так ли? и если он формулирует только половину условий - это его проблемы, а не мои.
Int 20h - это прерывание ДОСа. Все-таки. Так что если запускать скомпилированный для ДОС СОМ-файл и из него вызвать int 20h - неизвестно, куда улетит управление. Так что именно ret - в ДОСе для этого специально помещается ноль, а по адресу CS:0 записывается инструкция int 20h, но ДОСа-то нет... так что туда придется записывать длинный jmp в точку возврата или retf и адрес возврата в стек. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 4 Всего: 158 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "Asm: Общие вопросы" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |