日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

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

微機(jī)原理的大作業(yè),用匯編寫(xiě)一個(gè)簡(jiǎn)單的計(jì)算器
實(shí)現(xiàn)中綴表達(dá)式計(jì)算
即(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 ;記錄上一個(gè)輸入的字符是數(shù)字還是符號(hào) sign4 DB 0 ;記錄打印輸出中的非零 WARN DB 'You are tring to divide 0!',0AH,0DH,'$' num db 0 ;測(cè)試用 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 ;重寫(xiě)除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 ;將程序地址寫(xiě)入中斷向量表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 ;判斷是否是符號(hào),2F是最后一個(gè)符號(hào)除號(hào)JBE LET1 ;轉(zhuǎn)入符號(hào)處理INC SIGN1 ;數(shù)字處理MOV SIGN3,0SUB AL,30H MOV AH,0XCHG AX,[DI] ;第一次放入的數(shù)字不乘十,之后放入的數(shù)字先乘十在加上新來(lái)的MUL BXMOV BX,10ADD [DI],AXJMP INPUT INPUTWRONG:HHHCSHOW INPUTWARNHHHCJMP INPUTLET0: ;=號(hào)轉(zhuǎn)入CMP WORD PTR SIGN2,0 ;如果不缺括號(hào)繼續(xù)往下處理JE LET1JMP LET8 LET1:CMP WORD PTR SIGN1,0 ;沒(méi)有數(shù)字JE LET2 ADD DI,2 ;已有數(shù)字而且檢測(cè)到了運(yùn)算符 數(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 ;是不是左括號(hào)JNE LET3 ;不是下跳 INC WORD PTR SIGN2 ;是變更配對(duì)標(biāo)志位 LET3:CMP CH,1 ;是不是右括號(hào)JNE LET4 ; DEC WORD PTR SIGN2 LET4:CMP BYTE PTR[SI],'$' JE LET6CMP CH,[SI] ;比較堆棧棧頂運(yùn)算符優(yōu)先級(jí)JA LET6 ;若棧頂?shù)男? CMP BYTE PTR [SI], 2 ;是不是左括號(hào)?JNE LET5DEC SI JMP INPUT LET5:CMP [SI],6JZ NEGATIVE RETURN:DEC SI ;吐出堆棧中運(yùn)算符進(jìn)行相應(yīng)運(yùn)算MOV CL,[SI]CALL YSJMP LET4NEGATIVE:DEC SIMOV [SI],3FH ;以問(wèn)號(hào)作為求反操作碼inc SIJMP RETURNLET6: ;運(yùn)算符堆棧空跳過(guò)來(lái)的或者要存放入棧CMP CH,0 ;等號(hào)?JE OUTPUTCMP CH,1 ;右括號(hào) JE INPUT ;右括號(hào)不保存INC SI ;指向棧的開(kāi)始,第一個(gè)是$MOV [SI],AL ;放進(jìn)堆棧 放的是符號(hào)INC SI ;移位CMP CH,5 ;是不是左括號(hào)JNE LET7 MOV CH,2 LET7:MOV [SI],CH ;SI里放得是優(yōu)先級(jí)編碼 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就不打印出來(lái)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 ;有符號(hào)乘法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

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

總結(jié)

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

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