为什么半字节之间有借位时辅助标志为0
Why auxiliary flag is 0 when there is a borrow between nibbles
在 EMU8086 上测试,代码片段如下:
MOV CX, 1527H
SUB CX, 44H
模拟器显示AF为0
1527
- 44
========
14E3
手工做减法时,我们得到 7 - 4 = 3,这里没问题。
然后是 2 - 4,然后我们必须从下一个半字节借用。所以根据我的理解,AF应该是1.
AF 是根据从位#3 到位#4 的进位(或借位)设置的。即跨越最低/最不重要的半字节边界,AL/BL/CL/DL 中间的那个,而不是 AX 的中间。 (由于每个十六进制数字代表一个半字节,carry/borrow 从最低的十六进制数字到第二低的。)
如你所说7h - 3h
不借,所以AF=0.
将 AF 描述为“半进位”标志在字节操作数大小的上下文中是有意义的,其中字节内只有一个半字节边界,并且它位于进位输出位置的一半。
字操作数大小(在 386 和 x86-64 上更大)仍然从位 3->4 设置 AF,而不是从操作数大小的中间或任何其他位位置之间进位。
那是因为它分别用于打包和解包的 BCD 操作,例如 DAA 和 AAA。请注意,AAA(用于 add ax, cx
之后或任何将 2 个十进制数字解压缩到单独字节中的内容)取决于 AF 从低 4 位检测进位。在这种情况下,从第 7 位到第 8 位(跨越字节边界)永远不会有进位,例如0x0909
+ 0x0909
产生 0x1212
,带有来自 9+9 = 12h
的 AF 设置进位,但在字节边界没有来自 09h + 09h = 12h
的进位。
与解压缩的工作方式不同(检查 AL 的高位),AAA
使用与 DAA 基本相同的逻辑(检查 AF,al
的低半字节 > 9) - https://www.felixcloutier.com/x86/aaa#operation
有趣的事实:您可以 use DAS
to save a couple bytes in int -> ASCII-hex conversion,连同 cmp 和 sbb,由于 '9'
和 [=21] 的 ASCII 码之间的距离,完全的破解/滥用恰好起作用=],以及 DAS 的条件 AL-=6
和其他行为。
在 EMU8086 上测试,代码片段如下:
MOV CX, 1527H
SUB CX, 44H
模拟器显示AF为0
1527
- 44
========
14E3
手工做减法时,我们得到 7 - 4 = 3,这里没问题。 然后是 2 - 4,然后我们必须从下一个半字节借用。所以根据我的理解,AF应该是1.
AF 是根据从位#3 到位#4 的进位(或借位)设置的。即跨越最低/最不重要的半字节边界,AL/BL/CL/DL 中间的那个,而不是 AX 的中间。 (由于每个十六进制数字代表一个半字节,carry/borrow 从最低的十六进制数字到第二低的。)
如你所说7h - 3h
不借,所以AF=0.
将 AF 描述为“半进位”标志在字节操作数大小的上下文中是有意义的,其中字节内只有一个半字节边界,并且它位于进位输出位置的一半。
字操作数大小(在 386 和 x86-64 上更大)仍然从位 3->4 设置 AF,而不是从操作数大小的中间或任何其他位位置之间进位。
那是因为它分别用于打包和解包的 BCD 操作,例如 DAA 和 AAA。请注意,AAA(用于 add ax, cx
之后或任何将 2 个十进制数字解压缩到单独字节中的内容)取决于 AF 从低 4 位检测进位。在这种情况下,从第 7 位到第 8 位(跨越字节边界)永远不会有进位,例如0x0909
+ 0x0909
产生 0x1212
,带有来自 9+9 = 12h
的 AF 设置进位,但在字节边界没有来自 09h + 09h = 12h
的进位。
与解压缩的工作方式不同(检查 AL 的高位),AAA
使用与 DAA 基本相同的逻辑(检查 AF,al
的低半字节 > 9) - https://www.felixcloutier.com/x86/aaa#operation
有趣的事实:您可以 use DAS
to save a couple bytes in int -> ASCII-hex conversion,连同 cmp 和 sbb,由于 '9'
和 [=21] 的 ASCII 码之间的距离,完全的破解/滥用恰好起作用=],以及 DAS 的条件 AL-=6
和其他行为。