Как правильно завершить сборку? - PullRequest
1 голос
/ 11 января 2012

У меня проблема с корректным завершением работы 16-битной программы DOS, написанной на ассемблере.Вот часть кода:

.386P
.model flat

stack_s segment stack 'stack' 
        db 256 dup(0)
stack_s ends

data segment use16
data ends

code segment 'code' use16
assume cs:code, ds:data

main proc
    mov ax, data
    mov ds, ax

    iretd
main endp

code ends
end main

Проблема в том, что программа не завершается корректно.DOSBox просто зависает.Я попытался понять, что происходит с помощью отладчика, и кажется, что программа просто заканчивается бесконечным циклом после выполнения iretd.Почему это происходит?Как правильно завершить 16-битное приложение DOS?

Ответы [ 2 ]

6 голосов
/ 01 июля 2015

Ответ Брендана показывает, как выйти, но оставляет уровень ошибки неопределенным (это будет все, что есть в регистре AL ...)

Если вы хотите выйти с уровнем ошибки 0:

mov ax,0x4c00
int 0x21

Если вы хотите выйти с уровнем ошибки 1:

mov ax,0x4c01
int 0x21
3 голосов
/ 23 ноября 2012

Самый правильный способ завершить программу DOS - использовать функцию DOS «завершить»; сопровождаемые адекватными комментариями, чтобы люди понимали, что эта функция не вернется.

Например:

pleaseKillMeNow:
    mov ah,0x4C          ;DOS "terminate" function
    int 0x21
...