二、未组合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