繁体   English   中英

状态寄存器上实际使用了多少位 (8086)

[英]How many bits are actually used on the Status Register (8086)

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

状态寄存器有 16 位,每一位都有一个标志。 但是,我们的讲座幻灯片中提供的图片显示的情况并非如此?

状态寄存器

图像显示只有某些位实际上有标志。 这是否意味着实际上只使用了那些位? 其余的部分只是饲料?

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

目前,我在想实际上只使用了 9 位?

在文档中,它显示为“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 注释的旁注,旧的 PUSHF 和 POPF 指令是 16 位,新版本是 32 或 64 位。这对于保持堆栈正确对齐很重要。)

正如 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 的所有信息,甚至可以在运行时对其进行修补。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM