Assembly 使用64位立即数的addq?

Assembly 使用64位立即数的addq?,assembly,add,x86-64,att,Assembly,Add,X86 64,Att,我尝试在汇编程序中添加一些值(amdat&T语法)。但是我有大的立即值(>32位)的问题 标记行返回以下gcc错误: 错误:“添加”的操作数类型不匹配 但是addq应该能够处理这个数字: 0000000 122446688(十六进制)=4869875336(十二进制) log2(4869875336)~33位(比64位小得多)。ADD不需要64位立即数,只有一个版本接受32位符号扩展的值,而您的第二个常量不符合该约束。请参阅指令集参考 注意:q后缀指定操作大小,而不是立即数的大小。这是一个64位

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

标记行返回以下gcc错误:

错误:“添加”的操作数类型不匹配

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

0000000 122446688(十六进制)=4869875336(十二进制)


log2(4869875336)~33位(比64位小得多)。

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


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

除了Jester所说的之外(没有双关语);有一种形式的
MOV
将64位立即数加载到64位GPR中。因此,您可以使用它首先将立即数加载到另一个GPR,然后将该GPR添加到
r10
。唯一接受64位立即数的指令是
movabs
    .globl f
    .type f, @function
f:
    movq %rdi, %r10
    addq $0x0000000000000008, %r10 # no problem
    addq $0x0000000122446688, %r10 # error
    movq %r10, %rax
    ret