c - 当IP指向0时调试指令指针

标签 c assembly operating-system x86

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

相关文章:

networking - 数据包IP识别生成

architecture - 如何通过WMI确定操作系统平台?

c - 将正 double 型强制转换为 unsigned int 实现是已定义的还是可移植的?

c - 结构指针总是被初始化为 nil

c - C语言解析文本文件——跳行——重复计算

c - 打破从 fifo channel 读取的 while 循环

assembly - 如何替换Nasm程序中的特定字符

c++ - printf 如何知道格式参数的长度?

linux - 许可和使用 Linux 内核

assembly - GDB 不从 NASM 加载源代码行