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 《信息安全系统设计基础》第四周学习总结

这个x86-64 addq指令是什么意思,它只有一个操作数? (来自CSAPP第3版)

x64 浮点混合