如何正确结束组装?

发布于 2024-12-26 02:46:49 字数 437 浏览 1 评论 0原文

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

I have a problem correctly terminating a 16bit DOS program written in Assembly. Here's part of code:

.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

The problem is, that the program doesn't terminate in a correct way. DOSBox just freezes. I tried to understand what happens using debugger, and it seems the program just ends up in an infinite loop after iretd is performed. Why does this happen? How can do I terminate a 16bit DOS app correctly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

兲鉂ぱ嘚淚 2025-01-02 02:46:50

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

如果您想以错误级别 0 退出:

mov ax,0x4c00
int 0x21

如果您想以错误级别 1 退出:

mov ax,0x4c01
int 0x21

Brendan's answer shows how to exit but it leaves the error level undefined (it will be whatever is in the AL register...)

If you want to exit with error level 0:

mov ax,0x4c00
int 0x21

If you want to exit with error level 1:

mov ax,0x4c01
int 0x21
如梦亦如幻 2025-01-02 02:46:50

结束DOS程序最正确的方法是使用“终止”DOS功能;接下来是足够的注释,以便人们明白这个函数不会返回。

例如:

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

The most correct way to end a DOS program is to use the "terminate" DOS function; followed by adequate comments so that people understand that this function won't return.

For example:

pleaseKillMeNow:
    mov ah,0x4C          ;DOS "terminate" function
    int 0x21
甜尕妞 2025-01-02 02:46:50

如果您想在没有任何特定错误代码的情况下退出,则可以这样做:

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

If you want to exit without any particular error code this is the way to go:

mov ax,4C00h
int 21h

But if you want to return a particular error code, this is a better way:

; ...
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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文