4

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

它出现的代码行是:

cmpb %rdi, $0
4

1 回答 1

7

在 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

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

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

cmp %rdi, $0

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

cmpq %rdi, $0

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

cmpq $0, %rdi

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

于 2018-10-10T09:40:19.683 回答