我尝试在汇编程序中添加一些值(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位)。
答案 0 :(得分:9)
ADD
不会立即采用64位,只有一个版本接受32位符号扩展一个,而您的第二个常量不符合该约束。请参阅指令集参考。
注意:q
后缀指定操作大小,而不是immediate的大小。它是一个64位的加法,但操作数被编码为8或32位立即符号扩展。