【发布时间】:2014-01-15 14:56:14
【问题描述】:
x64 寄存器是否可互换,从某种意义上说,任何与它们的一种组合一起工作的指令都可以与其他任何组合一起工作?除了名称之外,是否存在性能差异或任何其他考虑因素使它们彼此不同?
【问题讨论】:
-
我实际上不确定,但查看Intel manuals 会有很大帮助。它们读起来有点大,但它们会告诉您每条指令可以/不能做的所有事情,并提供优化建议。
x64 寄存器是否可互换,从某种意义上说,任何与它们的一种组合一起工作的指令都可以与其他任何组合一起工作?除了名称之外,是否存在性能差异或任何其他考虑因素使它们彼此不同?
【问题讨论】:
没有。尽管大多数 x86 和 x86_64 指令都可以使用任何寄存器作为 GPR,但有些指令仅适用于特定寄存器或一组寄存器,例如 movabs、mul、div...
有关隐式寄存器使用的更多详细信息,请阅读here
另见Are the data registers EAX, EBX, ECX and EDX interchangeable
【讨论】:
#SS 异常而不是 #GP . 64 位模式将 SS 和 DS 的段基数固定为 0,并完全忽略 SS 和 DS 段覆盖前缀。见Why is the use of the 'DS:' segment override illegal in 64-bit mode?。但是,是的,这确实意味着[rbp + rdi*1 + 0] 在所有可能的极端情况下都与[rdi + rbp*1] 不完全相同,因此汇编程序可能不应该为您优化它。 :P
有一些限制,编码也有一些差异。
rsp(和esp等)不能用作索引寄存器。有许多指令在特定寄存器中接受参数或返回结果 - 例如,变量移位指令仅在 cl 中接受它们的参数。
算术指令(和test)具有rax 的短编码加上一个32 位立即数:
8: 48 05 ff ff 00 00 add $0xffff,%rax
e: 48 81 c3 ff ff 00 00 add $0xffff,%rbx
我确定还有一些我暂时想不起来的点点滴滴:请参阅架构手册了解详细信息。
【讨论】: