- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
阅读后this stack overflow answer , 和 this document ,我还是不明白 movq
的区别和 movabsq
.
我目前的理解是在 movabsq
,第一个操作数是 64 位立即数操作数,而 movq
对 32 位立即数操作数进行符号扩展。从上面引用的第二个文件中:
Moving immediate data to a 64-bit register can be done either with the
movq
instruction, which will sign extend a 32-bit immediate value, or with themovabsq
instruction, when a full 64-bit immediate is required.
Interesting experiment:
movq $0xFFFFFFFF, %rax
is probably not encodeable, because it's not representable with a sign-extended 32-bit immediate, and needs either the imm64 encoding or the%eax
destination encoding.(editor's note: this mistaken assumption is fixed in the current version of that answer).
.section .rodata
str:
.string "0x%lx\n"
.text
.globl main
main:
pushq %rbp
movq %rsp, %rbp
movl $str, %edi
movq $0xFFFFFFFF, %rsi
xorl %eax, %eax
call printf
xorl %eax, %eax
popq %rbp
ret
$ clang file.s -o file && ./file
版画
0xffffffff
. (对于较大的值,这类似,例如,如果您添加一些额外的“F”)。
movabsq
生成相同的输出。
movabsq
还有好处吗?在
movq
?
最佳答案
填充 64 位寄存器有三种移动:
B8 +rd id
, 5 个字节mov eax, 241
/mov[l] $241, %eax
移动到低 32 位部分将使高部分归零。48 B8 +rd io
, 10 字节mov rax, 0xf1f1f1f1f1f1f1f1
/mov[abs][q] $0xf1f1f1f1f1f1f1f1, %rax
移动一个完整的 64 位立即数。48 C7 /0 id
, 7 个字节mov rax, 0xffffffffffffffff
/mov[q] $0xffffffffffffffff, %rax
将有符号的 32 位立即数移动到完整的 64 位寄存器。movq
用于第二种和第三种情况。
movabs[q]
总是对应于(2)。
mov[q]
对应于情况(a)和(d)的(3),对应于其他情况的(2)。
mov[l] $0xffffffff, %edi
这是等效的(我相信 GAS 不会将移动到 64 位寄存器转换为一个到其较低的 32 位寄存器,即使这是等效的)。
mov
指令从未被分成两种形式来解释(1)和(3),而是单个
mov
与汇编器一起使用时几乎总是选择 (1) 而不是 (3)。
关于assembly - x86-64 AT&T 指令 movq 和 movabsq 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52434073/
阅读后this stack overflow answer , 和 this document ,我还是不明白 movq 的区别和 movabsq . 我目前的理解是在 movabsq ,第一个操作数
我是一名优秀的程序员,十分优秀!