十进制调整指令对二进制运算结果进行十进制调整,以得到十进制的运算结果。十进制在计算机中也要用二进制表示,这就是十进制编码的十进制数: bcd 码。 8086 支持压缩的 bcd 码和非压缩的 bcd 码,相应的十进制调整指令分为压缩 bcd 码调整指令和非压缩 bcd 码调整指令。
1 .压缩 bcd 码调整指令
(1)加法的十进制调整指令 daa 语句
格式: daa
功能:如果 al 寄存器中低 4 位大于 9 或辅助进位( af ) =1 ,则( al ) = ( al ) +6 且( af ) =1 ;如果( al ) >= 0a 0h 或( cf ) =1 ,则( al ) = ( al ) +60h 且( cf ) =1 。同时, sf 、 zf 、 pf 均有影响。
【例】压缩 bcd 码的加法运算。
mov al , 68h ;( al ) =68h ,表示压缩 bcd 码 68
mov bl , 28h ;( bl ) =28h ,表示压缩 bcd 码 28
add al , bl ;二进制加法 :( al )=68h+28h=90h
daa ;十进制调整:( al ) =96h
;实现压缩 bcd 码加法: 68+28=96
(2) 减法的十进制调整指令 das 语句
格式: das
功能:如果( af ) =1 或 al 寄存器中低 4 位大于 9 ,则( al ) = ( al )- 6 且( af ) =1 ;如果( al ) >= 0a 0h 或( cf ) =1 ,则( al ) = ( al )- 60h 且( cf ) =1 。同时 sf 、 zf 、 pf 均受影响。
【例】压缩 bcd 码的减法运算。
mov al , 67h ;(al)=67h, 表示压缩 bcd 码 67
mov bl , 28h ;(bl)=28h, 表示压缩 bcd 码 28
sub al , bl ; ( al )=67h-28h=3fh
das ;十进制调整:( al ) =39h;
;实现压缩 bcd 码减法: 67 - 28=39
2 .非压缩 bcd 码调整指令
(1)加法的非压缩 bcd 码调整指令 aaa
语句格式: aaa
功能:如果 al 的低 4 位大于 9 或( af ) =1 ,则:
( al ) = ( al ) +6 ( ah ) = ( ah ) +1 ( af ) = ( cf ) =1
且 al 高 4 位清零。
否则:( cf ) = ( af ) =0 al 高 4 位清零。
(2)减法的非压缩 bcd 码调整指令 aas
语句格式: aas
功能:如果 al 的低 4 位大于 9 或( af) =1 ,则:(al) = ( al )- 6
( ah ) = ( ah )- 1 ( af ) = ( cf ) =1 al 高 4 位清零。
否则:( cf ) = ( af ) =0 al 高 4 位清零。
其他标志位 of 、 pf 、 sf 、 zf 不确定。
(3)乘法的非压缩 bcd 码调整指令 aam
语句格式: aam
功能:被调整的乘积在 ax 中,对 al 按 10 取模,则:
( al )/ 0ah → ah (商): al (余数)
其中 ah 为商, al 为余数,标志位 af 、 cf 、 of 、 pf 、 sf 、 zf 受影响。
(4)除法的非压缩 bcd 码调整指令 aad
语句格式: aad
功能:除法运算前,先调整被除数 ax 内容,使:
( al ) = ( al ) + ( ah ) *0ah ( ah ) =0
即把非压缩型十进制数变成二进制数。