【问题标题】:Are RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8-R15 interchangable?RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP、R8-R15 可以互换吗?
【发布时间】:2014-01-15 14:56:14
【问题描述】:

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

【问题讨论】:

  • 我实际上不确定,但查看Intel manuals 会有很大帮助。它们读起来有点大,但它们会告诉您每条指令可以/不能做的所有事情,并提供优化建议。

标签: assembly x86-64


【解决方案1】:

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

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

另见Are the data registers EAX, EBX, ECX and EDX interchangeable

【讨论】:

  • 还有寻址模式的差异(例如没有 [rbp]。你必须用 [rbp+0] 伪造它)并且高位寄存器的编码不太紧凑。
  • 除了使用 (r)bp 或 (r)sp 寻址之外,使用 SS 作为默认段选择器,而其他寄存器使用 DS。它们不一定相等。
  • @PMF:在 64 位模式下,唯一的区别是,如果您尝试从 RBP 或 RSP 中取消引用非规范地址,则可以获得 #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
【解决方案2】:

有一些限制,编码也有一些差异。

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

我确定还有一些我暂时想不起来的点点滴滴:请参阅架构手册了解详细信息。

【讨论】:

    猜你喜欢
    • 2012-06-15
    • 2022-09-27
    • 2023-03-07
    • 1970-01-01
    • 2020-02-16
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多