生活随笔
收集整理的這篇文章主要介紹了
汇编语言实现计算器---可加减乘除括号负数混合运算
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
微機原理的大作業,用匯編寫一個簡單的計算器
實現中綴表達式計算
即(X–Y)*z/y+x=
可以輸入負數,可以輸入多位數
DATAS SEGMENT
STR6 DB
'please input a formula:' ,'$'
STR7 DB
'CONTINUE(Y/N)?$'
SIGN1 DW
0
SIGN2 DW
0
SIGN3 DB
1 ;記錄上一個輸入的字符是數字還是符號
sign4 DB
0 ;記錄打印輸出中的非零
WARN DB
'You are tring to divide 0!',0AH
,0DH
,'$'
num db
0 ;測試用
NUMBER DW
40 DUP(0)
OPERATOR DB
'$'DB
30 DUP(0)
ERROR DB
'parenthesis not paired! syntax error!$'
INPUTWARN DB
'ILLEGAL INPUT! ERROR$'
DATAS ENDS
STACKS SEGMENT STACK
S DB
256 DUP(?)
STACKS ENDS
SHOW MACRO STRINGpush AXPUSH DXMOV DX
,OFFSET STRINGMOV AH
,09HINT
21HPOP DXPOP AX
ENDM
char MACRO
char ;調試用push DXpush AXMOV DL
,charadd dl
,30hMOV AH
,02HINT
21Hpop AXpop DX
ENDM
FQ MACRO ASCII
,A
,BCMP AL
,ASCIIJNE S
&AMOV CH
,BJMP S7
ENDMHHHC MACRO MOV AH
,02HMOV DL
,0DHINT
21HMOV AH
,02HMOV DL
,0AHINT
21H
ENDMCODES SEGMENT
;MAIN PROC FAR
ASSUME CS
:CODES
,DS
:DATAS
,ES
:DATAS
,SS
:STACKS
;重寫除
0中斷
************************************************************************
INT0 PROC FAR
PUSH DX
PUSH AX
HHHC
SHOW WARN
HHHC
POP AX
POP DX
MOV AH
,4CH
INT
21H
IRET
INT0 ENDP
START
:MOV AX
,0MOV ES
,AXMOV DI
,0MOV AX
,OFFSET INT0CLD STOSWMOV AX
,SEG INT0STOSW
;將程序地址寫入中斷向量表MOV AX
,DATASMOV DS
,AXMOV ES
,AXLEA DI
,NUMBERLEA SI
,OPERATOR
START1
:MOV SIGN1
,0MOV SIGN2
,0MOV SIGN3
,1MOV SIGN4
,0MOV AX
,0MOV BX
,0MOV CX
,0MOV DX
,0HHHCSHOW STR6 HHHC
INPUT
:MOV AH
,01HINT
21HCMP AL
,'='JE LET0CMP AL
,28HJB INPUTWRONGCMP AL
,39HJA INPUTWRONGCMP AL
,2FH
;判斷是否是符號,
2F是最后一個符號除號JBE LET1
;轉入符號處理INC SIGN1
;數字處理MOV SIGN3
,0SUB AL
,30H MOV AH
,0XCHG AX
,[DI
] ;第一次放入的數字不乘十,之后放入的數字先乘十在加上新來的MUL BXMOV BX
,10ADD
[DI
],AXJMP INPUT
INPUTWRONG
:HHHCSHOW INPUTWARNHHHCJMP INPUTLET0
: ;=號轉入CMP WORD PTR SIGN2
,0 ;如果不缺括號繼續往下處理JE LET1JMP LET8
LET1
:CMP WORD PTR SIGN1
,0 ;沒有數字JE LET2 ADD DI
,2 ;已有數字而且檢測到了運算符 數字堆棧后移一位 MOV WORD PTR SIGN1
,0 ;清空標記LET2
:CALL DYFQ cmp ch
,1jz nex mov SIGN3
,1jmp nextnex
:mov sign3
,0
next
:CMP CH
,5 ;是不是左括號JNE LET3
;不是下跳 INC WORD PTR SIGN2
;是變更配對標志位
LET3
:CMP CH
,1 ;是不是右括號JNE LET4
; DEC WORD PTR SIGN2
LET4
:CMP BYTE PTR
[SI
],'$' JE LET6CMP CH
,[SI
] ;比較堆棧棧頂運算符優先級JA LET6
;若棧頂的小 CMP BYTE PTR
[SI
], 2 ;是不是左括號?JNE LET5DEC SI JMP INPUT
LET5
:CMP
[SI
],6JZ NEGATIVE
RETURN
:DEC SI
;吐出堆棧中運算符進行相應運算MOV CL
,[SI
]CALL YSJMP LET4NEGATIVE
:DEC SIMOV
[SI
],3FH
;以問號作為求反操作碼inc SIJMP RETURNLET6
: ;運算符堆棧空跳過來的或者要存放入棧CMP CH
,0 ;等號?JE OUTPUTCMP CH
,1 ;右括號 JE INPUT
;右括號不保存INC SI
;指向棧的開始,第一個是$MOV
[SI
],AL
;放進堆棧 放的是符號INC SI
;移位CMP CH
,5 ;是不是左括號JNE LET7 MOV CH
,2
LET7
:MOV
[SI
],CH
;SI里放得是優先級編碼 JMP INPUT
LET8
:LEA DX
,ERRORMOV AH
,09HINT
21HJMP EXIT
FQ MACRO ASCII
,A
,BCMP AL
,ASCIIJNE S
&AMOV CH
,BJMP S7
ENDMDYFQ PROC FQ
28H
,1,5
S1
: FQ
29H
,2,1
S2
: FQ
2AH
,3,4
S3
: FQ
2FH
,4,4
S4
: FQ
2BH
,5,3
S5
: FQ
3DH
,6,0
S6
: CMP SIGN3
,1JZ NEWQFQ
2DH
,7,3NEWQ
:FQ
2DH
,7,6S7
: RET
DYFQ ENDPOUTPUT
:SUB DI
,2 ;初始是指向新數的CMP WORD PTR
[DI
],0JGE K1NEG WORD PTR
[DI
]MOV DL
,'-'MOV AH
,2INT
21H and
[di
],7fh
;輸出負數
K1
: MOV BX
,10000MOV CX
,5K2
: MOV AX
,[DI
]CWDDIV BXMOV
[DI
],DXCMP AL
,0 ;如果是
0就不打印出來JNZ K3CMP SIGN4
,0JNZ K3CMP CX
,1JNZ DO2MOV AH
,02hMOV DL
,2EHINT
21HDO2
:CMP CX
,1JZ K3JMP K4
K3
:MOV DL
,ALADD DL
,30HMOV AH
,02HINT
21HMOV sign4
,1K4
: MOV AX
,BXMOV DX
,0MOV BX
,10DIV BXMOV BX
,AX
;基值除
10LOOP K2HHHCSHOW STR7MOV AH
,01HINT
21HCMP AL
,'N'JE EXITCMP AL
,'n'JE EXITMOV WORD PTR
[DI
+2],0LEA DI
,NUMBERLEA SI
,OPERATORJMP START1
EXIT
:MOV AH
,4CHINT
21H
YS PROC NEARPUSH AXMOV AX
,0MOV BX
,0CMP CL
,2AHJNE CHUSUB DI
,2XCHG BX
,[DI
]SUB DI
,2XCHG AX
,[DI
]IMUL BX
;有符號乘法MOV
[DI
],AXADD DI
,2JMP FINISH
CHU
:CMP CL
,2FHJNE JIASUB DI
,2XCHG BX
,[DI
]SUB DI
,2XCHG AX
,[DI
]CWDIDIV BXMOV
[DI
],AXADD DI
,2JMP FINISH
JIA
:CMP CL
,2BHJNE JIANSUB DI
,2XCHG BX
,[DI
]SUB DI
,2ADD
[DI
],BXADD DI
,2JMP FINISH
JIAN
:CMP CL
,2DHJNE NEGASUB DI
,2XCHG BX
,[DI
]SUB DI
,2SUB
[DI
],BXADD DI
,2JMP FINISH
NEGA
:CMP CL
,3FHJNE FINISHSUB DI
,2NEG word ptr
[DI
]ADD DI
,2FINISH
:POP AXRET
YS ENDP
CODES ENDS
END START
測試結果如下圖所示
總結
以上是生活随笔為你收集整理的汇编语言实现计算器---可加减乘除括号负数混合运算的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。