2012-01-11 2 views
1

У меня проблема с правильной завершением 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 правильно?

+0

Попробуйте изменить 'iretd' на' ret' –

+0

Я уже пытался это сделать. Это не работает. – Roman

+2

Как насчет 'mov ax, 4c00h', за которым следует' int 21h' (это рекомендуемый способ прекращения приложения DOS) –

ответ

3

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

Например:

pleaseKillMeNow: 
    mov ah,0x4C   ;DOS "terminate" function 
    int 0x21 
         ;This is the end, 
         ;Beautiful friend 
         ;This is the end, 
         ;My only friend, the end 
5

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

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

mov ax,0x4c00 
int 0x21 

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

mov ax,0x4c01 
int 0x21