0

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

4

1 回答 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%eipget_eip()然后返回 auint32_t而不是uint16_t.

于 2013-07-14T15:49:27.673 回答