我有一个问题是正确终止用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)
结束 DOS 程序最正确的方法是使用“终止”DOS 功能;然后是足够的注释,以便人们了解此函数不会返回。
例如:
pleaseKillMeNow:
mov ah,0x4C ;DOS "terminate" function
int 0x21
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8661 次 |
| 最近记录: |