macos - 为什么 Apple 使用 R8l 作为字节寄存器而不是 R8b?

标签 macos assembly x86-64 cpu-registers

我在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 使用与其他公司不同的名称?

最佳答案

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

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

3.1.2 64-Bit-Mode Registers

In 64-bit mode, eight new GPRs are added to the eight legacy GPRs, all 16 GPRs are 64 bits wide, and the low bytes of all registers are accessible. Figure 3-3 on page 27 shows the GPRs, flags register, and instruction-pointer register available in 64-bit mode. The GPRs include:

  • Sixteen 8-bit low-byte registers (AL, BL, CL, DL, SIL, DIL, BPL, SPL, R8B, R9B, R10B, R11B, R12B, R13B, R14B, R15B).
  • Four 8-bit high-byte registers (AH, BH, CH, DH), addressable only when no REX prefix is used.
  • Sixteen 16-bit registers (AX, BX, CX, DX, DI, SI, BP, SP, R8W, R9W, R10W, R11W, R12W, R13W, R14W, R15W).
  • Sixteen 32-bit registers (EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP, R8D, R9D, R10D, R11D, R12D, R13D, R14D, R15D).
  • Sixteen 64-bit registers (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 Register Operands in 64-Bit Mode

Register operands in 64-bit mode can be any of the following:

  • 64-bit general-purpose registers (RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP, or R8-R15)
  • 32-bit general-purpose registers (EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP, or R8D-R15D)
  • 16-bit general-purpose registers (AX, BX, CX, DX, SI, DI, SP, BP, or R8W-R15W)
  • 8-bit general-purpose registers: AL, BL, CL, DL, SIL, DIL, SPL, BPL, and R8L-R15L are available using REX prefixes; AL, BL, CL, DL, AH, BH, CH, DH are available without using REX prefixes.

关于macos - 为什么 Apple 使用 R8l 作为字节寄存器而不是 R8b?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43991779/

相关文章:

c++ - 纯 C++ 代码比内联汇编程序快 10 倍。为什么?

c++ - 内联汇编,输出指令

c - i686 是 32 位的吗?为什么我的 gcc/g++ 无法编译 .cpp 和 .c 文件?

linux - 程序集 x86-64 从堆栈中获取函数参数

c - 如何将输入传递到扩展的asm?

c++ - 用于验证事务模块 (.cpp) header 中 #define(d) 整数提供的范围的条件语句

python - 在 MacOSX 上编译coverage.py 时出错

windows - 什么脚本(比如 .bat)可以在 windows、mac 和 linux 上运行

objective-c - 如何强制 NSWindow 始终处于事件状态/专注状态?

assembly - 为什么 Assembly x86_64 系统调用参数不像 i386 那样按字母顺序排列