【问题标题】:Illegal instruction in Assembly汇编中的非法指令
【发布时间】:2010-04-15 16:24:42
【问题描述】:

我真的不明白为什么这个简单的代码在第一次尝试时就可以正常工作,但是当 将其放入程序中会显示错误:

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

谢谢

【问题讨论】:

  • @Natasha,我会更新你的问题标题,使其更具描述性,你会得到更好的回应:)
  • @Natasha:如果答案解决了您的问题,欢迎您接受。无需编辑问题。

标签: windows assembly x86 dos


【解决方案1】:

您遗漏了 JMP:

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

PROC set_cursor near

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

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

【讨论】:

  • 我的装配教授一直叫它“拉拉乐园”。当您没有特定的返回地址时,PC 会跳转到的神奇地方。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    相关资源
    最近更新 更多