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


Автор: Dreamuchiy 13.4.2011, 22:54
У меня ms-dos 622, работает с загрузочной флешки. Masm 61. Меняю видео режим (int 10h). Режим меняется, а вот в конце написано mov ax,4c00h и соответственно int 21h. Режим меняется и на этом все... Не могу понять почему нет возврата нормального в дос и почему нельзя просто использовать команду RET ? Помогите разобраться пожалуйста, я на x86 процах еще новичок совсем. Давно еще активно писал простые проги еще под проц z80, там выход осуществлялся просто командой ret

Автор: iff 14.4.2011, 12:46
Цитата(Dreamuchiy @  13.4.2011,  22:54 Найти цитируемый пост)
Помогите разобраться пожалуйста, я на x86 процах еще новичок совсем. Давно еще активно писал простые проги еще под проц z80, там выход осуществлялся просто командой ret 

Хотите идти в ногу со временем?  smile

Цитата(Dreamuchiy @  13.4.2011,  22:54 Найти цитируемый пост)
mov ax,4c00h и соответственно int 21h

Можно завершить также прерыванием INT 20h, но у функции 4Ch прерывания INT 21h есть приемущество - она может возвратить код завершения (error level). Функция 4Ch прерывания INT 21h вызывается так:
нужно в регистр ah поместить 4Ch (код функции), в регистр al поместить код завершения (в случае отсутствия ошибок код завершения обычно делают равным нулю, в случае ошибки - её коду), затем исполняется непосредственно вызов прерывания инструкцией INT 21h.
Код завершения ошибки можно обработать в bat-файлах, например:
Код

myprog.exe
if errorlevel 1 echo Ошибка исполнения программы myprog.exe

В новых версиях ДОС (точнее уже в её эмуляторах под виндовсом) существет переменная среды errorlevel, которая содержит код завершения последней программы.

А на ms-dos тоже можно завершать программу инструкцией ret (точнее retn). При выполнении этой инструкции берётся адрес из стека (стек должен быть пуст к этому моменту и на его вершине тогда записано 0000 - нулевое значение оставляет ДОС.), процессор переходит к исполнению инструкции по адресу 0000 - а там размешена инструкция INT 20h - ее тоже оставил ДОС в PSP (префикс сегментного кода - область памяти с адреса 0000 до 0100h). - Но это только в программах типа COM всё так просто. В программах типа EXE - сложнее - там CS не указывает на сегмент PSP, на него указывает DS и ES.
Но программу типа EXE тоже можно зывершить инструкцией ret (точнее retf).
Код

push ds ;записываем в стек адрес сегмента PSP
push ax ;записываем в стек 0000 (ax при загрузки равен 0000) - это смещение инструкции INT 20h в PSP
   ...

retf ;переход по ранее записанному адресу к инструкции INT 20h


Автор: 500mhz 14.4.2011, 12:51
кстате после смены видеорежима ну к примеру на 320*200 при возврате в дос он какбэ не обязан востанавливаться. нужно принудительно сделать 0х3 режим

Автор: Dreamuchiy 14.4.2011, 21:01
Вобщем при принудительном режиме 0x3, тупо висит курсор моргая и на этом все

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