【发布时间】:2014-03-14 02:51:55
【问题描述】:
假设您正在运行一个在处理器上启用了中断处理的程序。指令指针指向零。我们如何才能知道导致指令指针指向 0 的原因。
我不清楚这是否与 ISR 的位置有关?据我所知,在某些处理器中,IP=0 表示重置地址。但是为什么一个正在运行的程序会去那个地址呢?
导致 IP 指向 0 的全部原因可能是什么?
【问题讨论】:
标签: c assembly operating-system x86
假设您正在运行一个在处理器上启用了中断处理的程序。指令指针指向零。我们如何才能知道导致指令指针指向 0 的原因。
我不清楚这是否与 ISR 的位置有关?据我所知,在某些处理器中,IP=0 表示重置地址。但是为什么一个正在运行的程序会去那个地址呢?
导致 IP 指向 0 的全部原因可能是什么?
【问题讨论】:
标签: c assembly operating-system x86
基本上所有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”对间接。
调试方法包括二等分带有断点的代码,直到您运行的下一条指令导致您的错误。检查堆栈应该知道最后执行的函数是什么。有时堆栈仍然有效以显示完整的回调跟踪。
【讨论】: