Цитата(Dreamuchiy @ 13.4.2011, 22:54 ) | | Помогите разобраться пожалуйста, я на x86 процах еще новичок совсем. Давно еще активно писал простые проги еще под проц z80, там выход осуществлялся просто командой ret |
Хотите идти в ногу со временем? 
Цитата(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
|
|