当半字节之间存在借入时,为什么辅助标志为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的中间。(因为每个十六进制数字代表一个半字节,所以从最低的十六进制数字进位/借入到第二个最低的十六进制数字。)
如您所说,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基本相同的逻辑(检查al
为>;9的AF和低位半字节)-https://www.felixcloutier.com/x86/aaa#operation
有趣的事实:由于'9'
和'A'
的ASCII代码之间的距离,以及DAS的条件AL-=6
和其他行为,您可以use DAS
to save a couple bytes in int -> ASCII-hex conversion与CMP和SBB一起进行完全的黑客攻击/滥用。
这篇关于当半字节之间存在借入时,为什么辅助标志为0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!