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

时间:2018-10-10 06:28:35

标签: assembly x86

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

它出现的代码行是:

cmpb %rdi, $0

1 个答案:

答案 0 :(得分:1)

在AT&T语法(即您所使用的语法)中,指令具有 size后缀来指示操作数的大小。大小后缀为:

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

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