概述
要進行十進制數的運算就必須先把十進制數轉換為二進制數,用相應的二進制運算指令進行運算,然後再將運算得到的二進制結果轉換為十進制數加以輸出。為了便於十進制數的運算,8086指令系統中提供了一組專門用於十進制調整的指令,它們可將由二進制運算指令得到的結果進行調整,從而得到十進制數的結果。
表示十進制數的BCD碼分為兩種:壓縮BCD碼和非壓縮BCD碼。
1、壓縮BCD碼
壓縮的BCD碼用四位二進制數表示一個十進制數位,整個十進制數形式為一個順序的以4位為一組的數串。例如,十進制數8564,它的壓縮BCD碼形式為:1000 0101 0110 0100;用十六進制表示為8564H。
2、非壓縮BCD碼
非壓縮的BCD碼以8位二進制數為一組,表示一個十進制數位,8位中的低4位表示一位8421BCD碼,而高4位則沒有意義,通常將高4位清0。例如,8564的非壓縮BCD碼形式為:00001000 00000101 00000110 00000100;用十六進制表示為08050604H,為四位元組數據。
壓縮的BCD碼調整指令有2條,它們是:DAA和DAS指令;非壓縮的BCD碼調整指令有4條,它們是:AAA、AAS、AAM和AAD指令。
調整指令
對非壓縮BCD碼,有AAA、AAS、AAM和AAD四條指令,分別用於對二進制加、減、乘、除指令的結果進行調整,以得到非壓縮BCD碼錶示的十進制數結果。由於只要在調整後的結果中加上30H就成為ASCII碼,所以這組指令實際上也是針對ASCII碼的調整指令的。
調整指令AAA
語句格式:AAA
其功能是將AL中的和調整為非壓縮BCD碼並送回AL。在使用AAA指令前,必須執行ADD或ADC指令把非壓縮BCD相加,且把和存放在AL中。具體調整方法如下:
若二進制相加後(AL)的低4位是十六進制的A~F或AF=1,則:(AL)←(AL)+6;(AH)←(AH)+1;使AF=CF=l且AL高4位清零。
否則使AF=CF=0且AL高4位清零。
AAA指令除影響AF和CF標誌外,對其他標誌位均無定義。
例:非壓縮BCD碼的加法運算。
MOV AX,0535H;(AX)=0535H,表示非壓縮BCD碼55。
MOV BL,39H;(BL)=39H,表示非壓縮BCD碼9。
ADD AL,BL;二進制加法:(AL)=35H+39H=6EH。
AAA;因(AL)的低4位>9,需做ASCII調整,調整的結果使(AX)=0604H,CF=AF=1 。
調整指令AAS
語句格式:AAS
其功能是將AL中的差調整為非壓縮BCD碼並送回AL,向高位的借位在AH和CF中。在使用AAS指令之前,必須執行SUB或SBB指令把兩個非壓縮的BCD碼相減,並把差存放在AL中。具體調整方法如下:
若二進制相減後(AL)的低4位是十六迸制的A~F或AF=1,則:(AL)←(AL)一6;(AH)←(AH)+1;使AF=CF=1且AL高4位清零。
否則使AF—CF=0且AL高4位清零。
AAS指令除影響AF和CF標誌外,對其他標誌位均無定義。
例:非壓縮BCD碼的減法運算
MOV AX,0608H;(AX)=0608H,表示非壓縮BCD碼68。
M07 BL,09H;(BL)=09H,表示非壓縮BCD碼9。
SUB AL,BL;二進制減法:(AL)=08H一09H=FFH。
AAS;因(AL)的低4住>9,需做ASCII調整,調整的結果使(AX)=0509H,CF=AF=1。
調整指令AAM
語句格式:AAM
其功能是將AL中的積調整為非壓縮BCD碼並送回AX。使用AAM指令之前必須執行MUL把兩個非壓縮的BCD碼相乘(此時要求兩個非壓縮的BCD碼的高4位必須為o),乘積放在AL中。具體調整方法如下:
把AL暫存器的內容除以0AH,並把商放在AH暫存器中,餘數放在AL暫存器中。
本指令根據AL暫存器的內容設定SF、ZF和PF,對OF、CF和AF無定義。
例:非壓縮BCD碼的乘法運算。
MOV AX,0608H;(AX)=0608H,表示非壓縮BCD碼68。
MOV BL,09H;(BL)=09H,表示非壓縮BCD碼9。
MUL BL;二進制乘法:(AX)=08H×09H=0048H。
AAM; ASCII調整的結果使(AX)=0702H。
調整指令AAD
語句格式:AAD
其功能是在除法運算前,先調整被除數AX內容,將AX中的非壓縮BCD碼擴展成二進制數,即(AL)←(AH)×0AH+(AL),(AH)←0。
AAD調整指令與其他的調整指令套用情況不同。它是先將存放在AX暫存器中的兩位非壓縮BCD碼數進行調整,然後再用DIV指令除以一個非壓縮BCD碼數,這樣得到非壓縮BCD碼數的除法結果。其中,要求AL、AH和除數的高4位為0。AAD指令根據結果設定SF、ZF和PF,對OF、CF和AF無定義。
例:非壓縮BCD碼的除法運算。
MOV AX,0608H;(AX):0608H,表示非壓縮BCD碼68。
MOV BL,09H;(BL)=09H,表示非壓縮BCD碼9。
AAD;二進制擴展:(AX)=68=0044H。
DIV BL;除法運算:商(AL)=07H,餘數(AH)=05H。