汇编语言aaa指令解析,aas指令解析

aaa指令本质上是将相加后的结果拆成两个部分(拆成非压缩BCD码的形式)
下面进行举例介绍
1. ah = 0,al = 06h,bl = 09h,执行指令add al,bl得ah = 01h,al = 05h,aaa的作用就是将相加后al中的结果15拆分成两部分
(将0fh十进制为15的数字拆分成一个1和一个5,1放在ax的高位ah中,5放在ax的低位al中)
2. 看下面的汇编代码段

mov		ah,0				;ax = 0038h
mov   	al,'8'				;'8'的ascii码值十进制为56,十六进制为0038h,所以ax = 0038h
add		al,'2'				;'2'的ascii码值十进制为50,十六进制为0032h,所以ax = 0032h,相加后结果为006Ah
aaa							;执行aaa指令后ax = 0100h,本质上是将al低位的a进行化简,a的值为10,转化为BCD码值为01 00h
or			ax,3030h        ;相当于or		ah,30h与or	al,30h操作
将高位的ah与低位的al分别进行ascii码值的转换

最终输出的值为"10",相当于将’8’与’2’进行加法运算,‘8’+‘2’ = “10”
具体算法
(1)如果al的低4位是在0到9之间,保留低4位,清除高4位,如果al的低4位在10到15之间,则通过加6,来使得低4位在0到9之间,然后再对高4位清零。
(2)如果al的低4位是在0到9之间,ah值不变,CF和AF标志清零,否则,ah=ah+1,并设置CF和AF标志。

aas指令与aaa指令类似
AAS 减法的ASCII调整指令(ASCII Adjust for Subtraction)
若AL寄存器的低4位>9或AF=1,则:
(1)AL=AL-6,AF置1;
(2)将AL寄存器高4位清零;
(3)AH=AH-1,CF置1。
否则,不需要调整。
如下面的汇编指令
.data
val1 BYTE ‘8’
val2 BYTE ‘9’
.code
mov ah, 0
mov al,val1 ; AX = 0038h
sub al,val2 ; AX = 00FFh
aas ; AX = FF09h
pushf ; 保存进位标志位
or al,30h ; AX = FF39h
popf ; 恢复进位标志位
算出ax = 00ffh之后,看末尾的f,
f超过值9,将f-6后值为09放入末尾的al之中
因为f减去了值6,所以打头的00需要减1
00-1=ffh,最终结果为ax = ff09h

你可能感兴趣的:(汇编语言,计算机组成原理,操作系统学习)