Assembly RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP、R8-R15是否可以互换?

Assembly RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP、R8-R15是否可以互换?,assembly,x86-64,Assembly,X86 64,x64寄存器是可交换的吗?在这个意义上,任何与它们的一个组合一起工作的指令都将与其他任何组合一起工作?除了名称之外,是否存在性能差异或任何其他考虑因素使它们彼此不同?否。尽管大多数x86和x86_64指令可以使用任何寄存器作为GPRs,但某些指令仅适用于特定寄存器或一组寄存器,如movabs、mul、div 有关隐式寄存器用法的更多详细信息,请阅读 另请参见编码方面存在一些限制和差异 rsp(和esp等)不能用作索引寄存器。有许多指令在特定寄存器中接受参数或返回结果-例如,变量移位指令仅在cl中

x64寄存器是可交换的吗?在这个意义上,任何与它们的一个组合一起工作的指令都将与其他任何组合一起工作?除了名称之外,是否存在性能差异或任何其他考虑因素使它们彼此不同?

否。尽管大多数x86和x86_64指令可以使用任何寄存器作为GPRs,但某些指令仅适用于特定寄存器或一组寄存器,如movabs、mul、div

有关隐式寄存器用法的更多详细信息,请阅读


另请参见

编码方面存在一些限制和差异

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

我肯定还有其他一些细节我现在想不起来:有关血淋淋的细节,请参阅《体系结构手册》。

我确实不确定,但查看这些细节会有很大帮助。它们的读取量有点大,但它们会告诉您每一条指令都能/不能执行的操作,并给出优化建议。此外,还存在寻址模式差异(例如没有[rbp]。您必须用[rbp+0]进行伪装),并且高位寄存器的编码不太紧凑。此外,使用(r)bp或(r)进行寻址sp使用SS作为默认段选择器,而其他寄存器使用DS。它们不一定相等。@PMF:在64位模式下,唯一的区别是,如果您试图从RBP或RSP中取消对非规范地址的引用,则可以获得一个
#SS
异常,而不是
#GP
。64位模式将SS和DS的段基固定为0,并完全忽略SS和DS段覆盖前缀。看见但是是的,这确实意味着
[rbp+rdi*1+0]
[rdi+rbp*1]
在所有可能的情况下都不完全相同,因此汇编程序可能不应该为您优化它P