0

在 EMU8086 上进行测试,代码片段如下:

MOV CX, 1527H
SUB CX, 44H

模拟器显示AF为0

   1527
 -   44
========
   14E3

手动减法时,我们得到 7 - 4 = 3,这里没问题。然后 2 - 4,然后我们必须从下一个半字节借用。所以根据我的理解,AF应该是1。

4

1 回答 1

3

AF 根据从位#3 到位#4 的进位(或借位)设置。即跨越最低/最不重要的半字节边界,位于 AL/BL/CL/DL 中间的那个,而不是 AX 的中间。(由于每个十六进制数字代表一个半字节,因此从最低的十六进制数字进位/借位到第二低位。)

正如你所说7h - 3h的不借,所以AF = 0。

将 AF 描述为“半进位”标志在字节操作数大小的上下文中是有意义的,其中字节内只有一个半字节边界,并且它位于进位位置的中途。

字操作数大小(在 386 和 x86-64 上更大)仍然从位 3->4 设置 AF,而不是从操作数大小的中间或任何其他位位置之间的进位。


这是因为它分别用于打包和解包 BCD 操作,如 DAA 和 AAA。请注意,AAA(用于将add ax, cx2 个十进制数字解压成单独的字节后使用)取决于 AF 检测低 4 位的进位。在这种情况下,从第 7 位到第 8 位(跨越字节边界)永远不会有进位,例如0x0909+0x0909产生0x1212,带有 AF 设置的进位 from 9+9 = 12h,但09h + 09h = 12h在字节边界处没有进位。

与解包的工作方式不同(检查 AL 的高位),AAA使用与 DAA 大致相同的逻辑(检查 AF,以及al> 9 的低半字节) - https://www.felixcloutier.com/x86/aaa#手术

有趣的事实:您可以使用DAS在 int -> ASCII-hex 转换以及 cmp 和 sbb 中保存几个字节,由于 and 的 ASCII 代码之间的距离'9''A'以及 DAS 的有条件AL-=6的行为和其他行为。

于 2021-06-01T05:52:59.927 回答