2012-01-11 56 views
1

我有一個問題正確地終止了用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

嘗試將'iretd'更改爲'ret' – 2012-01-11 15:19:00

+0

我試過這樣做了。它不起作用。 – Roman 2012-01-11 15:28:06

+2

'mov ax,4c00h'後面跟着'int 21h'(這是推薦的終止DOS應用程序的方法) – 2012-01-11 15:35:45

回答

3

結束DOS程序最正確的方法是使用「終止」DOS函數;其次是適當的評論,以便人們瞭解這個功能不會返回。

例如:

pleaseKillMeNow: 
    mov ah,0x4C   ;DOS "terminate" function 
    int 0x21 
         ;This is the end, 
         ;Beautiful friend 
         ;This is the end, 
         ;My only friend, the end 
5

布倫丹的回答顯示瞭如何退出,但它留下的錯誤級別未定義(這將是無論是在AL寄存器...)

如果你想退出與錯誤級別0:

mov ax,0x4c00 
int 0x21 

如果你想與錯誤級別1退出:

mov ax,0x4c01 
int 0x21