一千萬個為什麽

搜索

大會中的非法指導

我真的不明白為什麽這個簡單的代碼在第一次嘗試時工作正常但是什麽時候 把它放在一個程序中,錯誤顯示:

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

發生的事情是,在調用set_cursor 之後,你將進入proc並再次執行 ,然後當你點擊 ret 它彈出堆棧,你跳到,嗯,誰知道?

Edit: As someone else pointed out, you're better off putting your PROC after your main code ends, instead of sticking it in the middle and jumping around it. But you've probably figured that out already :)

轉載註明原文: 大會中的非法指導