我想将 64 位地址压入堆栈,如下所示,
__asm("pushq $0x1122334455667788");
但我得到编译错误,我只能按以下方式推送,
__asm("pushq $0x11223344");
有人可以帮助我理解我的错误吗?
我是装配新手,所以如果我的问题听起来很愚蠢,请原谅。
x86-64 有一些有趣的怪癖,即使您熟悉 32 位 x86,这些怪癖也并不明显......
-
大多数指令只能采用 32 位立即值,如果在 64 位上下文中使用,则该值会符号扩展为 64 位。 (指令编码仅存储 32 位。)
这意味着您可以使用pushq
对于范围内的立即值0x0
- 0x7fffffff
(即用 0 位进行符号扩展的正符号 32 位值)或0xffffffff80000000
- 0xffffffffffffffff
)(即用 1 位进行符号扩展的负符号 32 位值)。但是您不能使用此范围之外的值(因为它们无法在指令编码中表示)。
mov
是一种特殊情况:有一种编码需要完整的 64 位立即数操作数。因此丹尼尔的答案(这可能是你最好的选择)。
-
If you really不想损坏寄存器,您可以使用多次推送较小的值。然而,推入两个 32 位值的明显做法是行不通的。在 64 位世界中,push
可以使用 64 位操作数(如果是立即数,则遵守上面的第 1 点)或 16 位操作数,但不能使用 32 位操作数(甚至pushl %eax
无效)。所以你能做的最好的就是 4 次 16 位推送:
pushw $0x1122; pushw $0x3344; pushw $0x5566; pushw $0x7788
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)