0

I am trying to assemble some 64-bit code and the assembling fails on the line:

addq $0xffffff7fc0005000, %rax

with the error:

Error operand type mismatch for `add'

The first operand is a 64-bit value and the latter a register which should assemble fine. This instruction is preceded by a .code64 pseudo-op. I am assembling with

x86_64-elf-as test.s -o test.o --64

As for the assembler itself, when called with --version it 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'.
4

1 回答 1

5

第一个操作数是一个 64 位的值,而后者是一个可以正常组装的寄存器。

不应该,64 位版本add可以采用 8 位或 32 位符号扩展立即数,但不能采用 64 位立即数,这在 x64 中通常很少见。这可以通过查看英特尔软件开发人员手册或其他各种地方来验证,例如ADD lemma 的在线副本

唯一可以采用完整 64 位立即数(不是 32 位符号扩展)的指令是mov. (或者movabs因为 GAS 喜欢称这个变体,尽管使用大的数字常量mov $0x123456789abc, %rcx 会选择必要的编码,而不是截断数字)。

通常,您会将mov64 位立即数放入寄存器,然后使用它。

另一种选择是将值放入内存中并在add带有内存操作数的情况下使用它。

于 2019-10-06T16:20:03.097 回答