簡體   English   中英

大會中的非法指導

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM