调试指令IP指向0时的指针

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

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

链接地址: http://www.djcxy.com/p/14103.html

上一篇: Debugging Instruction Pointer when IP points to 0

下一篇: Stack allocation, padding, and alignment