2012-01-11 5 views
1

어셈블리에서 작성된 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 

문제는 프로그램이 올바른 방법으로 종료되지 않는다는 것입니다. 도스 박스는 단지 얼어 붙는다. 나는 디버거를 사용하여 무슨 일이 일어 났는지 이해하려고 시도했다. 그리고 프로그램은 단지 iretd이 수행 된 후에 무한 루프로 끝난다. 왜 이런 일이 생길까요? 어떻게하면 16 비트 DOS 응용 프로그램을 올바르게 종료 할 수 있습니까?

+0

'iretd'를'ret'로 변경해보십시오. –

+0

나는 이것을 이미 시도했습니다. 작동하지 않습니다. – Roman

+2

'mov ax, 4c00h' 다음에'int 21h'가 붙은 것은 어떨까요 (DOS 응용 프로그램을 종료 할 때 권장되는 방법입니다) –

답변

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

브렌든의 대답은 종료하는 방법을 보여줍니다하지만 (이 ... 아메리칸 등록에 무엇이든 될 것입니다)

당신이 종료 할 경우 오류 수준 정의되지 않은 잎 와 에러 레벨 0 :

mov ax,0x4c00 
int 0x21 

당신이 오류 레벨 1을 종료 하시겠습니까 경우

mov ax,0x4c01 
int 0x21 
관련 문제