![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 | |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]() Цитата:
А еще я видел "умников", которые в качестве конца программы использовали команду hlt Извратные и не очень способы выйти из программы в DOS 1) Функция DOS 00H: завершить программу Вход AH = 00H CS = сегмент PSP завершающегося процесса Выход нет = (неприменим) Описание: передает управление на вектор завершения в PSP (выходит в родительский процесс). Идентична функции INT 20H Terminate. регистр CS должен указывать на PSP. восстанавливает векторы прерываний DOS 22H-24H (завершение, Ctrl-Break и Критическая ошибка), устанавливая значения, сохраненные в родительском PSP. выполняет сброс файловых буферов. файлы должны быть предварительно закрыты, если их длина изменилась. Замечание: Проще и более аккуратно - использовать функцию DOS 4Ch Exit. 2) Функция DOS 4Ch: завершить программу -- EXIT Вход AH = 4Ch AL = код выхода Выход нет = (неприменим) Описание: возвращает управление от порожденного процесса его родителю, устанавливая код выхода, который можно опросить функцией 4dH WAIT. Управление передается по адресу завершения в PSP завершающейся программы. векторы Ctrl-Break и Critical Error восстанавливаются к старым адресам, сохраненнмы в родительском PSP. Замечание: значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода выхода самой последней программы. 3) INT 20h: завершить программу. Это прерывание используется для выхода из программы и возврата управления родительскому процессу (обычно интерпретатору команд DOS - COMMAND.COM). Оно восстанавливает значения управляющих векторов INT 22h INT 23h INT 24h. Оно также сбрасывает все файловые буфера (если длина файла изменилась, то файл должен быть предварительно закрыт). Важно: Регистр CS должен содержать значение PSP завершающегося процесса. Если ваш CS не равен PSP, вы можете выдать JMP или RET на PSP:0000. Рекомендуется использовать функцию 4Ch Terminate, чтобы избежать трудностей, связанных с неравенством CS и PSP. Она позволяет также задать код выхода. Программы COM-формата обычно выполняются при CS=PSP, так что им можно выдавать INT 20h в любой момент. EXE-программы могут выдавать FAR JMP или FAR RET, чтобы передать управление на PSP:0000, где содержится инструкция INT 20h. 4) Для COM- программ CS=DS=ES=SS SP=0FFFEh SS:[0FFFE]=0 CS:[0000]=0CD20h поэтому первая команда RETN (если до этого ничего не посылалось в стек) приведет к вызову int 20h (код CD20) что вызовет завершение программы 5) Для EXE-программ до установки DS на сегмент данных DS=PSP а PSP:[0000]=CD20 и чтобы перейти на этот адрес нужно предварительно загнать в стек PSP и 0 и сделать RETF или, как варианты, JMP FAR или CALL FAR по адресу PSP:[0000] 6) команда iret которая сделает IP=0 и вытащит из стека PSP (предварительно помещенные в стек) еще и поместит в регистр флагов непонятно что хотя закрываемой программе это уже будет "до лампочки" |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Простейшие циклы. | margarit | Паскаль, Turbo Pascal, PascalABC.NET | 5 | 13.01.2011 11:55 |
Простейшие циклы. | Wild_klas | Помощь студентам | 2 | 08.11.2010 18:13 |
Простейшие вычисления | AcidBurst | Помощь студентам | 3 | 01.11.2010 10:48 |
Простейшие циклы. | tema654 | Помощь студентам | 0 | 11.10.2010 22:51 |
Простейшие задачки | zoza1 | Общие вопросы Delphi | 1 | 11.09.2009 21:10 |