CRLF MACRO
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM
CHAR MACRO
MOV DL,2DH
MOV AH,02H
INT 21H
ENDM
ZERO MACRO
MOV DL,30H
MOV AH,02H
INT 21H
ENDM
FINS MACRO
MOV AX,4C00H
INT 21H
ENDM
DATA SEGMENT
ERR DB 0D,0AH,'INPUT ERROR!',0DH,0AH,'$'
DA1 DB 32 DUP(?)
DA2 DB 32 DUP(?)
CHA DB 5 DUP(?)
DATA ENDS
STACK SEGMENT
STA DB 32 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
MOV SP,AX
LEA SI,DA1
LEA DI,CHA
CALL INPUT ;输入调用
PUSH CX
LEA SI,DA1
LEA DI,CHA
MOV DX,[DI]
CMP DX,2DH
JNZ N1
CHAR
N1: CALL DISPL ;显示加数A
CRLF
MOV DL,2BH ;"+"
MOV AH,02H
INT 21H
CRLF
LEA SI,DA2
LEA DI,CHA+1
CALL INPUT ;输入调用
PUSH CX
LEA SI,DA2
LEA DI,CHA+1
MOV DX,[DI]
CMP DX,2DH
JNZ N2
CHAR
N2: CALL DISPL ;显示加数B
CRLF
MOV DL,3DH ;"="
MOV AH,02H
INT 21H
CRLF
POP DX ;BB
POP CX ;AA
PUSH CX
PUSH DX
MOV AL,BYTE PTR CHA
CMP AL,BYTE PTR CHA+1
JNZ S1
LEA AX,DA1 ;AA
LEA BX,DA2 ;BB
ADD AX,CX
ADD BX,DX
CMP CX,DX ;比较A,B的位数
JC BB1
AA1: MOV SI,AX ;A的位数大
MOV DI,BX
MOV DX,CX
POP CX
PUSH CX
CALL ADDA
POP DX
POP CX
MOV BX,CX
LEA SI,DA1
TT: MOV AL,BYTE PTR CHA
CMP AL,2DH
JNZ A1
CHAR
A1: CALL DISPL
CRLF
FINS ;结束,返回DOS
BB1: MOV SI,BX ;B的位数大
MOV DI,AX
CALL ADDA
POP DX
MOV BX,DX
LEA SI,DA2
JMP TT
S1: CMP CX,DX ;比较A,B位数
JG AA2
JC BB2
CC2: LEA SI,DA1 ;A,B位数相同
LEA DI,DA2
C2: MOV AL,[SI]
MOV BL,[DI]
CMP AL,BL
JG AA2 ;A大
JC BB2 ;B大
INC SI
INC DI
DEC CX
JNZ C2
ZERO ;输出0
FINS
AA2: LEA AX,DA1 ;A的位数大
LEA BX,DA2
POP DX ;BB
POP CX ;AA
PUSH CX
PUSH DX
ADD AX,CX
ADD BX,DX
MOV SI,AX
MOV DI,BX
MOV DX,CX
POP CX
PUSH CX
CALL SUBS
POP DX
POP CX
MOV BX,CX
LEA SI,DA1
JMP TT
BB2: LEA AX,DA1 ;B的位数大
LEA BX,DA2
POP DX ;BB
POP CX ;AA
PUSH CX
PUSH DX
ADD AX,CX
ADD BX,DX
MOV SI,BX
MOV DI,AX
CALL SUBS
POP DX
MOV BX,DX
LEA SI,DA2
MOV AL,BYTE PTR CHA+1
CMP AL,2DH
JNZ B2
CHAR
B2: CALL DISPL
CRLF
FINS ;结束,返回DOS
DISPL PROC NEAR ;子功能-显示
DS0: MOV DL,[SI]
CMP DL,00H
JNZ DS2
INC SI
DEC BX
JNZ DS0
ZERO
RET
DS1: MOV DL,[SI]
DS2: ADD DL,30H
MOV AH,02H
INT 21H
INC SI
DEC BX ;修改偏移量
JNZ DS1
RET
DISPL ENDP
INPUT PROC NEAR
XOR CX,CX ;CX清零
MOV BYTE PTR[SI],00H ;最高位0
MOV BYTE PTR[DI],00H
INC SI
INC CX
FF: MOV AH,01H
INT 21H
CMP AL,0DH
JZ NEXT
CMP AL,2DH
JZ D1
SUB AL,30H
JC ER
CMP AL,0AH
JNC ER
MOV [SI],AL
INC SI
INC CX
CMP CX,1FH
JC FF
NEXT: CMP CX,01H
JZ ER
MOV BX,CX
RET
ER: LEA DX,ERR
MOV AH,09H
INT 21H
CRLF
JMP FF
D1: MOV BYTE PTR[DI],2DH
JMP FF
INPUT ENDP
ADDA PROC NEAR ;加法
CLC
DEC SI
DEC DI
ADD1: MOV AL,[SI]
MOV BL,[DI]
ADC AL,BL
AAA
MOV [SI],AL
DEC SI
DEC DI
DEC DX
DEC CX
JNZ ADD1
ADD2: MOV AL,[SI] ;最高位加
ADC AL,00H
AAA
MOV [SI],AL
PUSHF
CMP DX,00H
JZ ADD3
POPF
DEC SI
DEC DI
DEC DX
JNZ ADD2
RET
ADD3: POPF
RET
ADDA ENDP
SUBS PROC NEAR ;减法
CLC
DEC SI
DEC DI
SUB1: MOV AL,[SI]
MOV BL,[DI]
SBB AL,BL
AAS
MOV [SI],AL
DEC SI
DEC DI
DEC DX
DEC CX
JNZ SUB1
SUB2: MOV AL,[SI] ;最高位减
SBB AL,00H
AAS
MOV [SI],AL
PUSHF
CMP DX,00H
JZ SUB3
POPF
DEC SI
DEC DI
DEC DX
JNZ SUB2
RET
SUB3: POPF
RET
SUBS ENDP
CODE ENDS
END START