;此程序实现原码的加法运算
DATAS SEGMENT
;此处输入数据段代码
STRING1 DB 'THE OPERATE:$'
STRING2 DB 'OVERFLOW$'
STRING3 DB 'ERROR! INPUT AGAIN:$'
STRING4 DB 'THE RESULT:$'
SDATA1_H DB 10H
SDATA1_L DB 01H
SDATA2_H DB 32H
SDATA2_L DB 09H
RDATA_H DB ?
RDATA_L DB ?
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
MAIN PROC FAR
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
LEA DX,STRING1
MOV AH,09H
INT 21H
INPUT:
MOV AH,01H
INT 21H
CMP AL,'+'
JZ OADD
CMP AL,'-'
JZ OSUB
LEA DX,STRING3
MOV AH,09H
INT 21H
JMP INPUT
OSUB:
MOV AH,SDATA2_H
XOR AH,80H
MOV SDATA2_H,AH
OADD:
MOV AH,SDATA1_H
AND AH,80H
MOV BH,AH;保存被加数符号位
MOV AL,SDATA2_H
AND AL,80H
XOR AH,AL
CMP AH,0
JZ DADD
DSUB:
CALL INIT
CALL NSUB
JMP EXIT1
DADD:
CALL INIT
CALL NADD
EXIT1:
RET
MAIN ENDP
INIT PROC NEAR
MOV AH,SDATA1_H
AND AH,7FH;清0被加数符号位
MOV AL,SDATA2_H
AND AL,7FH;清0加数符号位
RET
INIT ENDP
NADD PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CH,SDATA1_L
MOV CL,SDATA2_L
ADD CH,CL
MOV RDATA_L,CH
ADC AH,AL
MOV RDATA_H,AH
AND AH,80H
CMP AH,0
JNZ EXIT2
AND AH,7FH
OR AH,BH
CALL PRINT
JMP EXIT3
EXIT2:
MOV DL,13
MOV AH,02H
INT 21H
MOV DL,10
MOV AH,02H
INT 21H
LEA DX,STRING2
MOV AH,09H
INT 21H
POP DX
POP CX
POP BX
POP AX
RET
EXIT3:
POP DX
POP CX
POP BX
POP AX
RET
NADD ENDP
NSUB PROC NEAR
PUSH AX
PUSH CX
MOV CH,SDATA1_L
MOV CL,SDATA2_L
SBB CH,CL
MOV RDATA_L,CH
SBB AH,AL
MOV RDATA_H,AH
AND AH,80H
CMP AH,0
JZ OPERATE
CALL CMPT
OPERATE:
CALL PRINT
POP CX
POP AX
RET
NSUB ENDP
CMPT PROC NEAR
PUSH AX
PUSH BX
MOV AH,RDATA_L
XOR AH,0FFH
ADD AH,1
MOV RDATA_L,AH
MOV AH,RDATA_H
XOR AH,0FFH
XOR BH,80H
AND AH,7FH
OR AH,BH
MOV RDATA_H,AH
POP BX
POP AX
RET
CMPT ENDP
PRINT PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV DL,13
MOV AH,02H
INT 21H
MOV DL,10
MOV AH,02H
INT 21H
LEA DX,STRING4
MOV AH,09H
INT 21H
MOV BL,RDATA_L
MOV BH,RDATA_H
MOV CX,16
PEAT:
ROL BX,1
MOV DL,BL
AND DL,01H
ADD DL,30H
MOV AH,02H
INT 21H
DEC CX
JNZ PEAT
POP DX
POP CX
POP BX
POP AX
RET
PRINT ENDP
CODES ENDS
END START