📄 exp.asm
字号:
DATA SEGMENT
D0 DW 10000
D1 DW 1000
D2 DW 100
D3 DW 10
ASCII DW 48
RESULT DW 0
TEMP DW 0
BUF DB 100 DUP ('$')
;BUF DB '32000-2000=' ;for debug
DATA ENDS
;=============================
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP (0)
STACK ENDS
;========================================
;=表达式格式: exp-> (exp) | digit op exp
;= digit-> '0~9'+
;= op-> + | -
;========================================
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
MAIN: ;================================Initialization
MOV AX, DATA
MOV DS, AX
MOV AX, 0
;================================
CALL SCAN
CALL CAL
CALL PRINT
;JMP MAIN
mov ah, 4ch
int 21h
;========================================
;=calculate the result
;========================================
CAL PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV RESULT, 0
MOV AX, 0
MOV DX, 0
MOV CX, '+'
MOV BX, OFFSET BUF
MOV DI, 0
L0: CMP [BX+DI], BYTE PTR '+'
JZ L1
CMP [BX+DI], BYTE PTR '-'
JZ L2
CMP [BX+DI], BYTE PTR '('
JZ L3
CMP [BX+DI], BYTE PTR ')'
JZ L4
CMP [BX+DI], BYTE PTR '='
JZ QUIT
;================================[BX+DI] = 0~9
MOV DX, 0
MUL D3
MOV DL, [BX+DI]
ADD AX, DX
MOV DX, 0
SUB AX, ASCII
INC DI
JMP L0
L1: MOV DX, RESULT
CMP CX, '+'
JNE M0
ADD DX, AX
JMP N0
M0: SUB DX, AX
N0: MOV RESULT, DX
MOV AX, 0
MOV CX, '+'
INC DI
JMP L0
L2: MOV DX, RESULT
CMP CX, '+'
JNE M1
ADD DX, AX
JMP N1
M1: SUB DX, AX
N1: MOV RESULT, DX
MOV AX, 0
MOV CX, '-'
INC DI
JMP L0
L3: PUSH CX
PUSH RESULT
MOV AX, 0
MOV CX, '+'
MOV RESULT, 0
INC DI
JMP L0
L4: MOV DX, RESULT
CMP CX, '+'
JNE M2
ADD DX, AX
JMP N2
M2: SUB DX, AX
N2: MOV AX, DX
POP RESULT
POP CX
INC DI
JMP L0
QUIT: MOV DX, RESULT
CMP CX, '+'
JNE M3
ADD DX, AX
JMP N3
M3: SUB DX, AX
N3: MOV RESULT, DX
POP DI
POP DX
POP CX
POP BX
POP AX
RET
CAL ENDP
;========================================
;========================================
;=input the expression
;========================================
SCAN PROC NEAR
PUSH AX
PUSH BX
PUSH DI
MOV BX, OFFSET BUF
MOV DI, 0
NEXT: MOV AH, 1
INT 21H
MOV [BX+DI],AL
INC DI
;MOV [BX+DI], BYTE PTR '$'
CMP AL, '='
JNE NEXT
POP DI
POP BX
POP AX
RET
SCAN ENDP
;========================================
;========================================
;=output the result
;========================================
PRINT PROC NEAR
;================================保护现场
PUSH AX
PUSH DX
PUSH RESULT
;================================
CMP RESULT, WORD PTR 0
JGE POS
MOV DL, '-' ;Its negative
MOV AH, 6
INT 21H
MOV DX, RESULT
NEG DX
MOV RESULT, DX
POS: MOV DX, 0
MOV AX, RESULT
DIV D0
MOV RESULT, DX
MOV DX, AX
ADD DX, ASCII
MOV AH, 6
INT 21H
MOV DX, 0
MOV AX, RESULT
DIV D1
MOV RESULT, DX
MOV DX, AX
ADD DX, ASCII
MOV AH, 6
INT 21H
MOV DX, 0
MOV AX, RESULT
DIV D2
MOV RESULT, DX
MOV DX, AX
ADD DX, ASCII
MOV AH, 6
INT 21H
MOV DX, 0
MOV AX, RESULT
DIV D3
MOV RESULT, DX
MOV DX, AX
ADD DX, ASCII
MOV AH, 6
INT 21H
MOV DX, RESULT
ADD DX, ASCII
MOV AH, 6
INT 21H
;================================恢复现场
POP RESULT
POP DX
POP AX
RET
PRINT ENDP
;================================
CODE ENDS
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -