状态寄存器 (8086) 上实际使用了多少位
How many bits are actually used on the Status Register (8086)
在 class 中问过这个问题,我想我明白了,但不确定所以我想确认一下。
状态寄存器有16位,每一位都有一个标志。但是,我们的讲座幻灯片中提供的图片显示的不是这样?
图像显示实际上只有某些位具有标志。这是否意味着实际上只使用了那些位?其余的位只是饲料?
很抱歉,如果我的问题不清楚,如果有人问,我可以尝试解释更多。
目前,我在想实际上只有9位被使用?
在文档中,它显示为 «16 位寄存器»,因为它是寄存器的逻辑大小。
在实际实现中(处理器的创建方式)通常只有 9 位。另一个 "bits" 是直接连接到接地引脚的线路(或 +1.2V 或任何可能存在的电压。)这是因为内存很昂贵,如果你能节省一些位,硬件会更便宜(考虑节省 5 位 x 1000 万个处理器...)
在较新的实现中,我想他们不会那么麻烦,尽管计算机会自动执行类似的操作,所以如果要将其全部保持为 0,就没有理由拥有真正的内存了时间。
所以作为程序员,对你来说,就是16位。对于硬件工程师来说,可能 只是 9 位。你只需要确保你仍然可以正确地将标志压入堆栈(其他 5 位将始终是一个已知值,在大多数情况下将为零)。
更多详情:
要访问标志寄存器,作为程序员,您使用PUSHF
和POPF
。
; 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
更改标志的其他方法是使用某些指令。这是直接在指令中定义的。有一些指令如CLD
和STC
直接清除或设置标志。还有其他一些,例如 SBB
会调整借位,ADC
会调整进位(以及 N、Z、V 标志...)
最后,还有一些方法可以用分支指令检查基本标志。在许多情况下,这与 CMP
指令一起使用(在较新的处理器上,标志可能更改的原因有很多......)这允许您将寄存器与另一个值进行比较,如果它更小则分支,更大、等于、更小或等于、更大或等于,产生溢出。因此,JC
之类的指令读取 C 标志并在为真(设置为 1)时跳转。
在较旧的处理器中,大多数标志在 link 中带有分支。 8086 为 "Arithmetic" 运算(以十进制进行加法和减法)添加了 A 标志,为 "Direction" 添加了 D 标志(参见 LOOPCX
、MOVB
)。
后来它为很多东西添加了许多其他标志,我不会在这里列出它们。其中一些对于了解某个指令是否存在很有用,从那时起我们有一个 CPUID
扩展指令,你需要知道的关于 CPU 的一切,它甚至可以在运行时修补。
在 class 中问过这个问题,我想我明白了,但不确定所以我想确认一下。
状态寄存器有16位,每一位都有一个标志。但是,我们的讲座幻灯片中提供的图片显示的不是这样?
图像显示实际上只有某些位具有标志。这是否意味着实际上只使用了那些位?其余的位只是饲料?
很抱歉,如果我的问题不清楚,如果有人问,我可以尝试解释更多。
目前,我在想实际上只有9位被使用?
在文档中,它显示为 «16 位寄存器»,因为它是寄存器的逻辑大小。
在实际实现中(处理器的创建方式)通常只有 9 位。另一个 "bits" 是直接连接到接地引脚的线路(或 +1.2V 或任何可能存在的电压。)这是因为内存很昂贵,如果你能节省一些位,硬件会更便宜(考虑节省 5 位 x 1000 万个处理器...)
在较新的实现中,我想他们不会那么麻烦,尽管计算机会自动执行类似的操作,所以如果要将其全部保持为 0,就没有理由拥有真正的内存了时间。
所以作为程序员,对你来说,就是16位。对于硬件工程师来说,可能 只是 9 位。你只需要确保你仍然可以正确地将标志压入堆栈(其他 5 位将始终是一个已知值,在大多数情况下将为零)。
更多详情:
要访问标志寄存器,作为程序员,您使用PUSHF
和POPF
。
; 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
更改标志的其他方法是使用某些指令。这是直接在指令中定义的。有一些指令如CLD
和STC
直接清除或设置标志。还有其他一些,例如 SBB
会调整借位,ADC
会调整进位(以及 N、Z、V 标志...)
最后,还有一些方法可以用分支指令检查基本标志。在许多情况下,这与 CMP
指令一起使用(在较新的处理器上,标志可能更改的原因有很多......)这允许您将寄存器与另一个值进行比较,如果它更小则分支,更大、等于、更小或等于、更大或等于,产生溢出。因此,JC
之类的指令读取 C 标志并在为真(设置为 1)时跳转。
在较旧的处理器中,大多数标志在 link 中带有分支。 8086 为 "Arithmetic" 运算(以十进制进行加法和减法)添加了 A 标志,为 "Direction" 添加了 D 标志(参见 LOOPCX
、MOVB
)。
后来它为很多东西添加了许多其他标志,我不会在这里列出它们。其中一些对于了解某个指令是否存在很有用,从那时起我们有一个 CPUID
扩展指令,你需要知道的关于 CPU 的一切,它甚至可以在运行时修补。