代码之家  ›  专栏  ›  技术社区  ›  Natasha

程序集中的非法指令

  •  3
  • Natasha  · 技术社区  · 15 年前

    我真的不明白为什么这段简单的代码在第一次尝试时运行良好,但是当 如果将其放入一个过程中,错误将显示:

    NTVDM CPU遇到非法指令 CS:DB22 IP:4DE4操作:F0 FF 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 回复  |  直到 15 年前
        1
  •  10
  •   egrunin    15 年前

    你漏掉了一个JMP:

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

    之后发生了什么 call set_cursor ,然后进入进程并执行它 再一次 ,然后当你击中 ret 它会弹出堆栈,然后你跳到,嗯,谁知道呢?

    编辑: 正如其他人指出的,你最好 PROC 在你的主代码结束后,不要把它粘在中间,在它周围跳跃。但你可能已经知道了:)

        2
  •  4
  •   edgar.holleis    15 年前

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

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