64位指令中的C ++指针

时间:2016-04-11 14:17:59

标签: c++ pointers assembly jit instructions

我正在编写一个jit编译器(仅限64位,Windows)。我需要通过引用(指针)来访问c ++程序的变量。

示例:使用以下指令将32位整数从内存添加到32位寄存器:

opcode "03 /r" : ADD r32, m32. (valid in 64bit mode)

不幸的是,这要求一个32位的位移,但我(只?)有一个指向c ++变量的64位指针。

我的问题:有没有办法从64位c ++指针获得32位位移?

如果没有,更一般地说,我将如何处理c ++变量?

我还尝试将指针值移动到rax并使用间接地址[rax]。这似乎也不起作用。

我看过一些dis-assembly(clang),它似乎使用了RIP(相对指令指针),比如

mov dword ptr [rip + test], 2358

这似乎很奇怪,因为每条指令都会改变rip(据我所知)。

任何指向正确方向的人都会非常感激。

编辑:间接地址,[rax],现在正在运行!我在c ++中有一个错误。仍然没有运气的32位位移。

1 个答案:

答案 0 :(得分:0)

刚刚在“英特尔开发人员手册”第1卷第70页中找到答案:

"通常,64位模式下的位移和即时消息不会扩展到64位。在有效地址计算期间,它们仍然限制为32位并进行符号扩展。但是,在64位模式下,支持64位位移和MOV指令的即时形式。"

在英特尔指令集参考手册第42页中:

"在64位模式下,ModR / M Disp32(32位位移)编码被重新定义为RIP + Disp32而不是仅位移。见表2-7。"

因此,disp32只能用于64位模式,以便与指令指针相对应。