“mov eax, 0x1” 能否始终代替“mov rax, 0x1”?

7
当使用nasm组装此代码时:
BITS 64
mov eax, 0x1
mov rax, 0x1

我得到了这个输出:
b8 01 00 00 00 b8 01 00 00 00

这是将 mov eax, 0x1 重复两次的操作码。

这是否意味着 mov rax, 0x1 总是可以被 mov eax, 0x1 替换,还是只有在这种情况下才能替换?

如果正确的话,使用它会比以下代码更好:

xor rax, rax
inc rax

因为在汇编时,mov eax, 0x1只有5个字节,而mov rax, 0x1在组合时需要6个字节。

1
相关内容:https://dev59.com/4l7Va4cB1Zd3GeqPIUcb - Jens Björnhager
4
因为第一个片段正确,所以第二个片段只需要4个字节(不需要REX前缀)。 - harold
1
xor eax, eax / inc eax 是4B,比 mov eax, 1 稍微小一点。但是除非你在大量优化代码大小,否则不要使用它。对于现代CPU来说,花费1个字节来节省一条指令(和一个融合域uop)是值得的。 - Peter Cordes
你可以使用[mov rax,strict dword/qword 1](https://dev59.com/2Kjka4cB1Zd3GeqPDsAH#48597025)来强制使用7/10字节版本的mov。 - phuclv
1个回答

8

始终如此。大多数(如果不是全部)32位MOV和ALU操作都会清除目标寄存器操作数中32到63位的位。有关详细信息,请参阅CPU手册。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接