學習微機已經不久了,彙編卻還很差勁,就借寫博客的機會把自己覺得重要的知識點記錄下來吧!
這是一個五位十進制數乘法計算並以十進制數的形式打印的彙編程序,註釋十分詳盡!
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