如何获得IP注册的价值?

时间:2013-07-14 15:36:48

标签: c cpu-registers

如何在IP程序中获取C注册的值? 例如,为了获得AXBX寄存器的值,我们有伪变量_AX and _BX。 是否有IP寄存器的伪变量? 或者还有其他方法吗? 注意:我需要IP寄存器的值,因为它存储了要执行的下一条指令的偏移地址?

1 个答案:

答案 0 :(得分:3)

你不能在普通的C中做到这一点,因为C没有CPU寄存器的概念。根据您使用的编译器,您需要使用:

  • 编译器内在;
  • 内联装配;或
  • 外部装配例程

检查编译器的文档,看看是否有可用的内在函数。假设没有可用的,某种类型的装配将是您唯一的选择。 x86没有直接读取IP寄存器的指令。相反,你需要使用类似call指令(存储堆栈中的下一个IP)来获取它。

这是在x86上获取IP的一种方法(AT& T语法):

.globl get_ip
get_ip:
    mov 0(%sp), %ax
    ret

然后在你的C代码中,你可以这样做:

uint16_t get_ip();
...
uint16_t ip = get_ip();

如果您的编译器支持内联汇编,那么您可以使用它在C源代码中编写get_ip函数,而不需要单独的汇编源文件。有关内联汇编的语法,请参阅编译器的文档(如果可用)。

上面当然假设您正在使用16位汇编,我假设您提到了问题中的寄存器AX,BX和IP。但是如果你想让它适用于32位代码,那么当然你需要将寄存器重命名为%esp%eax%eip,然后get_eip()返回uint32_t而不是uint16_t