日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

汇编语言实现计算器---可加减乘除括号负数混合运算

發(fā)布時間:2023/12/15 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言实现计算器---可加减乘除括号负数混合运算 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

微機原理的大作業(yè),用匯編寫一個簡單的計算器
實現(xiàn)中綴表達(dá)式計算
即(X–Y)*z/y+x=
可以輸入負(fù)數(shù),可以輸入多位數(shù)

DATAS SEGMENT STR6 DB 'please input a formula:' ,'$' STR7 DB 'CONTINUE(Y/N)?$' SIGN1 DW 0 SIGN2 DW 0 SIGN3 DB 1 ;記錄上一個輸入的字符是數(shù)字還是符號 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 ;調(diào)試用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 ;轉(zhuǎn)入符號處理INC SIGN1 ;數(shù)字處理MOV SIGN3,0SUB AL,30H MOV AH,0XCHG AX,[DI] ;第一次放入的數(shù)字不乘十,之后放入的數(shù)字先乘十在加上新來的MUL BXMOV BX,10ADD [DI],AXJMP INPUT INPUTWRONG:HHHCSHOW INPUTWARNHHHCJMP INPUTLET0: ;=號轉(zhuǎn)入CMP WORD PTR SIGN2,0 ;如果不缺括號繼續(xù)往下處理JE LET1JMP LET8 LET1:CMP WORD PTR SIGN1,0 ;沒有數(shù)字JE LET2 ADD DI,2 ;已有數(shù)字而且檢測到了運算符 數(shù)字堆棧后移一位 MOV WORD PTR SIGN1,0 ;清空標(biāo)記LET2:CALL DYFQ cmp ch,1jz nex mov SIGN3,1jmp nextnex:mov sign3,0 next:CMP CH,5 ;是不是左括號JNE LET3 ;不是下跳 INC WORD PTR SIGN2 ;是變更配對標(biāo)志位 LET3:CMP CH,1 ;是不是右括號JNE LET4 ; DEC WORD PTR SIGN2 LET4:CMP BYTE PTR[SI],'$' JE LET6CMP CH,[SI] ;比較堆棧棧頂運算符優(yōu)先級JA LET6 ;若棧頂?shù)男? CMP BYTE PTR [SI], 2 ;是不是左括號?JNE LET5DEC SI JMP INPUT LET5:CMP [SI],6JZ NEGATIVE RETURN:DEC SI ;吐出堆棧中運算符進(jìn)行相應(yīng)運算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 ;放進(jìn)堆棧 放的是符號INC SI ;移位CMP CH,5 ;是不是左括號JNE LET7 MOV CH,2 LET7:MOV [SI],CH ;SI里放得是優(yōu)先級編碼 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 ;初始是指向新數(shù)的CMP WORD PTR[DI],0JGE K1NEG WORD PTR[DI]MOV DL,'-'MOV AH,2INT 21H and [di],7fh ;輸出負(fù)數(shù) 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

測試結(jié)果如下圖所示

總結(jié)

以上是生活随笔為你收集整理的汇编语言实现计算器---可加减乘除括号负数混合运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。