assembly 如何正确结束装配?

qzwqbdag  于 2023-01-09  发布在  其他
关注(0)|答案(3)|浏览(152)

我在正确终止汇编语言编写的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应用程序?

vyu0f0g1

vyu0f0g11#

Brendan的答案显示了如何退出,但未定义错误级别(它将是AL寄存器中的任何内容...)
如果您希望退出时错误级别为0:

mov ax,0x4c00
int 0x21

如果要退出时出现错误级别1:

mov ax,0x4c01
int 0x21
zmeyuzjn

zmeyuzjn2#

结束DOS程序最正确的方法是使用"终止" DOS函数;然后加上适当的注解,以便人们理解这个函数不会返回。
例如:

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

yks3o0rb3#

如果你想退出时没有任何特定的错误代码,这是要走的路:

mov ax,4C00h
int 21h

但是如果你想返回一个特定的错误代码,这是一个更好的方法:

; ...
ErrorCode db 0   ; set a default error code
; ...
mov ErrorCode,1h ; change the error code if needed
; ...
mov ah,4Ch       ; prepare to exit
mov al,ErrorCode ; and return the error code
int 21h

相关问题