作者:每天吃的饱饱的 | 来源:互联网 | 2023-05-18 09:05
指令格式:AAA指令功能:对2个未组合的BCD码相加后的结果(必须在AL中)进行调整,产生一个正确的BCD码。如果AL低4位>09H或者AF1,则进行(AL)+06H→(AL),同时(AH
指令格式:AAA
指令功能:对2个未组合的BCD码相加后的结果(必须在AL中)进行调整,产生一个正确的BCD码。如果AL低4位>09H或者AF=1,则进行(AL)+06H→(AL),同时(AH)+1→(AH),AL的高4位清0,然后使AF=1,CF=1
标志位影响:只影响AF与CF
注意:此指令通常跟在加法指令之后
而大致实践情况和上面一致,需要说明的是AL低4位>09H和AF=1这两个条件只要有一个(或两个都)满足,AH则+1.
同时实践出另一个奇异之处,就是在AAA的+6时AL可能向AH进位.真是很奇异!
提供以下代码供实践:
mov ax,0fh ;ax=000fh
add al,0eh ;ax=001dh (af=1,低4位>9)
aaa ;ax=0103h 符合低4+6,高4清0,AH+1
mov ax,0efh ;ax=00efh
add al,0eh ;ax=00fdh (af=1,低4位>9)
aaa ; 实际实验结果ax=0203h,理论上:本来AX应和上面一致=0103h(低4+6,高4清0,AH+1),竟然AL+6后还进位1进AH了这是为什么啊??
4 个解决方案
这个AAA指令的奇异之处,记得是我几年前在这个版参与讨论时发现了,后一直不得其解,鉴于当年很喜欢钻牛角,就记录在某处,后因种种原因,没再接触汇编。今天偶上CSDN,看到了这个问题,感觉很熟悉(其实这个就是摘取我那记录的一段。无妨,学术就是要多探讨,只有多公布,才可多探讨),就看了下,禁不住奇心又起,再在网上搜了下,一种比较靠谱的说法是:
mov ax,0efh
add al,0eh
aaa
这段代码中的0efh和0eh已不是非压缩BCD码(确实是这样),所以AAA后产生的结果不正确也就理所当然了。因为AAA指令是进行非压缩BCD码调整的指令,所以两个不符合非压缩BCD码这一条件要求的数值进行加法操作后,其进行调整不出现正确答案是很正常的。
以上为网上一种比较合理的说法,我基本也以为然。毕竟条件不符,结果不符也就很合理了。
记得在这个版以前有个先辈常告诫的一句话就是“不迷信”,不迷信权威,不迷信书本,多实践。所以,我以前也常钻牛角,敢于置疑,这个奇异的AAA也是在这种情况下发现的。但现在,我又有了一个新观念,开始喜爱置疑自己。
所以,在看了那个网友比较靠谱的说法后,我对自己的以为然又置疑了一下。
以下为我个人对AAA指令的一点新看法。供爱好者一起来置疑,探讨,推究。
一般说:
AAA指令功能:对2个未组合的BCD码相加后的结果(必须在AL中)进行调整,产生一个正确的BCD码。如果AL低4位>09H或者AF=1,则进行(AL)+06H→(AL),同时(AH)+1→(AH),AL的高4位清0,然后使AF=1,CF=1。否则,AF=0,CF=0。
标志位影响:只影响AF与CF。
我想,这个定义基本是正确的。
我也用很多数值进行了实验,基本没问题,当然前提是你
遵循2个未组合的BCD码相加,至少相加的数低4位要是非压缩(非组合)BCD码,如果低4位不是,可能结果就真不正确了。
这里要探说的是AAA指令AAA执行之前,如果AL高4位为1111B(0FH),且L低4位大于9的话(如MOV AL,0f6h,ADD AL,8h,AAA),AAA就将要+6(进行BCD调整),这就导致低4位产生向高4位进位。高4位因原值为0FH,在低4位进1以后,他也产生进位,而且这个进位将被加进AH,其余将遵循指令的功能解释进行执行,此时这个进位产生1加进AH后将破坏了这个AAA指令的规则,产生AH多1的不准确值。这也正符合了那位网友所说条件不符,结果也不符。其实,如果在AAA之前,
“如果AL高4位为1111B(0FH),且L低4位大于9的话,”这个条件不成立的话,即使不是非压缩BCD码进行的加法后再AAA,我们也将得到非视高4位(高4位在非组合BCD码中是不表示码值的)的正确结果。而问题正是出在这个高4位为1111B的情况下,为什么呢/因为他在低4进位后它也要进位,但假设我们转念一想,它只管进位好了,我不不这个进位加进AH里去不就好了。正是!假设这个进位不加进AH,其结果还是会正确。由此,我们可以进一步思索,在指令进行(AL)+06H→(AL)时,并不是同时(AH)+1→(AH),如果是同时(AH)+1→(AH)的话,那个AL的进位是进不了AH的,由此,我们是不是窥出,其实是(AL)+06H→(AL)后才(AH)+1→(AH)的,其实再进一步思索一下,也不是(AH)+1→(AH)的,应该是AH带进位加1,或者说是类似这样的。
如此,这个AAA指令的就很明确的呈现在我们面前,它的功能可以说是这样的:
它将先侦测AL是否大于9,AF是否=1。如果AL>9,或者AF=1,则AL+6→AL,AH带进位+1→AH,置AL高4为0,使AF=1,CF=1,否则AF=0,CF=0。
这样,理解了它的实质,我们就不必管他只能针对非组合的BCD码的调整了。可以把它拿来为我所欲用了。
为了加强它的直观性,列举几个码段,以供直观。
;ax=0008h
add al,09h
;ax=0011h (AF=1,低4位<9)
aaa
;ax=0107h 符合AL低4+6,高4清0,AH+1,标准非压缩BCD调整!
;=================================================
mov ax,08h
;ax=0008h
add al,03h
;ax=000Bh (AF=0,低4位>9)
aaa
;ax=0101h 符合AL低4+6,高4清0,AH+1,标准非压缩BCD调整!
;==================================================
mov ax,02h
;ax=0002h
add al,03h
;ax=0005h (AF=0,低4位<9)
aaa
;ax=0005h 不必AL低4+6,高4清0,不必AH+1,标准非压缩BCD调整!
;==================================================
mov ax,f2h
;ax=00f2h,虽然AL里不是标准非压缩BCD码,在非视高4位的情况下,后面也是正确结果.
add al,03h
;ax=00f5h (AF=0,低4位<9)
aaa
;ax=0005h 不必AL低4+6,高4清0,不必AH+1,非视高4位,结果也正确!
;====================================================
mov ax,058h
;ax=0058h,虽然AL里不是标准非压缩BCD码,在非视高4位的情况下,后面也是正确结果.
add al,067h
;这里的067H也不是标准非压缩BCD码
;ax=00bfh (AF=0,低4位>9)
aaa
;ax=0105h 遵循AL低4+6,高4清0,遵循AH+1,非视高4位后,结果正确!
;=======================================================
mov ax,058h
;ax=0058h,虽然AL里不是标准非压缩BCD码,在非视高4位的情况下,后面也是正确结果.
add al,069h
;这里的069H也不是标准非压缩BCD码
;ax=00c1h (AF=1,低4位<9)
aaa
;ax=0107h 遵循AL低4+6,高4清0,遵循AH+1,非视高4位后,结果正确!
;=========================================================
mov ax,0e8h
;ax=00e8h,虽然AL里不是标准非压缩BCD码,在非视高4位的情况下,后面也是正确结果.
add al,009h
;ax=00f1h 虽然AL高4位为1111B (AF=1,低4位<9) 但非视高4结果仍正确
aaa
;ax=0107h 遵循AL低4+6,高4清0,遵循AH+1,非视高4位后,结果正确!
;
==========================================================
;
这个就是那个很奇异的结果了,但现在也不奇异了!
mov ax,0f5h
;ax=00f5h,AL里不是标准非压缩BCD码
add al,006h
;ax=00fbh AL高4位为1111B (AF=0,低4位>9) 结果就要奇异了.
aaa
;ax=0201h 遵循AL低4+6,高4清0,遵循AH+1,但AH=2了,它带进位加了!
;
==========================================================
;
这个是典型非标准BCD码的操作了(相加数里低4都不是BCD码),就没法保证结果的正确性了,后果自负!
mov ax,000fh
;ax=000fh,AL里不是标准非压缩BCD码
add al,00fh
;Al里也不是标准非压缩BCD码
;ax=001eh (AF=1,低4位>9) 这个结果由自己承担了..
aaa
;ax=0104h 遵循AL低4+6,高4清0,遵循AH+1,但结果真正不正确了,!
就匆匆写这点了,希望我早些时候发现的一个AAA奇异之处到现在能有个相对比较有说法的结局。
希望给有需要者一个抛引,也希望有再来者能进一步探讨。
更正:
如此,这个AAA指令的就很明确的呈现在我们面前,它的功能可以说是这样的:
它将先侦测AL低4位是否大于9,AF是否=1。如果AL(低4)>9,或者AF=1,则AL+6→AL,AH带进位+1→AH,置AL高4为0,使AF=1,CF=1,否则AF=0,CF=0。