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