作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试在汇编程序中添加一些值(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 错误:
Error: operand type mismatch for `add'
但是 addq 应该可以处理这个数字:
0000000122446688(十六进制)= 4869875336(十进制)
和 log2(4869875336) ~ 33bit(比 64bit 小很多)。
最佳答案
ADD
不采用 64 位立即数,只有一个版本接受 32 位符号扩展,而您的第二个常量不符合该约束。请参阅指令集引用。
注意:q
后缀指定操作大小,而不是立即数的大小。它是 64 位加法,但操作数编码为 8 或 32 位符号扩展立即数。
关于assembly - addq 与 64 位立即数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23762332/
我尝试在汇编程序中添加一些值(AMD AT&T 语法)。但我对大立即数(> 32 位)有问题。 .globl f .type f, @function f: movq %rdi
在下面的说明中,addq 是如何工作的?它只有一个操作数,书上声称它递增 %rdx,但 %rdx 不在这条指令中。我很困惑... 这来自《计算机系统:程序员视角》一书,第三版。 最佳答案 正如@Jes
我是一名优秀的程序员,十分优秀!