我有一个问题是正确终止用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应用程序?
答案 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