8086指令系統(tǒng)---算術指令(二)
注意:如果是兩個ASCII碼數(shù)相乘,要先將它們轉換成非壓縮BCD碼。
AAD的調整方法為:
執(zhí)行除法指令之前,對AX中的非壓縮BCD碼(被除數(shù))執(zhí)行:
?。ˋL)←(AH)×10+(AL)
(AH)← 0
與其它調整指令不同的是,AAD用在DIV指令之前,即先將AX中的被除數(shù)調整成二進制數(shù),并存放在AL中,再用DIV指令作二進制數(shù)的除法。AX中的被除數(shù)是二位非壓縮BCD碼,AH中的十位數(shù)乘10,再加上AL中的個位數(shù),即轉換為二進制數(shù)。本文引用地址:http://m.butianyuan.cn/article/201611/322191.htm
表3.3 ASCII和BCD碼
十進制數(shù)字 | ASCII碼 | 壓縮BCD碼 | 非壓縮BCD碼 |
0 | 0011 0000 | 0000 | 0000 0000 |
1 | 0011 0001 | 0001 | 0000 0001 |
2 | 0011 0010 | 0010 | 0000 0010 |
3 | 0011 0011 | 0011 | 0000 0011 |
4 | 0011 0100 | 0100 | 0000 0100 |
5 | 0011 0101 | 0101 | 0000 0101 |
6 | 0011 0110 | 0110 | 0000 0110 |
7 | 0011 0111 | 0111 | 0000 0111 |
8 | 0011 1000 | 1000 | 0000 1000 |
9 | 0011 1001 | 1001 | 0000 1001 |
例ASCII碼轉換為BCD碼。
ASC DB 9562481273 ; ASCII string
ORG 0010H
UNPACK DB 10 DUP(?) ; store BCD number
… …
MOV CX,10 ; load the counter
SUB BX,BX ; clear BX
AGAIN: MOV AL,ASC[BX]; move to AL content of mem [BX+ASC]
AND AL,0FH ; mask the upper nibble
MOV UNPACK[BX],AL ; move to mem [BX+UNPACK] the AL
NC BX ; make the pointer to point at next ASCII number
LOOP AGAIN ; loop until finished
上例中的AND指令完成邏輯與操作,AL寄存器的內容和0FH相與,結果使ASCII碼的高4位清零,低4位保持不變,于是一個ASCII碼數(shù)就轉換成了BCD碼。
例編寫程序,實現(xiàn)BCD數(shù)據(jù)的加法和減法。
① BCD3←BCD1+BCD2 ; BCD3=2784+1839=4623
② BCD3←BCD1-BCD2 ; BCD3=2784-1839=0945
編寫程序如下:
DATA SEGEMENT
BCD1 DB 84H,27H ; BCD format of 2784
BCD2 DB 39H,18H ; BCD format of 1839
BCD3 DB 2 DUP(?)
DATA ENDS
① MOV AL,BCD1 ; AL←84H
ADD AL,BCD2 ; AL←84H+39H=0BDH (B>9,D>9)
DAA ; AL←0BDH+06+60H=23H, AF=1,CF=1
MOV BCD3,AL ; BCD3←23H
MOV AL,BCD1+1 ; AL←27H
ADC AL,BCD2+1 ; AL←27H+18H+1=40H, AF=1,CF=0
DAA ; AL←40H+06=46H, because AF=1
MOV BCD3+1,AL ; BCD3+1←46H
② MOV AL,BCD1 ; AL←84H
SUB AL,BCD2 ; AL←84H-39H=4BH (4≯9,B>9)
DAS ; AL←4BH-06=45H, AF=1, CF=0
MOV BCD3,AL ; BCD3←45H
MOV AL,BCD1+1 ; AL←27H
SBB AL,BCD2+1 ; AL←27H-18H=0FH
DAS ; AL←0FH-06=09H, because F>9
MOV BCD3+1,AL ; BCD3+1←09H
使用DAA和DAS指令,注意:
·被調整的數(shù)必須在AL寄存器中;
·影響除OF外的其它條件碼標志;
·DAA必須緊接在加指令之后,DAS必須緊接在減指令之后。
例兩個ASCII碼數(shù)5和2相加,要求結果也為ASCII碼。
MOV AL,5 ; AL←35H
ADD AL,2 ; AL←35H+32H=67H, AF=0
AAA ; changes 67H to 07H,
OR AL,30 ; OR AL with 30H to get ASCII
MOV AX,0105H ; unpacked BCD for 15
MOV CL,07
SUB AL,CL ; (AL)←05-07 =-2 (FEH)
AAS ; adjusted: 0FE-06=0F8→08→(AL),
; 01-1=00→(AH), leaving (AX)=0008
例兩個ASCII碼數(shù)7和8相乘,要求結果也為ASCII碼。
MOV AL,7 ; (AL)=37H
AND AL,0FH ; (AL)=07 unpacked BCD
MOV DL,6 ; (DL)=36H
AND DL,0FH ; (DL)=06 unpacked BCD
MUL DL ; (AX)=07×06=002AH=42
AAM ; (AX)=0402 (7×6=42 unpacked BCD)
OR AX,3030H ; (AX)=3432 result in ASCII
例編寫ASCII碼數(shù)的除法程序。
MOV AX,3539H ; (AX)=3539, ASCII for 59
AND AX,0F0FH ; (AH)=05,(AL)=09,unpacked BCD data
AAD ; (AX)=003BH=59
MOV BH,08H ; divide by 08
DIV BH ; 3BH/8 gives (AL)=07,(AH)=03
OR AX,3030H ; (AL)=37H (quotient), (AH)=33H (remainder)
評論