假设您正在运行一个在处理器上启用了中断处理的程序。指令指针指向零。我们如何知道导致指令指针指向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”对。

调试方法包括用断点平分代码,直到您运行下一条指令导致错误为止。检查堆栈应该知道最后执行的功能是什么。有时堆栈仍然有效以显示完整的回调跟踪。

07-24 09:44
查看更多