如何正确结束装配?

Rom*_*man 1 assembly dos

我有一个问题是正确终止用Assembly编写的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
Run Code Online (Sandbox Code Playgroud)

问题是,程序没有以正确的方式终止.DOSBox只是冻结了.我试图了解使用调试器会发生什么,并且看起来程序在iretd执行后最终会在无限循环中结束.为什么会这样?如何正确终止16位DOS应用程序?

小智 6

Brendan的答案显示了如何退出,但它保留了未定义的错误级别(它将是AL寄存器中的任何内容......)

如果要以错误级别0退出:

mov ax,0x4c00
int 0x21
Run Code Online (Sandbox Code Playgroud)

如果要退出错误级别1:

mov ax,0x4c01
int 0x21
Run Code Online (Sandbox Code Playgroud)


Bre*_*dan 5

结束 DOS 程序最正确的方法是使用“终止”DOS 功能;然后是足够的注释,以便人们了解此函数不会返回。

例如:

pleaseKillMeNow:
    mov ah,0x4C          ;DOS "terminate" function
    int 0x21
Run Code Online (Sandbox Code Playgroud)