Assembly 使用64位立即数的addq?
我尝试在汇编程序中添加一些值(amdat&T语法)。但是我有大的立即值(>32位)的问题 标记行返回以下gcc错误: 错误:“添加”的操作数类型不匹配 但是addq应该能够处理这个数字: 0000000 122446688(十六进制)=4869875336(十二进制)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位
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