BEl*_*lgy 0 assembly x86-64 gnu-assembler immediate-operand
我正在尝试组装一些 64 位代码,但组装失败了:
addq $0xffffff7fc0005000, %rax
Run Code Online (Sandbox Code Playgroud)
有错误:
`add' 的错误操作数类型不匹配
第一个操作数是一个 64 位值,后者是一个应该组装好的寄存器。该指令前面有一个.code64伪操作。我正在组装
x86_64-elf-as test.s -o test.o --64
Run Code Online (Sandbox Code Playgroud)
至于汇编器本身,当用--version它调用时返回:
GNU assembler (GNU Binutils) 2.32
Copyright (C) 2019 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `x86_64-elf'.
Run Code Online (Sandbox Code Playgroud)
第一个操作数是一个 64 位值,后者是一个应该组装好的寄存器。
不应该,64 位版本add可以采用 8 位或 32 位符号扩展立即数,但不能采用 64 位立即数,这在 x64 中通常很少见。这可以通过查看英特尔软件开发人员手册或其他各种地方来验证,例如这个 ADD 引理的在线副本。
可以采用完整 64 位立即数(不是 32 位符号扩展)的唯一指令是mov. (或者movabs就像 GAS 喜欢称这个变体一样,尽管使用大的数字常量mov $0x123456789abc, %rcx 会选择必要的编码,而不是截断数字)。
通常,您会将mov64 位立即数放入寄存器中,然后使用它。
另一种选择是将值放入内存中并在add内存操作数中使用它。