macos - 插入 64 位英特尔 osx

标签 macos assembly x86-64

我想如下所示将 64 位地址压入堆栈,

__asm("pushq $0x1122334455667788");

但是我得到编译错误,我只能按以下方式推送,

__asm("pushq $0x11223344");

有人可以帮助我理解我的错误吗?

我是汇编新手,所以如果我的问题听起来很愚蠢,请原谅。

最佳答案

x86-64 有一些有趣的怪癖,即使您熟悉 32 位 x86 也不是很明显...

  1. 大多数指令只能采用 32 位立即数,如果在 64 位上下文中使用,它会被符号扩展为 64 位。 (指令编码只存储32位。)

    这意味着您可以使用 pushq 获取 0x0 - 0x7fffffff 范围内的立即值(即带正号的 32 位值用 0 位进行符号扩展)或 0xffffffff80000000 - 0xffffffffffffffff)(即用 1 位进行符号扩展的负符号 32 位值)。但是您不能使用超出此范围的值(因为它们无法在指令编码中表示)。

  2. mov 是一种特殊情况:有一种编码采用完整的 64 位立即操作数。因此 Daniel 的回答(这可能是您最好的选择)。

  3. 如果您真的不想损坏寄存器,您可以使用多次压入较小的值。但是,压入两个 32 位值这一显而易见的事情是行不通的。在 64 位世界中,push 将使用 64 位操作数(如果它是立即常量,请遵守上面的第 1 点)或 16 位操作数,但不能使用 32 位操作数(即使pushl %eax 无效)。因此,您最多只能进行 4 次 16 位推送:

    pushw $0x1122; pushw $0x3344; pushw $0x5566; pushw $0x7788

关于macos - 插入 64 位英特尔 osx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36521642/

相关文章:

macos - 如何为SublimeREPL创建键盘快捷方式

mysql - Mac Os rake 数据库 :create through error with qt and mysql dependence

linux - 十六进制数,括号中的寄存器在汇编中是什么意思?

objective-c - 添加对导入到 OS X 上钥匙串(keychain)的 X509 CA 证书的信任

mysql - MAMP phpmyadmin 数据库文件不在预期位置

c++ - 如何返回复杂的返回值?

assembly - 目标代码与机器代码

在 Fedora 16 上启动新安装的 Eclipse 时出现 java 错误

c++ - 在 gcc linux x86-64 C++ 中,(p+x)-x 是否总是为指针 p 和整数 x 生成 p

gcc - x86_64 中运行时代码替换的绝对寻址