我可以写 mov rax, 1
(7 字节编码 48, C7, C0, 01, 00, 00, 00),而不是写 mov eax, 1
(5字节编码B8,01,00,00,00)依赖自动
高位双字归零。
要将 RAX 复制到 R8,我可以在 mov r8, rax
(3 字节编码 49, 89, C0)或 mov r8d, eax
(3 字节编码41、89、C0)再次依赖于高位双字的自动归零。
有没有比另一种更喜欢一种复制方法的比例?
REX 前缀无法避免,因为 R8 是"new"寄存器之一,因此需要 REX.B。在这种情况下,是否应该尽量避免设置 REX.W 位?
最佳答案
如果您无论如何都需要 REX 前缀,那么其中设置的位并不重要。几乎所有 64 位指令都与其对应的 32 位指令一样快;异常(exception)包括常见的嫌疑人(乘法和除法)。
至于这两者中哪个更快:尽管依赖链更长,但第二种变体
mov eax, 1
mov r8d, eax
可能会更快,因为第二条指令可能会通过寄存器重命名来处理,不会产生延迟,也不会产生微操作。有一些不太明显的异常(exception)情况,其中寄存器重命名可能不会触发;使用微架构分析器来找到这些。在这种情况下,加载两个立即数可能会更好,因为它们可以并行执行。
关于assembly - 使用相同的小正数有效加载 RAX 和 R8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73084190/