当半字节之间存在借入时,为什么辅助标志为0 [英] Why auxiliary flag is 0 when there is a borrow between nibbles

查看:0
本文介绍了当半字节之间存在借入时,为什么辅助标志为0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用以下代码片段在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆