【发布时间】:2014-05-20 14:18:37
【问题描述】:
我尝试在汇编程序中添加一些值(AMD AT&T 语法)。但我对大立即数(> 32 位)有问题。
.globl f
.type f, @function
f:
movq %rdi, %r10
addq $0x0000000000000008, %r10 # no problem
addq $0x0000000122446688, %r10 # error
movq %r10, %rax
ret
标记的行返回以下 gcc 错误:
错误:`add' 的操作数类型不匹配
但是 addq 应该可以处理这个数字:
0000000122446688(十六进制)= 4869875336(十进制)
和 log2(4869875336) ~ 33bit(比 64bit 小很多)。
【问题讨论】:
-
除了(不是双关语)杰斯特所说的;
MOV有一种形式,可以将 64 位立即数加载到 64 位 GPR 中。因此,您可以使用它首先将即时加载到另一个 GPR,然后将该 GPR 添加到r10。 -
唯一接受 64 位立即数的指令是
movabs