我正在编写一个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位位移。
答案 0 :(得分:0)
刚刚在“英特尔开发人员手册”第1卷第70页中找到答案:
"通常,64位模式下的位移和即时消息不会扩展到64位。在有效地址计算期间,它们仍然限制为32位并进行符号扩展。但是,在64位模式下,支持64位位移和MOV指令的即时形式。"
在英特尔指令集参考手册第42页中:
"在64位模式下,ModR / M Disp32(32位位移)编码被重新定义为RIP + Disp32而不是仅位移。见表2-7。"
因此,disp32只能用于64位模式,以便与指令指针相对应。