当前位置: 首页 > 面试题库 >

查找哪些汇编指令导致了非法指令错误,而无需调试

白刚洁
2023-03-14
问题内容

运行我用汇编语言编写的程序时,Illegal instruction出现错误。是否有一种方法可以知道导致错误的指令,而无需进行调试,因为我所运行的计算机没有调试器或任何开发系统。换句话说,我在一台机器上编译并在另一台机器上运行。我无法在正在编译的计算机上测试程序,因为它们不支持SSE4.2。我运行程序的机器仍然支持SSE4.2指令。

我认为这可能是因为我需要告诉汇编器(YASM)识别SSE4.2指令,就像我们通过向gcc传递-msse4.2标志一样。还是您认为这不是原因?知道如何告诉YASM识别SSE4.2指令吗?

也许我应该捕获SIGILL信号,然后对SA_SIGINFO进行解码,以查看程序执行了哪种非法操作。


问题答案:

实际上,您经常会收到非法指令错误,这不是因为您的程序包含非法操作码,而是因为您的程序中存在一个错误(例如,缓冲区溢出),该错误使您的程序跳转到具有纯数据或代码的随机地址中,而没有跳转到操作码的开始。



 类似资料:
  • 伪指令 DW 定义字(2字节). PROC 定义过程. ENDP 过程结束. SEGMENT 定义段. ASSUME 建立段寄存器寻址. ENDS 段结束. END 程序结束.

  • 串指令 DS:SI 源串段寄存器 :源串变址. ES:DI 目标串段寄存器:目标串变址. CX 重复次数计数器. AL/AX 扫描值. D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量. Z标志 用来控制扫描或比较操作的结束. MOVS 串传送. ( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. ) CMPS 串比较. ( CMPSB 比较字符. CMPSW

  • 算术运算指令 ADD 加法. ADC 带进位加法. INC 加 1. AAA 加法的ASCII码调整. DAA 加法的十进制调整. SUB 减法. SBB 带借位减法. DEC 减 1. NEC 求反(以 0 减之). CMP 比较.(两操作数作减法,仅修改标志位,不回送结果). AAS 减法的ASCII码调整. DAS 减法的十进制调整. MUL 无符号乘法. IMUL 整数乘法. 以上两条,结

  • 数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD

  • 逻辑运算指令 AND 与运算. OR 或运算. XOR 异或运算. NOT 取反. TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果). SHL 逻辑左移. SAL 算术左移.(=SHL) SHR 逻辑右移. SAR 算术右移.(=SHR) ROL 循环左移. ROR 循环右移. RCL 通过进位的循环左移. RCR 通过进位的循环右移. 以上八种移位指令,其移位次数可达255次. 移

  • 程序转移指令 1>无条件转移指令 (长转移) JMP 无条件转移指令 CALL 过程调用 RET/RETF过程返回. 2>条件转移指令 (短转移,-128到+127的距离内) ( 当且仅当(SF XOR OF)=1时,OP1循环控制指令(短转移) LOOP CX不为零时循环. LOOPE/LOOPZ CX不为零且标志Z=1时循环. LOOPNE/LOOPNZ CX不为零且标志Z=0时循环. JCX