【问题标题】:Why are x86 assembler registers named with X H and L? [duplicate]为什么 x86 汇编器寄存器用 X H 和 L 命名? [复制]
【发布时间】:2018-07-21 15:05:51
【问题描述】:

我正在学习 asm,我很好奇为什么寄存器的名称用这些字母指定,因为理解这可能有助于我在另一个层面上理解它。 IE。 AL是最低有效字节,但是“L”是什么意思呢?

图片来源:http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

【问题讨论】:

  • x - 扩展,h - 高字节,l - 低字节。一开始(a, b, c, d) - 8 位处理器,另一个byte 用于16 位处理器(al, ah, bl, bh, ...),扩展了另一个word,例如(ax, bx, ...) 到 32 位处理器的寄存器 (eax, ebx, ...) 添加另一个 double-word 64 位处理器的 32 位扩展 (rax, rbx, ...) 时间在继续……
  • 谢谢,这很清楚地回答了我的问题
  • 相关:Why are first four x86 GPRs named in such unintuitive order?What do the register-names like esi mean, and what special purposes do they have.。当然,在优化性能而不是代码大小时,rep scas 之类的指令并不总是最好的,所以你应该选择最方便的寄存器(最少/最便宜的指令)而不关心它们的名字,除非选择是任意。
  • 通过使用类似的寄存器使用模式可能有助于压缩代码,例如,当您处理 4kB 介绍时,有时最好使用更多 push/pop/mov 指令来使用 f.e. esi 到处都是“源”地址,在组装后具有 +40B (比使用备用寄存器并保存 push/pop 对的版本),但压缩后的字节数更少。但此建议仅与 size-limit-intro 编码相关,不适用于“生产”软件。如果您在常见模式中使用寄存器 = 即使对于严重的 SW 也有优势(但为什么要使用 asm 呢?)。

标签: assembly x86 history


【解决方案1】:

当最初的“A”(累加器)演变为 16 位 AX 时,仍然需要识别 >L低阶 (7-0) 和 H高阶 (15-8) 位。因此 AL & AH。 low 和 high 的含义已经存在了很长时间,所以它可能是被采用的原因,但它也可以很容易地是 ah = AL = 左 8 位和 al = AR = 右 8 位。

然后当你进入 64 位时,这些命名约定基本上是假名,寄存器被标识为 R0 - R15。所以 R2B 是 CL,R2W 变成 CX 依此类推。

【讨论】:

  • 因为寄存器的编号方式很奇怪,所以CL是R1B,BL是R3B。
  • @prl 我应该记得大多数文档并不按编码顺序表示寄存器。 AX = R0W,CX = R1W,DX = R2W,BX = R3W,SP = R4W,BP = R5W,SI = R6W,DI = R7W。出于某种原因,甚至在英特尔的文档中,它最常见的是 AX、BX、CX、DX、SI、DI、SP 和 BP。
猜你喜欢
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 2023-03-23
相关资源
最近更新 更多