新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 8086指令系統---算術指令(二)

        8086指令系統---算術指令(二)

        作者: 時間:2016-11-27 來源:網絡 收藏


          注意:如果是兩個ASCII碼數相乘,要先將它們轉換成非壓縮BCD碼。

          AAD的調整方法為:
          執行除法指令之前,對AX中的非壓縮BCD碼(被除數)執行:
           (AL)←(AH)×10+(AL)
           (AH)← 0

          與其它調整指令不同的是,AAD用在DIV指令之前,即先將AX中的被除數調整成二進制數,并存放在AL中,再用DIV指令作二進制數的除法。AX中的被除數是二位非壓縮BCD碼,AH中的十位數乘10,再加上AL中的個位數,即轉換為二進制數。

        本文引用地址:http://www.104case.com/article/201611/322191.htm

                     表3.3 ASCII和BCD碼

        十進制數字
        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碼數就轉換成了BCD碼。


         例編寫程序,實現BCD數據的加法和減法。

            ① 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指令,注意:
           ·被調整的數必須在AL寄存器中;
           ·影響除OF外的其它條件碼標志;
           ·DAA必須緊接在加指令之后,DAS必須緊接在減指令之后。

          例兩個ASCII碼數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

         例編寫15和7的非壓縮BCD碼的減法程序,要求結果也為非壓縮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

         例兩個ASCII碼數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碼數的除法程序。

             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)


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 繁昌县| 昌乐县| 灵山县| 武隆县| 宁陵县| 南丹县| 哈尔滨市| 隆尧县| 威远县| 柳林县| 陆丰市| 阿拉尔市| 东源县| 江安县| 咸阳市| 元谋县| 都匀市| 仁布县| 腾冲县| 十堰市| 阳信县| 喀喇沁旗| 稷山县| 盐边县| 沛县| 秀山| 云梦县| 库尔勒市| 虞城县| 赤峰市| 泾川县| 东丰县| 文山县| 牙克石市| 三亚市| 维西| 通化县| 土默特左旗| 太原市| 邵武市| 常熟市|