我知道在执行 8 位二进制加法时,如果从第 3 位到第 4 位有进位,则辅助标志设置为 1;但是添加 2 个 16 位数字呢?我在网上看不到任何明确的答案。
我正在研究intel 8086微处理器...
例如,当我添加这两个数字时,0x30a2 和 0xf1ac
0011 0000 1010 0010 + 1111 0001 1010 1100
CF=1
ZF=0
PF=1
SF=0
OF=1
AF=?
我不知道在哪里检查它
来自 James W. Coffron 的“8086/8088 编程”:
AF辅助进位标志。如果设置了此标志,则低半字节进位到高半字节或从高半字节借位到低半字节。高半字节或低半字节是指 16 位值的低位字节。
在我的日子里,我们会写一小段代码来观察处理器的行为。您可以通过添加或减去两个 16 位数字,后跟 a来检查它pushf
,并pop ax
随意检查状态标志。
编辑。
(获取标志的另一种方法是LAHF
加载 5 位AH
带标志,AF
转到第 4 位。)
所以AF
表示从第 3 位到第 4 位的进位,无论操作数的大小如何。
请注意,没有依赖于AF
. 指令在内部使用它在DAA
指令之后立即进行小数调整ADD
,通常使用AL
.
在 8086 上adjust flag (bit 4)
,当第 3 位到第 4 位有进位或第 4 位到第 3 位有借位时,置位BCD operation support
。
BCD operations
8086 上只有 8 位,BCD
调整操作只对AL
寄存器进行。
对于 16 位操作,我希望它的行为与 8 位操作相同。
进位标志(位 0)基于操作是 8 位还是 16 位。如果是 16 位,则结果 > 65535 将进位。如果是 8 位,则结果 > 255 将进位。
进位标志的“位置”取决于操作员指令,它将始终是最高位
例如 add ax,bx :由于操作数是 16 位,进位将表示第 16 位相加的进位,即使您添加 ax(值为 3)和 9(这些值将被视为 0000000000000011 和 0000000000000101 )