如何正确结束装配?

时间:2012-01-11 15:15:13

标签: 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

问题是,程序没有以正确的方式终止。 DOSBox只是冻结了。我试图理解使用调试器会发生什么,似乎程序在iretd执行后才会进入无限循环。为什么会这样?如何正确终止16位DOS应用程序?

2 个答案:

答案 0 :(得分:6)

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

如果要退出错误级别0:

mov ax,0x4c00
int 0x21

如果要退出错误级别1:

mov ax,0x4c01
int 0x21

答案 1 :(得分:3)

结束DOS程序最正确的方法是使用“终止”DOS函数;然后是充分的评论,以便人们明白这个功能不会返回。

例如:

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