【问题标题】:How many bits are actually used on the Status Register (8086)状态寄存器上实际使用了多少位 (8086)
【发布时间】:2017-02-05 15:11:52
【问题描述】:

在课堂上问过这个,我想我明白但不确定所以我想确认一下。

状态寄存器有 16 位,每个位都有一个标志。但是,我们的讲座幻灯片中提供的图像显示不同?

图像显示只有某些位实际上具有标志。这是否意味着实际上只有这些位被使用?剩下的只是饲料?

如果我的问题不清楚,我很抱歉,如果有人问,我可以尝试解释更多。

目前,我认为实际上只使用了 9 位?

【问题讨论】:

  • 图表不正确。所有位见here
  • 请注意,FLAGS 寄存器已扩展为 32 位 EFLAGS 寄存器,然后扩展为 64 位 RFLAGS 寄存器,其中前 16 位之外的某些位有意义。
  • @FUZxxl,他在问题(标题)中“清楚地”说他说的是 8086,而不是更先进的奔腾、赛龙、至强处理器。
  • Manveer,如果您将图像内联(将其放在您的帖子中)会很好,所以当从 imgur.com 中删除时,stackoverflow 仍然有它。
  • @AlexisWilke 我很乐意,但这是我的第一篇文章,所以我还没有足够的代表来做内联图像;(

标签: assembly cpu-architecture cpu-registers x86-16 status-register


【解决方案1】:

在文档中,它显示为 «16 位寄存器»,因为它是寄存器的逻辑大小。

在实际实现(处理器的创建方式)中,它们通常只有 9 位。其他“位”是直接连接到接地引脚(或 +1.2V 或任何电压)的线路。这是因为内存很昂贵,如果你可以节省一些位,硬件更便宜(想想节省 5 位 x 1000 万个处理器...)

在较新的实现中,我想它们不会那么麻烦,尽管计算机会自动执行类似的操作,因此如果要将其始终保持为 0,就没有理由再拥有真正的内存位.

所以作为一个程序员,就你而言,它是 16 位的。对于硬件工程师来说,它可能只有 9 位。您只需要确保您仍然可以正确地将标志推送到堆栈上(其他 5 位将始终是已知值,在大多数情况下为零)。


更多细节:

要访问标志寄存器,作为程序员,您可以使用PUSHFPOPF

; read to AX
PUSHF
POP AX

; write from AX
PUSH AX
POPF

(作为关于上述 FUZxxl cmets 的旁注,旧的 PUSHF 和 POPF 指令是 16 位,新版本是 32 或 64 位。这对于保持堆栈正确对齐很重要。) em>

正如 Ped7g 所提到的,虽然您可以在 AX 中放入任何随机值并执行PUSH + POPF,但这不是一个好习惯。通常,当您想要更改没有指令的标志时,您会这样做:

PUSHF
POP AX
OR 10h       ; set flag A to 1
PUSH AX
POPF

更改标志的其他方法是使用某些指令。这直接在指令中定义。有一些指令如CLDSTC 直接清除或设置标志。还有其他诸如 SBB 将调整借位和 ADC 调整进位(以及 N、Z、V 标志...)

最后,还有一些方法可以使用分支指令检查基本标志。在许多情况下,这与 CMP 指令一起使用(在较新的处理器上,标志可能会更改的原因有很多......)这允许您将寄存器与另一个值进行比较,如果它更小,更大,等于、小于或等于、大于或等于,会产生溢出。所以像JC这样的指令会读取C标志,如果为真(设置为1)则跳转。

在较旧的处理器中,大多数标志与分支链接。 8086 为“算术”运算(以十进制进行加法和减法)添加了 A 标志,为“方向”添加了 D 标志(请参阅LOOPCXMOVB)。

后来它为很多东西添加了许多其他标志,我不会在这里列出它们。其中一些对于了解某个指令是否存在很有用,从那时起,我们就有了一个用于扩展的CPUID 指令,您需要了解有关 CPU 的所有信息,甚至可以在运行时对其进行修补。

【讨论】:

  • 非常感谢。我假设由于这是针对计算机体系结构课程的,因此我的教授期望 9 位作为答案。作为后续,您说对于程序员来说它本质上是 16 位。我对状态寄存器不是很了解,这是否意味着程序员可以访问所有16位进行编程?
  • @ManveerBhullar:我认为尝试修改保留位在技术上是未定义的行为。您肯定可以读取所有位,只需 PUSHF(堆栈上的标志),然后将其弹出回常规寄存器,如 ax。但是 POPF 的修改可能在某些 CPU 上不起作用,或者在意想不到的 CPU 上产生意想不到的结果(将来“保留”位开始产生一些影响)。所以为了阅读所有 16b 都是可以访问的。
  • STD 将 DF(方向标志)设置为 1(向后),我不确定 SEC 是什么。 CLD 将清除 DF 标志(向前)。 STC 会设置 CF 进位标志,CLC 会清除它。
  • 我用STC 修复了SEC(来自6502)。
猜你喜欢
  • 2012-02-26
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 2017-06-26
  • 1970-01-01
相关资源
最近更新 更多