如何IP
在我的程序中获取寄存器 的值C
?例如,为了获取AX
和BX
寄存器的值,我们有伪变量_AX and _BX
。IP
寄存器也有伪变量吗?还是有其他方法?注意:我需要IP
寄存器的值,因为它存储要执行的下一条指令的偏移地址?
问问题
1136 次
1 回答
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();
如果您的编译器支持内联汇编,那么您可以使用它get_ip
在 C 源代码中编写函数,而不需要单独的汇编源文件。如果可用,请查阅有关内联汇编语法的编译器文档。
上面当然假设您正在使用 16 位程序集,我假设这是因为您在问题中提到了寄存器 AX、BX 和 IP。但是,如果您希望这适用于 32 位代码,那么您当然需要将寄存器重命名为%esp
、%eax
和%eip
,get_eip()
然后返回 auint32_t
而不是uint16_t
.
于 2013-07-14T15:49:27.673 回答