Pet*_*des 6
用于g -save-temps
将编译器输出保存到文件中,以便您可以将行号与实际的 asm 行匹配。(或将您的 asm 放入.s
文件中以直接提供给as
)。
这就是mov rdi, eax
问题所在;问题是操作数,而不是助记符。
有几种不同的形式mov
(这可能就是为什么您会收到如此无用的错误消息1),但是对于两个操作数都采用通用整数 reg 的形式需要它们的大小相同。
要从 EAX 零扩展int fd = open(...)
到 RDI,请使用mov edi, eax
. 有关为什么这是零扩展指令的更多信息,
请参阅MOVZX 缺少 32 位寄存器到 64 位寄存器。
脚注 1:
GP 和段 regs、 mov to/from control regs、 mov to/from debug regs以及类似movq xmm, xmm/mem
的助记符需要与mov
with 和 AT&T 语法q
后缀消除歧义。请参阅AT&T 语法对其他助记符和操作数大小后缀之间的歧义有何作用?
此外,您可以优化 mov rsi, rsp
;sub rsi, 0x30
进入lea rsi, [rsp-0x30]
.
是的,x86-64 SysV 有一个红色区域,因此在用户空间中使用 RSP 以下最多 128 字节的空间是完全安全的,即使syscall
在 Linux 上也是如此。
如果不是这样,你会想要sub rsp, 0x30
/ mov rsi, rsp
。(但如果你想最终ret
,你需要撤消它以将 RSP 指向返回地址。)
更多推荐
不支持,指令,mov
发布评论