大会中的非法指导

时间:2010-04-15 16:24:42

标签: windows assembly x86 dos

我真的不明白为什么这个简单的代码在第一次尝试时工作正常但是什么时候 把它放在一个错误显示的程序中:

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配置没有任何问题。我已经尝试了很多可以正常使用的示例代码

由于

2 个答案:

答案 0 :(得分:10)

你遗漏了JMP:

call set_cursor
jmp EXIT ; <== you forgot this part

PROC set_cursor near

正在发生的事情是call set_cursor之后,您将进入proc并再次执行 ,然后当您点击ret时,它会弹出堆栈你会跳到谁,谁知道?

编辑:正如其他人所指出的那样,最好在主代码结束后放置PROC,而不是将其粘在中间并跳过它。但你可能已经想到了这一点:)

答案 1 :(得分:4)

您应该在退出程序的部分之后移动程序代码(或遵循egrunin的建议)。

你的段错误的原因是你第一次调用它后,程序中的代码会再次执行。在第二次执行期间,代码在RET崩溃,因为堆栈上没有有效的返回地址。