假设您正在运行一个在处理器上启用中断处理的程序。指令指针指向零。如何才能知道指令指针指向0的原因。
我不清楚是否与ISR的位置有关?据我所知,在某些处理器中,IP=0表示重置地址。但为什么正在运行的程序会转到该地址呢?
导致IP指向0的原因可能是什么?
最佳答案
基本上所有jmp
指令和ret
都可以跳转到0。示例:
jnz 0 ;; encoded as relative jump JNZ -(next IP)
jmp 00000000 ;; absolute jump
mov ebx, 0
jmp ebx ;; indirect jump
call 0
mov ecx,0
push ecx
ret ;; jump through stack
在 C 中,我们可以(尝试)跳过 NULL/未初始化的函数指针,以及破坏堆栈。一些深奥的技巧是插入一个异常处理程序(信号)以指向 null,或使用 longjmp。
在 x86 架构(实模式)中,指向中断处理程序的指针从地址 0:0 开始,但不会跳转到那里。相反,该表包含要间接跳转的“segment:offset”对。
调试方法包括使用断点将代码一分为二,直到运行的下一条指令导致错误。检查堆栈应该知道最后执行的函数是什么。有时堆栈仍然有效以显示完整的回调跟踪。
关于c - 当IP指向0时调试指令指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22395267/