ASM:“cmp”的操作数类型不匹配

Tyr*_*son 3 x86 assembly

我正在执行 x86 汇编代码,并且不断收到此错误:`cmp's 的操作数类型不匹配

它出现的代码行是:

cmpb %rdi, $0
Run Code Online (Sandbox Code Playgroud)

fuz*_*fuz 5

在 AT&T 语法(您使用的语法)中,指令有一个大小后缀来指示操作数的大小。尺寸后缀为:

b byte        1 bytes
w word        2 bytes
l long        4 bytes
q quad-word   8 bytes

s single      4 bytes
d double      8 bytes
t temporary  10 bytes
Run Code Online (Sandbox Code Playgroud)

例如,cmpb是指示cmp具有 1 字节操作数大小的指令。但是,您的代码%rdi用作操作数,它是一个四字(64 位)寄存器,因此汇编程序正确地抱怨这是错误的操作数。

要解决此问题,只需省略大小后缀即可;除非所有操作数都是立即数或内存操作数,否则汇编程序能够推断出它:

cmp %rdi, $0
Run Code Online (Sandbox Code Playgroud)

您当然也可以明确提供大小后缀;在这种情况下,q如上表所示是合适的:

cmpq %rdi, $0
Run Code Online (Sandbox Code Playgroud)

也就是说,请注意,与大多数指令一样,立即操作数必须是第一个操作数cmpq

cmpq $0, %rdi
Run Code Online (Sandbox Code Playgroud)

另一种形式实际上是非法的。

  • `cmp %rdi, $0` 仍然是非法的:x86 只允许 `cmp` http://felixcloutier.com/x86/CMP.html 的直接右侧(Intel 语法),所以只有 `cmp $0, %rdi`在 AT&T 中是允许的。如果要在相反方向进行比较,则需要寄存器中的常量。(对于“0”无关紧要,无论如何都应该使用“test %rdi,%rdi”;两个方向都不能进位或溢出,因此您始终可以使用相反的条件,例如 jge 而不是 jl) (2认同)