新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 8086指令系統(tǒng)---算術(shù)指令(二)

8086指令系統(tǒng)---算術(shù)指令(二)

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò) 收藏


  注意:如果是兩個(gè)ASCII碼數(shù)相乘,要先將它們轉(zhuǎn)換成非壓縮BCD碼。

  AAD的調(diào)整方法為:
  執(zhí)行除法指令之前,對(duì)AX中的非壓縮BCD碼(被除數(shù))執(zhí)行:
  ?。ˋL)←(AH)×10+(AL)
   (AH)← 0

  與其它調(diào)整指令不同的是,AAD用在DIV指令之前,即先將AX中的被除數(shù)調(diào)整成二進(jìn)制數(shù),并存放在AL中,再用DIV指令作二進(jìn)制數(shù)的除法。AX中的被除數(shù)是二位非壓縮BCD碼,AH中的十位數(shù)乘10,再加上AL中的個(gè)位數(shù),即轉(zhuǎn)換為二進(jìn)制數(shù)。

本文引用地址:http://butianyuan.cn/article/201611/322191.htm

             表3.3 ASCII和BCD碼

十進(jìn)制數(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碼轉(zhuǎn)換為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寄存器的內(nèi)容和0FH相與,結(jié)果使ASCII碼的高4位清零,低4位保持不變,于是一個(gè)ASCII碼數(shù)就轉(zhuǎn)換成了BCD碼。


 例編寫程序,實(shí)現(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指令,注意:
   ·被調(diào)整的數(shù)必須在AL寄存器中;
   ·影響除OF外的其它條件碼標(biāo)志;
   ·DAA必須緊接在加指令之后,DAS必須緊接在減指令之后。

  例兩個(gè)ASCII碼數(shù)5和2相加,要求結(jié)果也為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

 例編寫15和7的非壓縮BCD碼的減法程序,要求結(jié)果也為非壓縮BCD碼。

     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

 例兩個(gè)ASCII碼數(shù)7和8相乘,要求結(jié)果也為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)


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


技術(shù)專區(qū)

關(guān)閉