x86_64 无法将 64 位值添加到 rax,"operand mismatch on 'add'"
x86_64 Cannot add 64 bit value to rax, "operand mismatch on 'add'"
我正在尝试 assemble 一些 64 位代码,但汇编失败了:
addq [=12=]xffffff7fc0005000, %rax
错误:
Error operand type mismatch for `add'
第一个操作数是一个 64 位值,而后者是一个寄存器,应该 assemble 没问题。该指令前面有一个 .code64
伪操作。我正在组装
x86_64-elf-as test.s -o test.o --64
至于 assembler 本身,当用 --version
调用时 returns:
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'.
The first operand is a 64bit value and the latter a register which should assemble fine.
不应该,add
的 64 位版本可以采用 8 位或 32 位符号扩展立即数,但不能采用 64 位立即数,这在 x64 中通常很少见。这可以通过查看英特尔软件开发人员手册或其他各种地方来验证,例如 this online copy of the ADD lemma.
唯一可以采用完整 64 位立即数(不是 32 位符号扩展)的指令是 mov
。(或 movabs
因为 GAS 喜欢调用这个变体,尽管有一个大的数字常量 mov [=13=]x123456789abc, %rcx
,而不是截断数字)。
通常你会 mov
一个 64 位立即数到一个寄存器然后使用它。
另一种选择是将值放在内存中,并在带有内存操作数的 add
中使用它。
我正在尝试 assemble 一些 64 位代码,但汇编失败了:
addq [=12=]xffffff7fc0005000, %rax
错误:
Error operand type mismatch for `add'
第一个操作数是一个 64 位值,而后者是一个寄存器,应该 assemble 没问题。该指令前面有一个 .code64
伪操作。我正在组装
x86_64-elf-as test.s -o test.o --64
至于 assembler 本身,当用 --version
调用时 returns:
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'.
The first operand is a 64bit value and the latter a register which should assemble fine.
不应该,add
的 64 位版本可以采用 8 位或 32 位符号扩展立即数,但不能采用 64 位立即数,这在 x64 中通常很少见。这可以通过查看英特尔软件开发人员手册或其他各种地方来验证,例如 this online copy of the ADD lemma.
唯一可以采用完整 64 位立即数(不是 32 位符号扩展)的指令是 mov
。(或 movabs
因为 GAS 喜欢调用这个变体,尽管有一个大的数字常量 mov [=13=]x123456789abc, %rcx
通常你会 mov
一个 64 位立即数到一个寄存器然后使用它。
另一种选择是将值放在内存中,并在带有内存操作数的 add
中使用它。