addq 与 64 位立即数?
Posted
技术标签:
【中文标题】addq 与 64 位立即数?【英文标题】:addq with 64bit immediates? 【发布时间】: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
【参考方案1】:
ADD
不采用 64 位立即数,只有一个接受 32 位符号扩展的版本,而您的第二个常量不符合该约束。请参阅指令集参考。
注意:q
后缀指定操作大小,而不是立即数的大小。它是 64 位加法,但操作数编码为 8 位或 32 位符号扩展立即数。
【讨论】:
以上是关于addq 与 64 位立即数?的主要内容,如果未能解决你的问题,请参考以下文章
x86_64 无法将 64 位值添加到 rax,“'add' 上的操作数不匹配”
x86_64 无法将 64 位值添加到 rax,“'add' 上的操作数不匹配”
(32位汇编 五)mov/add/sub/and/or/xor/not
2018-2019-1 20165231 《信息安全系统设计基础》第四周学习总结