[英]Illegal instruction in Assembly
我真的不明白為什么這個簡單的代碼在第一次嘗試中工作正常但是當把它放在一個過程中時,錯誤顯示:
NTVDM CPU遇到非法指令CS:db22 IP:4de4 OP:f0 ff ff ff ff
第一個代碼段工作得很好:
.model small
.stack 100h
.code
start:
mov ax,@data
mov ds,ax
mov es,ax
MOV AH,02H ;sets cursor up
MOV BH,00H
MOV DH,02
MOV DL,00
INT 10H
EXIT:
MOV AH,4CH
INT 21H
END
但是這會產生錯誤:
.model small
.stack 100h
.code
start:
mov ax,@data
mov ds,ax
mov es,ax
call set_cursor
PROC set_cursor near
MOV AH,02H ;sets cursor up
MOV BH,00H
MOV DH,02
MOV DL,00
INT 10H
RET
set_cursor ENDP
EXIT:
MOV AH,4CH
INT 21H
END
注意:Windows配置沒有任何問題。 我嘗試過很多樣本代碼,但效果很好
謝謝
你遺漏了一個JMP:
call set_cursor
jmp EXIT ; <== you forgot this part
PROC set_cursor near
發生了什么事情,在call set_cursor
,你會直接進入proc並再次執行它,然后當你點擊ret
它彈出堆棧然后你跳到了,嗯,誰知道呢?
編輯:正如其他人指出的那樣,你最好在主代碼結束后放置你的PROC
,而不是將它粘在中間並跳過它。 但你可能已經想到了:)
您應該在退出程序的部分之后移動程序的代碼(或遵循egrunin的建議)。
您的段錯誤的原因是在您第一次調用它之后,程序中的代碼會再次執行。 在第二次執行期間,代碼在RET
崩潰,因為堆棧上沒有有效的返回地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.