汇编语言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

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值