我真的不明白为什么这个简单的代码在第一次尝试时工作正常但是什么时候
把它放在一个程序中,错误显示:
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,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时它弹出堆栈然后你跳到了,嗯,谁知道呢?
编辑:正如其他人指出的那样,你最好在主代码结束后放置你的PROC,而不是将它粘在中间并跳过它.但你可能已经想到了:)