二、未组合BCD码算术运算调整指令
1.未组合BCD码的加法指令调整指令: AAA
指令格式: AAA
本指令对在AL中的由两个未组合BCD码相加后的结果进行调整,产生一个未组合BCD码
调整方法如下:
1) 如果AL中低4位在0~9之间,且AF=0,转入3)
2) 如果AL的低4位在A~F之间,或AF=1,则(AL)=(AL)+6, (AH)=(AH)+1, AF=1
3) 清除AL的高4位
4) AF的值送入CF
该指令影响标志位AF和CF,对其他标志位无定义。
例:
MOV AX, 7
ADD AL, 6 ; AL=0DH, AH=00H, AF=0, CF=0
AAA ; AL=03H, AH=01H, AF=1, CF=1
ADC AL, 5 ; AL=09H, AH=01H, AF=0, CF=0
AAA ; AL=09H, AH=01H, AF=0, CF=0
ADD AL, 39H ; AL=42H, AH=01H, AF=1, CF=0
AAA ; AL=08H, AH=02H, AF=1, CF=1
2. 未组合BCD码的减法指令调整指令 AAS
指令格式: AAS
本指令对在AL中的两个未组合BCD码相减所得的差进行调整,产生一个未组合BCD码
调整方法如下:
1) 如果AL中的低4位在0~9之间,且AF=0,则转入3)
2) 如果AL中的低4位在A~F之间或AF=0,则 (AL)=(AL)-6, (AH)=(AH)-1, AF=1
3) 清除AL的高4位
4) AF的值送入CF
该指令影响标志位AF和CF,对其他标志位无定义
例:
MOV AL, 34H
SUB AL, 09H ; AL=2BH, AF=1, CF=0
AAS ; AL=05H, AF=1, CF=1
3. 未组合BCD码乘法指令调整指令 AAM
指令格式: AAM
本指令对存放在AL中的积(由两个未组合BCD码相乘产生)进行调整,产生两个未组合的BCD码。
调整方法如下:
把AL中的值除以10, 商放在AH中,余数放在AL中。
该指令影响标志位SF, ZF, PF, 对其他标志位无影响。
MOV AL, 03H
MOV BL, 04H
MUL BL ; AL=0CH, AH=00H
AAM ; AL=02H, AH=01H
4. 未组合BCD码除法指令调整指令 AAD
指令格式: AAD
本指令与其他调整指令在使用顺序上不同。本指令在调用除运算指令之前调用。把存放在AH和AL中的两位未组合BCD码调整为一个二进制数存放在AL中。
调整方法为:
(AL)=(AL)+10*(AH), (AH)=0
由于上述调整,存放在AL和AH中的非组合BCD码的高4位应为0,该指令影响标志位SF, ZF, PF, 对其他标志位无影响
例:
MOV AH, 04H
MOV AL, 03H
MOV BL, 08H
AAD ; AL=2BH, AH=00H
DIV BL ; AL=05H, AH=03H
例: 写出(DX)=UP1+UP2-UP3
MOV AX, 0
MOV AL, UP1
ADD AL, UP2
AAA
MOV DL, AL
MOV AL, UP1+1
ADC AL, UP2+1
AAA
XCHG AL, DL
SUB AL, UP3
AAS
XCHG AL, DL
SBB AL, UP3+1
AAS
MOV DH, AL