【问题标题】:x86 - Number of registers vs number of reserved bitsx86 - 寄存器数量与保留位数
【发布时间】:2016-04-25 11:30:36
【问题描述】:

我是组装新手,我的问题是:

例如,如果一台机器有 n 个寄存器。在汇编指令中需要保留多少位来寻址 n 个寄存器中的每一个?

功能拆分可以减少多少所需的位数?

【问题讨论】:

  • 这听起来像是功课,尤其是最后一部分。如果你无法弄清楚那个,你真的需要一张纸,坐下来思考。
  • 请注意,x86 ISA 不使用固定大小的指令。如果您对 x86 上指令编码的详细信息感兴趣,请阅读Intel software developer's manual(您可能对有关 ModR/M 字节的部分特别感兴趣)。
  • @DarkDust 我只是在看一本教科书,我想知道它们如何达到所需的最少位数。

标签: assembly x86 machine-instruction


【解决方案1】:

对此没有统一的答案。显然,您需要最多 足够的位来存储寄存器的数量。因此,如果您有 12 个寄存器,则需要 4 位 (2^4 == 16)。

但指令集可以以不同的方式处理某些寄存器(例如,具有仅隐式寻址特定寄存器的指令;请参阅 x86 的 LOOP)。所以一个 CPU 可以有 9 个寄存器,但由于一个只能用专门的指令访问,你只需要 3 位来寻址剩余的 8 个。此外,一些指令只能允许寄存器的某个子集,从而也减少了寻址它们所需的位(例如,一条指令只允许对寄存器 0-3 进行操作)。

更复杂的是,register windows 仅使指令集可以使用物理寄存器的一个子集。

【讨论】:

  • loopmovsb 会是一个更好的例子。 rep 不是独立指令,只能应用于其他几个insn。你说一些操作码只能寻址有限的寄存器是什么意思?您是在谈论没有 REX 前缀的 64 位模式吗?我想不出一个例子,您可以选择有限的寄存器,而该寄存器的编码位比正常少。 (除 16 位寻址模式外,esp/rsp 不能是 32/64 位寻址模式下的索引寄存器。)
  • @PeterCordes:你说得对,loop 是一个更好的例子。已更新我的答案。关于有限的寄存器:我​​的回答是关于通用(因此也是理论上的)CPU 设计,尽管我隐约记得在 8086 和/或 M68000 中存在具有此类限制的指令;试图找到那些,似乎我错了。顺便说一句,x86 系列也不使用寄存器窗口。
  • 你应该去掉“一些 x86 操作码这样做”,因为它是错误的。您的其余答案很好(而且我不是反对者),很明显您在其余部分中不是在谈论 x86。如果您正在寻找示例,某些架构(ARM,IIRC,但我不确定)具有使用两个寄存器的指令,并且第二条指令隐含地是显式 reg 的奇数/偶数伙伴(切换低位,而不是添加 1)。对于特殊寄存器:MIPS 有 32 个 GP 寄存器加上 HI 和 LO 来保存全乘 (32x32b => 64b) 的结果,这是 8+1 的好例子。
猜你喜欢
  • 2012-03-25
  • 1970-01-01
  • 2023-03-23
  • 2015-03-27
  • 2019-03-11
  • 2023-04-07
  • 2012-02-26
  • 2011-01-14
相关资源
最近更新 更多