DATA1 DB 31H,32H,38H,34H,37H ;定義DATA1為被加數
DATA2 DB 34H,35H,39H,37H,31H ;定義DATA2為加數
DATAS ENDS
STACKS SEGMENT ;堆棧段
STA DB 64 DUP(0) ;(偽指令)為STA預留64個字節的存儲空間
SP_TOP DB 0 ;定義SP_TOP單元的數值為0
STACKS ENDS
CODES SEGMENT ;代碼段
ASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX ; 設置數據段
MOV AX,STACKS
MOV SS,AX ; 設置堆棧段
LEA SP,SP_TOP ; 設置棧頂指針
MOV SI,OFFSET DATA1 ;把DATA1偏移量地址賦予SI
MOV BX,05 ;
CALL DISPL ; 顯示被加數
CALL CRLF ; 回車、換行
MOV SI,OFFSET DATA2 ; 把DATA2偏移量地址賦予SI
MOV BX,05 ;
CALL DISPL ; 顯示加數
CALL CRLF ; 回車、換行
MOV DI,OFFSET DATA1 ; 把DATA1偏移量地址賦予DI
CALL ADDA ;調用ADDA子程序,實行加法運算
MOV BX,05 ;
CALL DISPL ; 顯示結果
CALL CRLF ; 回車、換行
MOV AX,4C00H ;
INT 21H ;調用DOS21H功能,返回
CRLF PROC NEAR ;回車、顯示功能過程定義,屬性為NEAR
MOV DL,0DH ;把回車的ASCII碼0DH傳給DL
MOV AH,02H ;送DOS 的中斷調用功能號
INT 21H ; DOS 的中斷調用
MOV DL,0AH ; 把換行的ASCII碼0AH傳給DL
MOV AH,02H ; 送DOS 的中斷調用功能號
INT 21H ; DOS 的中斷調用
RET ; 返回
CRLF ENDP ;完成過程定義
DISPL PROC NEAR ;顯示功能過程定義,屬性為NEAR
DSL: MOV AH,02 ;送顯示功能號
MOV DL,[SI+BX-1] ;顯示字符串中壹字符
INT 21H ; DOS 的中斷調用
DEC BX ;BX減1,修改偏移量
JNZ DSL ;如果BX未減到零,跳到DSL執行指令
RET ;返回
DISPL ENDP ;完成顯示功能子程序定義
ADDA PROC NEAR ;實行加法運算子程序過程定義,屬性為NEAR
MOV DX,SI
MOV BP,DI
MOV BX,05
TRAN_HEX: SUB BYTE PTR[SI+BX-1],30H ;把ASCII碼數轉化為十六進制
SUB BYTE PTR[DI+BX-1],30H
DEC BX ; BX減1,修改偏移量
JNZ TRAN_ HEX ; 如果BX未減到零,跳到TRAN_ HEX執行指令
MOV SI,DX
MOV DI,BP
MOV CX,05 ; 包括進位,***5位
CLC ;進位標誌位CF清零 (clear carry flag)
THE_ADD: MOV AL,[SI]
MOV BL,[DI]
ADC AL,BL ; 帶進位相加,把結果存在AX
AAA ;進行AAA調整,非結合BCD碼的加法調整
MOV [SI],AL ; 結果送被加數區
INC SI ;SI加1
INC DI ;DI加1(指向下壹位)
LOOP THE_ADD ;循環
MOV SI,DX
MOV DI,BP
MOV BX,05
TRAN_ASCI: ADD BYTE PTR[SI+BX-1],30H
ADD BYTE PTR[DI+BX-1],30H
;使用PTR轉換屬性並相加,將十六進制數轉化為ASCII表示
DEC BX ; BX減1,修改偏移量
JNZ TRAN_ASCI ; 如果BX未減到零,跳到TRAN_ASCI 執行指令
RET ;返回
ADDA ENDP ;加法子程序定義完成
CODES ENDS ;代碼段完成
END START