【问题标题】:Why does Apple use R8l for the byte registers instead of R8b?为什么Apple使用R8l而不是R8b作为字节寄存器?
【发布时间】:2017-10-14 23:08:01
【问题描述】:

我在Making Code 64-Bit Clean主题中看到了这个

╔═════════════════════╤══════════════════════════════════════════════════════╗
║ Register name       │ Description                                          ║
╠═════════════════════╪══════════════════════════════════════════════════════╣
║ R8                  │ A 64-bit register.                                   ║
╟─────────────────────┼──────────────────────────────────────────────────────╢
║ R8d                 │ A 32-bit register containing the bottom half of R8.  ║
╟─────────────────────┼──────────────────────────────────────────────────────╢
║ R8w                 │ A 16-bit register containing the bottom half of R8d. ║
╟─────────────────────┼──────────────────────────────────────────────────────╢
║ R8l (Lowercase “l”) │ An 8-bit register containing the bottom half of R8w. ║
╚═════════════════════╧══════════════════════════════════════════════════════╝

使用l 后缀,我首先认为它是一个long 寄存器,就像在 GAS 语法中一样。

为什么 Apple 使用与其他所有人不同的名称?

【问题讨论】:

  • “低字节”中的“l”
  • 这些是 Intel 寄存器名称。
  • @RossRidge 刚刚检查了英特尔手册,他们确实使用了L 后缀。那么为什么其他组装商使用 R8b 而不是使用 Intel 呢?
  • 因为 AMD 使用 B 后缀作为编号的寄存器。 AMD 手册将低字节寄存器列为“AL、BL、CL、DL、SIL、DIL、BPL、SPL、R8B、R9B、R10B、R11B、R12B、R13B、R14B、R15B”,而 Intel 手册将它们列为“AL , BL, CL, DL, DIL, SIL, BPL, SPL, R8L - R15L”。可以说英特尔的名称更一致,但可以说 AMD 的名称更正确,因为它们创建了额外的 64 位寄存器。

标签: macos assembly x86-64 cpu-registers


【解决方案1】:

从 Ross Ridge 的评论来看,这是因为 AMD 和 Intel 的寄存器命名约定不同

来自 AMD64 架构程序员手册,Volume 1: Application Programming

3.1.2 64 位模式寄存器

在 64 位模式下,八个新 GPR 被添加到八个传统 GPR 中,所有 16 个 GPR 均为 64 位宽,并且所有寄存器的低字节均可访问。第 27 页的图 3-3 显示了 64 位模式下可用的 GPR、标志寄存器和指令指针寄存器。 GPR 包括:

  • 16 个 8 位低字节寄存器(AL、BL、CL、DL、SIL、DIL、BPL、SPL、R8B、R9B、R10B、R11B、R12B、R13B、R14B、R15B )。
  • 四个 8 位高字节寄存器(AH、BH、CH、DH),仅在不使用 REX 前缀时可寻址。
  • 16 个 16 位寄存器(AX、BX、CX、DX、DI、SI、BP、SP、R8W、R9W、R10W、R11W、R12W、 R13W、R14W、R15W)。
  • 16 个 32 位寄存器(EAX、EBX、ECX、EDX、EDI、ESI、EBP、ESP、R8D、R9D、R10D、R11D、R12D、R13​​D、R14D、R15D)。
  • 16 个 64 位寄存器(RAX、RBX、RCX、RDX、RDI、RSI、RBP、RSP、R8、R9、R10、R11、R12、R13、R14、R15)。

与英特尔® 64 和 IA-32 架构相比 - 软件开发人员手册Volume 1: Basic Architecture

3.7.2.1 64 位模式下的寄存器操作数

64位模式下的寄存器操作数可以是以下任意一种:

  • 64 位通用寄存器(RAX、RBX、RCX、RDX、RSI、RDI、RSP、RBP 或 R8-R15)
  • 32 位通用寄存器(EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP 或 R8D-R15D)
  • 16 位通用寄存器(AX、BX、CX、DX、SI、DI、SP、BP 或 R8W-R15W)
  • 8位通用寄存器:AL、BL、CL、DL、SIL、DIL、SPL、BPL和R8L-R15L可使用REX前缀; AL、BL、CL、DL、AH、BH、CH、DH 无需使用 REX 前缀即可使用。

【讨论】:

  • 当前版本的英特尔手册已更改为使用 R8B-R15B,可能是因为这是开发人员中使用更广泛的寄存器名称,和/或因为 GAS lb 后缀一致. (例如,2021 年 4 月第 2 卷手册根本没有提到 R8L,只有 R8B。)您对 PDF 的直接链接现在已经失效,software.intel.com/content/www/us/en/develop/articles/… 没有档案,但我有 Jan2015 卷的副本.2 pdf (325383-053US) 在本地使用 R8L,与当前手册不同。
  • 尽管如此,GDB 仍然使用l。 fasm 接受这两种变体。我检查过的其他汇编器——gas、nasm、yasm——只支持b 变体。
猜你喜欢
  • 2014-04-05
  • 1970-01-01
  • 2017-08-04
  • 2021-10-13
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
相关资源
最近更新 更多