addq与64位immediates?

时间:2014-05-20 14:18:38

标签: assembly add x86-64 att

我尝试在汇编程序中添加一些值(AMD AT& T语法)。但是我有大的立即值(> 32bit)的问题。

    .globl f
    .type f, @function
f:
    movq %rdi, %r10
    addq $0x0000000000000008, %r10 # no problem
    addq $0x0000000122446688, %r10 # error
    movq %r10, %rax
    ret

标记的行返回以下gcc-error:

  

错误:“add'

”的操作数类型不匹配

但是addq应该能够处理这个数字:

0000000122446688(hex)= 4869875336(dec)

和log2(4869875336)~33bit(远小于64位)。

1 个答案:

答案 0 :(得分:9)

ADD不会立即采用64位,只有一个版本接受32位符号扩展一个,而您的第二个常量不符合该约束。请参阅指令集参考。

注意:q后缀指定操作大小,而不是immediate的大小。它是一个64位的加法,但操作数被编码为8或32位立即符号扩展。