彙編入門---五位十進制數乘法計算

  學習微機已經不久了,彙編卻還很差勁,就借寫博客的機會把自己覺得重要的知識點記錄下來吧!

  這是一個五位十進制數乘法計算並以十進制數的形式打印的彙編程序,註釋十分詳盡!

STACK1  SEGMENT STACK
         DW 256 DUP(?)
STACK1  ENDS

DATA    SEGMENT
MES1    DB 'The result is: $'
MES2    DB 'ERROR EXIT!$'
DATA1   DB 05H,04H,03H,02H,05H;被乘數爲52345,非壓縮十進制BCD碼存放乘數
DATA2   DB 03H                ;被乘數爲3
RESULT  DB 06H DUP(0) 
DATA    ENDS

CODE    SEGMENT 
        ASSUME CS:CODE,DS:DATA,SS:STACK1
START:  MOV  AX,DATA
        MOV  DS,AX
        ;把被乘數3存放到BL***********************************
        MOV  SI,OFFSET DATA2    
        MOV  BL,[SI]
        AND  BL,0FH
        ;檢查被乘數是否爲BCD數,否則跳轉報錯*****************
        CMP  BL,09H  
        JNC  ERROR 
        ;****************************************************
        MOV  SI,OFFSET DATA1
        MOV  DI,OFFSET RESULT   ;RESULT中倒着存放乘積
        MOV  CX,0005H           ;LOOP循環五次 
        ;****************************************************
A1:     MOV  AL,[SI]            ;從低位開始乘
        AND  AL,0FH             ;取第四位,因爲已經檢驗過是非壓縮十進制數了
                                ;所以沒多大用
        ;檢查被乘數是否爲BCD數,否則跳轉報錯*****************
        CMP  AL,09H  
        JNC  ERROR              ;AL減9,不產生借位,則不是BCD數,報錯,CMP
                                ;只改變標誌位
        ;****************************************************
        MUL  BL                 ;乘3,結果存入AX中,所以不需要清AH
        AAM                     ;將結果調整爲非壓縮的十進制數
        ADD  AL,[DI]            ;將低位進位加上
        AAA                     ;將結果調整爲非壓縮的十進制數
        MOV  [DI],AL            ;存放乘積
        INC  DI     
        MOV  [DI],AH            ;將低位的進位存入下個RESULT存儲單元
        INC  SI
        LOOP A1                 ;循環將五位被乘數乘3,產生的RESULT空間
                                ;內產生6字節數,最後一字節用來存放最高位
                                ;的進位,RESULT中的每一字節存放非壓縮十進制數
        ;**************************************************** 
        MOV  DX,OFFSET MES1     ;調用9號中斷顯示字符串
        MOV  AH,09H
        INT  21H
        ;調用子程序SHOW顯示乘積
        MOV  CX,06H             ;準備循環顯示6位十進制乘積
        MOV  SI,OFFSET RESULT                       
A2:     CALL SHOW
        DEC  SI  
        LOOP A2
        CALL WAIT1              ;等待按鍵後返回DOS
        
;顯示一個非壓縮十進制數(一字節)********************************************
SHOW    PROC NEAR               ;輸入參數爲SI,即結果的存放首地址
        MOV  AL,DS:[SI+5]       ;由於乘積六位爲倒着存放,所以顯示也爲倒着顯示
        AND  AL,0FH             
        ;CMP  AL,0AH            ;因爲已經經過AAA,AAM調整,非壓縮十進制數不會出現大於9的情況
        ;JB   C3
        ;ADD  AL,07H
C3:     ADD  AL,30H
        MOV  DL,AL
        MOV  AH,02H
        INT  21H
        RET
SHOW    ENDP   
;等待部分********************************************************************
WAIT1   PROC NEAR
        MOV  AH,1
        INT  16H
        JZ   WAIT1    
        MOV  AX,4C00H
        INT  21H          
WAIT1   ENDP
;報錯部分********************************************************************
ERROR   PROC NEAR 
        MOV  DX,OFFSET MES2
        MOV  AH,09H
        INT  21H
        MOV  AX,4C00H
        INT  21H
        RET
ERROR   ENDP    

CODE    ENDS
        END   START    




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章