匯編計(jì)算器【精選文檔】_第1頁
匯編計(jì)算器【精選文檔】_第2頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、匯編計(jì)算器【精選文檔】1 項(xiàng)目特點(diǎn)及目的 本課程設(shè)計(jì)是一次程序設(shè)計(jì)方法及技能的基本訓(xùn)練,通過實(shí)際程序的開發(fā)及調(diào)試,鞏固課堂上學(xué)到的關(guān)于程序設(shè)計(jì)的基本知識(shí)和基本方法,進(jìn)一步熟悉匯編語言的結(jié)構(gòu)特點(diǎn)和使用,達(dá)到能獨(dú)立閱讀、設(shè)計(jì)編寫和調(diào)試具有一定規(guī)模的匯編程序的水平。2 題目簡(jiǎn)介 用8086匯編語言編寫一個(gè)能實(shí)現(xiàn)四則混合運(yùn)算、帶括號(hào)功能的整數(shù)計(jì)算器程序.程序能實(shí)現(xiàn)鍵盤十進(jìn)制運(yùn)算表達(dá)式的輸入和顯示(例如輸入:“1+2*(34)”),按“=”后輸出十進(jìn)制表示的運(yùn)算結(jié)果。3 程序設(shè)計(jì)要求u 遵循模塊化、結(jié)構(gòu)化的編程思路u 程序必須正確運(yùn)行u 程序簡(jiǎn)明易懂,多標(biāo)明注釋,具有良好的程序書寫風(fēng)格u 適當(dāng)優(yōu)化程序,

2、提高程序的運(yùn)行效率4 工作條件使用的設(shè)備及軟件為8086兼容機(jī)及MASM匯編開發(fā)軟件。5 題目分析根據(jù)題目要求,可以把程序的工作過程劃分為運(yùn)算表達(dá)式輸入、計(jì)算、結(jié)果輸出三部分。因此在編寫程序時(shí)可以按此把程序大致劃分為三個(gè)模塊。5。1 運(yùn)算表達(dá)式輸入用戶通過鍵盤輸入的運(yùn)算表達(dá)式為一個(gè)ASCII碼字符串,字符串的最后一個(gè)字符是“=”號(hào).對(duì)于這個(gè)運(yùn)算表達(dá)式,“+、-、/、(、)、09、=是合法的表達(dá)式內(nèi)容,其他的字符則是無法進(jìn)行運(yùn)算的非法內(nèi)容,因此需要首先進(jìn)行表達(dá)式合法性檢查。另外,由于計(jì)算機(jī)能進(jìn)行計(jì)算的是2進(jìn)制的補(bǔ)碼,因此還需要把以ASCII碼表示的數(shù)值轉(zhuǎn)換為補(bǔ)碼的形式并加以保存。當(dāng)然,控制運(yùn)算方

3、式的符號(hào)也要進(jìn)行保存.因此,“運(yùn)算表達(dá)式輸入”這個(gè)模塊可以細(xì)化為:表達(dá)式合法性檢查、數(shù)值的ASCII碼到補(bǔ)碼轉(zhuǎn)換及保存、符號(hào)的保存三個(gè)小部分,如圖1所示。圖1 “運(yùn)算表達(dá)式輸入”的流程圖5。1。1 運(yùn)算表達(dá)式合法性的檢查方法 觀察“ASCII字符編碼表”,可以發(fā)現(xiàn)“+、*、/、(、)”的ASCII碼由28H到2FH,而“09”的ASCII碼則由30H到39H,因此只需對(duì)輸入的字符一個(gè)一個(gè)地進(jìn)行數(shù)值范圍比較,看看是否處于28H39H這個(gè)范圍里面,即可區(qū)分輸入的表達(dá)式是否合法,流程圖如圖2所示。此流程圖是采用循環(huán)輸入字符的方法,每輸入一個(gè)字符即進(jìn)行判斷.讀者也可以采用輸入字符串的方法,把整個(gè)運(yùn)算表

4、達(dá)式接收完畢后再進(jìn)行判斷.圖2 運(yùn)算表達(dá)式合法性檢查流程圖一 另一方面,對(duì)于含有括號(hào)的運(yùn)算表達(dá)式,當(dāng)左括號(hào)的數(shù)量與右括號(hào)數(shù)量不相等時(shí),表達(dá)式也是非法的。因此,可以設(shè)置一個(gè)起始值為0的變量(下面稱其為配對(duì)標(biāo)志),當(dāng)輸入“(”時(shí)此變量加一,當(dāng)輸入“)”時(shí)減一,則當(dāng)表達(dá)式輸入結(jié)束時(shí),只需判定此配對(duì)標(biāo)志是否為0,即可判定左右括號(hào)數(shù)量是否相等。圖3運(yùn)算表達(dá)式合法性檢查流程圖二5.1.2 數(shù)值的補(bǔ)碼轉(zhuǎn)換方法要進(jìn)行數(shù)值的ASCII碼到補(bǔ)碼的轉(zhuǎn)換,首先就得判斷輸入的字符是數(shù)值還是符號(hào)。根據(jù)上文所提,“+、/、(、)”的ASCII碼由28H到2FH,而“09”的ASCII碼則由30H到39H,只需比較字符是否小

5、于等于2FH(或小于30H)即可判斷是否為符號(hào),否則則是數(shù)值,如圖2所示。眾所周知,要把一個(gè)ASCII碼數(shù)值轉(zhuǎn)換為二進(jìn)制補(bǔ)碼的形式,只需要對(duì)其減30H即可實(shí)現(xiàn).但如果輸入的是多位數(shù),例如123,那么計(jì)算機(jī)獲得的是31H、32H、33H三個(gè)字節(jié),即使分別對(duì)這三個(gè)字節(jié)進(jìn)行減30H操作,也只是獲得1、2、3三個(gè)數(shù)而已.實(shí)際上可以利用加權(quán)的方法合并這幾個(gè)數(shù):123110021031但另一個(gè)問題是,由于輸入是隨機(jī)的,即輸入的運(yùn)算數(shù)有多少位是未知的,因此無法使用上面的方面靜態(tài)確定每一位的權(quán)重.這里介紹的方法是,每輸入運(yùn)算數(shù)的一位,則把前面的合并結(jié)果(稱為原值)乘以10再與這一位相加,實(shí)現(xiàn)動(dòng)態(tài)的加權(quán)合并。例

6、如:令原值為0,輸入1,結(jié)果為:01011輸入2,結(jié)果為:110212輸入3,結(jié)果為:12103123即:123((0101)102)10)3。數(shù)值的補(bǔ)碼轉(zhuǎn)換流程如圖4所示,當(dāng)然,在獲得第一個(gè)數(shù)值輸入前要先把原值設(shè)置為0.圖4 數(shù)值的補(bǔ)碼轉(zhuǎn)換流程圖由于符號(hào)全部是一個(gè)字節(jié),無需進(jìn)行任何轉(zhuǎn)換即可保存,處理簡(jiǎn)單,這里不作探討.5.2 計(jì)算 由于運(yùn)算表達(dá)式有多個(gè)數(shù)值和符號(hào),而符號(hào)有不同的優(yōu)先級(jí)別,因此上文提到的數(shù)值保存和符號(hào)保存應(yīng)該分開兩個(gè)地方進(jìn)行保存,這樣有利于表達(dá)式的計(jì)算算法設(shè)計(jì)。下面把“+、*、/稱為運(yùn)算符,把“(、)稱為優(yōu)先符。圖5 運(yùn)算表達(dá)式的存儲(chǔ)舉例觀察圖5的三條運(yùn)算表達(dá)式,再聯(lián)系四則混合

7、運(yùn)算的優(yōu)先原則,可以歸納出幾點(diǎn):(a) 數(shù)值的數(shù)量是運(yùn)算符的數(shù)量加1(優(yōu)先符不算),第1個(gè)運(yùn)算符代表第1、2個(gè)數(shù)值的運(yùn)算操作,第N個(gè)運(yùn)算符代表第N、N+1個(gè)數(shù)值的運(yùn)算操作(b) 每進(jìn)行一次運(yùn)算,相應(yīng)的運(yùn)算符即被消除,而參與運(yùn)算的兩個(gè)數(shù)值合并為一個(gè)數(shù)值,仍然滿足(a).例如圖5(a),當(dāng)完成乘法運(yùn)算后,數(shù)值存儲(chǔ)區(qū)有408、56兩個(gè)數(shù),符號(hào)存儲(chǔ)區(qū)有“+一個(gè)運(yùn)算符。(c) 括號(hào)(優(yōu)先符)的作用是把括號(hào)內(nèi)的運(yùn)算符的優(yōu)先級(jí)別提高到比外部高.因此,要實(shí)現(xiàn)運(yùn)算表達(dá)式的運(yùn)算,最重要的就是確定所有運(yùn)算符的優(yōu)先級(jí)別.下面討論運(yùn)算符優(yōu)先級(jí)別的編程設(shè)計(jì)方法。5。2.1 運(yùn)算優(yōu)先級(jí)別的靜態(tài)確定法此方法是完成了把整條運(yùn)算

8、表達(dá)式全部存入數(shù)值存儲(chǔ)區(qū)和符號(hào)存儲(chǔ)區(qū)后才開始對(duì)運(yùn)算符優(yōu)先級(jí)進(jìn)行判斷的方法:n 設(shè)置“、/的優(yōu)先級(jí)為2、“+、”的優(yōu)先級(jí)為1;n 括號(hào)內(nèi)部的所有運(yùn)算符的優(yōu)先級(jí)全部加2。運(yùn)用優(yōu)先級(jí)別靜態(tài)確定法處理圖5的三條表達(dá)式的運(yùn)算符,結(jié)果如圖6所示.其中圖6(c)的“34+56-8由于被括號(hào)括起兩次,因此其兩個(gè)運(yùn)算符“+、”的優(yōu)先級(jí)別均加了兩次2。圖6 運(yùn)算符的靜態(tài)優(yōu)先級(jí)別 最后,由于四則混合運(yùn)算遵循從左往右計(jì)算的原則,即相同優(yōu)先級(jí)別的運(yùn)算符靠左的優(yōu)先.因此,只需計(jì)算出符號(hào)存儲(chǔ)區(qū)里面的所有運(yùn)算符的優(yōu)先級(jí)別,然后根據(jù)優(yōu)先級(jí)的大小先后執(zhí)行運(yùn)算符對(duì)應(yīng)的運(yùn)算即可實(shí)現(xiàn)計(jì)算(當(dāng)然每進(jìn)行一次運(yùn)算,相應(yīng)的運(yùn)算符即被消除,而參

9、與運(yùn)算的兩個(gè)數(shù)值合并為一個(gè)數(shù)值).當(dāng)數(shù)值存儲(chǔ)區(qū)里面剩下一個(gè)數(shù)值時(shí),運(yùn)算結(jié)束,這個(gè)最后的數(shù)值就是運(yùn)算的最終結(jié)果。 請(qǐng)同學(xué)們自行設(shè)計(jì)此算法的流程圖。5。2。2 運(yùn)算優(yōu)先級(jí)別的動(dòng)態(tài)確定法運(yùn)算優(yōu)先級(jí)別靜態(tài)確定法具有容易理解、實(shí)現(xiàn)簡(jiǎn)單的優(yōu)點(diǎn),而其缺點(diǎn)是:如果運(yùn)算表達(dá)式太長(zhǎng)、太多數(shù)值和符號(hào)時(shí),則會(huì)占用較多的存儲(chǔ)空間,而且計(jì)算優(yōu)先級(jí)的工作量也會(huì)增多.動(dòng)態(tài)確定法是在運(yùn)算表達(dá)式未結(jié)束輸入即開始計(jì)算的一種方法。由于在表達(dá)式輸入階段已開始計(jì)算,因此計(jì)算結(jié)果的速度比靜態(tài)確定法快。觀察圖5(a),當(dāng)用戶輸入“+”時(shí),已經(jīng)可以開始計(jì)算“1234”;觀察圖5(b),當(dāng)用戶輸入“-時(shí),已經(jīng)可以開始計(jì)算“34+56”;觀察圖5

10、(c),當(dāng)用戶輸入第一個(gè)“-”時(shí),已經(jīng)可以開始計(jì)算“1221”。也就是說,當(dāng)用戶輸入的運(yùn)算符的優(yōu)先級(jí)不大于前一個(gè)運(yùn)算符時(shí),即可開始前一個(gè)運(yùn)算符的計(jì)算。問題是,對(duì)于有括號(hào)的運(yùn)算表達(dá)式,在用戶沒有完成運(yùn)算表達(dá)式的全部輸入前,很難提前確定括號(hào)內(nèi)部運(yùn)算符的優(yōu)先級(jí).為了解決這個(gè)問題,動(dòng)態(tài)確定法把優(yōu)先符(括號(hào))也賦予了優(yōu)先級(jí):n “(,優(yōu)先級(jí)為5;n “*、/”,優(yōu)先級(jí)為4;n “+、,優(yōu)先級(jí)為3;n “)”,優(yōu)先級(jí)為1。計(jì)算圖5三條運(yùn)算表達(dá)式的所有符號(hào)的優(yōu)先級(jí)別,結(jié)果如圖7所示。圖7運(yùn)算符的動(dòng)態(tài)優(yōu)先級(jí)別設(shè)計(jì)計(jì)算的條件:(1) 只有優(yōu)先級(jí)為3、4的符號(hào)(即+、-、*、/)可以進(jìn)行計(jì)算;(2) 如果某符號(hào)的

11、優(yōu)先級(jí)大于等于下一個(gè)的優(yōu)先級(jí)時(shí),對(duì)此符號(hào)進(jìn)行相應(yīng)運(yùn)算(當(dāng)然每進(jìn)行一次運(yùn)算,相應(yīng)的運(yùn)算符即被消除,而參與運(yùn)算的兩個(gè)數(shù)值合并為一個(gè)數(shù)值);(3) 如果左右括號(hào)相鄰,且左括號(hào)在右括號(hào)左邊時(shí)(即在符號(hào)存儲(chǔ)區(qū)里面出現(xiàn)“()”的情況,或者在優(yōu)先級(jí)隊(duì)列里出現(xiàn)“51”的情況),把這對(duì)括號(hào)消除掉。最后,當(dāng)數(shù)值存儲(chǔ)區(qū)里面剩下一個(gè)數(shù)值(或者符號(hào)存儲(chǔ)區(qū)里面沒有符號(hào))時(shí),運(yùn)算結(jié)束,這個(gè)最后的數(shù)值就是運(yùn)算的最終結(jié)果。請(qǐng)同學(xué)們自行設(shè)計(jì)此算法的流程圖。5.3 結(jié)果輸出當(dāng)數(shù)值存儲(chǔ)區(qū)里面剩下一個(gè)數(shù)值(或者符號(hào)存儲(chǔ)區(qū)里面沒有符號(hào))時(shí),運(yùn)算結(jié)束,需要把運(yùn)算結(jié)果輸出顯示。分析運(yùn)算結(jié)果的特點(diǎn):運(yùn)算結(jié)果為一個(gè)2進(jìn)制補(bǔ)碼,整數(shù),如果數(shù)據(jù)長(zhǎng)度

12、為16位,則運(yùn)算結(jié)果范圍是:3276832767。運(yùn)算結(jié)果的輸出要解決的主要問題是:正負(fù)數(shù)區(qū)分、補(bǔ)碼到ASCII碼轉(zhuǎn)換并輸出顯示。運(yùn)算結(jié)果的輸出流程如圖8所示.圖8 結(jié)果輸出流程圖5.3。1 正負(fù)數(shù)區(qū)分運(yùn)算結(jié)果有三種情況:正整數(shù)、負(fù)整數(shù)、零。運(yùn)算結(jié)果以補(bǔ)碼形式對(duì)這三種情況進(jìn)行統(tǒng)一的存儲(chǔ),但顯示輸出時(shí)則有所不同。負(fù)整數(shù)前面需要顯示“”號(hào),因此需要對(duì)運(yùn)算結(jié)果的符號(hào)進(jìn)行判斷。另一方面,正整數(shù)和零的補(bǔ)碼與原碼相同,而負(fù)整數(shù)的補(bǔ)碼則不一樣.把負(fù)整數(shù)進(jìn)行取補(bǔ)碼運(yùn)算,把它轉(zhuǎn)換為原碼,可以實(shí)現(xiàn)運(yùn)算結(jié)果統(tǒng)一的ASCII碼轉(zhuǎn)換輸出方法,而不需要分別為正整數(shù)和零、負(fù)整數(shù)分別設(shè)計(jì)兩個(gè)不同的ASCII碼轉(zhuǎn)換程序,如圖9

13、所示。圖9 正負(fù)數(shù)區(qū)分流程圖5。3.2 補(bǔ)碼到ASCII碼轉(zhuǎn)換計(jì)算結(jié)果在屏幕上的輸出顯示實(shí)際上是ASCII碼的輸出顯示。假設(shè)程序采用的數(shù)據(jù)長(zhǎng)度為16位,則運(yùn)算結(jié)果范圍是:3276832767,即屏幕最多得顯示5位ASCII碼。由于上文已經(jīng)把結(jié)果統(tǒng)一為原碼,下面介紹如何把原碼轉(zhuǎn)換為ASCII碼。這個(gè)轉(zhuǎn)換過程實(shí)際上跟上文的“數(shù)值的補(bǔ)碼轉(zhuǎn)換方法”是相反操作。例如要把123在屏幕上輸出顯示,即要把123的百位、十位、個(gè)位分離,得到1、2、3,然后轉(zhuǎn)換為31H、32H、33H三個(gè)ASCII碼.眾所周知,把一位數(shù)轉(zhuǎn)換為ASCII碼只需加30H即可,下面介紹把一個(gè)多位數(shù)的各位分離的方法。(一)除十法分離方法

14、是:對(duì)一個(gè)多位數(shù)進(jìn)行除10處理,得到的余數(shù)即為個(gè)位數(shù),而商則是刪除個(gè)位后的多位數(shù)。對(duì)商反復(fù)進(jìn)行除10處理,直到商為0為止,即可把各位數(shù)分離。例如對(duì)123進(jìn)行除十法處理:123/10,商是12,余數(shù)是312/10,商是1,余數(shù)是21/10,商是0,余數(shù)是1可見經(jīng)過三次除十計(jì)算,得到的三個(gè)余數(shù)剛好就是對(duì)123的各位的分離結(jié)果。接著只需分別對(duì)這些余數(shù)加30H即可轉(zhuǎn)換為ASCII碼,實(shí)現(xiàn)輸出轉(zhuǎn)換。除十法的優(yōu)點(diǎn)是不需要理會(huì)要輸出的數(shù)值有多少位,不斷除以10直到商為0即可;缺點(diǎn)是得到的余數(shù)的順序跟輸出的方向相反,不方便輸出。例如上例得到的三個(gè)余數(shù)的順序是3、2、1,加30H轉(zhuǎn)換輸出后屏幕顯示為“321”,

15、跟期望顯示的順序相反,要作進(jìn)一步處理。處理方法是把余數(shù)放進(jìn)堆棧里面,然后再出棧顯示。由于堆棧是先進(jìn)后出的,即可解決該輸出的順序問題。圖10 除十法流程圖(二)除最高位法分離方法是先除以10位數(shù)-1,得到的商即為最高位,余數(shù)為刪除最高位后的多位數(shù)。接著令余數(shù)除以10位數(shù)2,得到的商為次高位,.例如123,其位數(shù)是3(個(gè)位、十位、百位),則計(jì)算過程為:123/103-1,商是1,余數(shù)是2323/103-2,商是2,余數(shù)是33/1033,商是3,余數(shù)是0可見經(jīng)過三次計(jì)算,得到的三個(gè)商剛好是對(duì)123的各位的分離結(jié)果,而且順序跟輸出方向相同??梢灾苯蛹?0H轉(zhuǎn)換輸出,屏幕顯示為“123”。該方法的缺點(diǎn)是

16、:必須首先確定要輸出的數(shù)值有多少位,編程者必須十分清楚需要輸出的數(shù)值的數(shù)值范圍.圖11 除最高位法流程圖6 得出的程序;-;-數(shù)據(jù)定義-DSEG SEGMENTSTR1 DB 0AH,0DH, *$STR2 DB 0AH,0DH, * *STR3 DB 0AH,0DH, * welcome you ! *$STR4 DB 0AH,0DH, *$STR5 DB 0AH,0DH, * this is programme of sizeyunshuan STR6 DB 0AH,0DH, * rang(32768 to 32767) STR7 DB 0AH,0DH, * press q to exit

17、 ! *$STR8 DB 0AH,0DH, * copyright by linjieling $STR9 DB 0AH,0DH, please input the formula: *$STR10 DB 0AH,0DH, *$SIGN1 DW 0 ;判斷數(shù)字是否輸入完畢SIGN2 DW 0 ;判斷括號(hào)是否配對(duì)NUMB DW 20H DUP(0) ;保存輸入的數(shù)值MARK DB A ;保存輸入的運(yùn)算符 DB 10H DUP(0) ;ERROR DB YOUR INPUT ARE WRONG DSEG ENDS;-宏定義-DISP MACRO M ;字符串輸出 LEA DX,M ;將M的偏移地址

18、傳送給DX寄存器 MOV AH,9 ;其中09H是字符串輸出 INT 21H ;通過給AH寄存器賦值,再調(diào)用INT 21H指令,根據(jù)AH寄存器中的值執(zhí)行相應(yīng)的操作 ENDMCHOICE MACRO ASC1,HAO1,HH ;宏定義,給運(yùn)算符賦權(quán)值 CMP AL,ASC1 ;比較鍵盤輸入的運(yùn)算符(運(yùn)算符的ASC碼存放在AL寄存器)與ASC1 JNE OTHER&HAO1 ;若不等,則往下執(zhí)行OTHER1,如此類推 MOV CH,HH ;將運(yùn)算符的權(quán)值(即優(yōu)先級(jí)高低值)傳送到CH寄存器 JMP OTHER7 ;執(zhí)行后,返回 ENDM;-CSEG SEGMENT ;ASSUME CS:CSEG,D

19、S:DSEGSTART: CALL CLEARMOV AX,DSEG ;MOV DS,AX ;LEA DI,NUMB ;將NUMB的偏移地址傳送到DI,NUMB存儲(chǔ)單元中存放輸入的數(shù)值LEA SI,MARK ;將MARK的偏移地址傳送到SI,MARK存儲(chǔ)單元中存放輸入的運(yùn)算符 DISP STR1;顯示字符串 DISP STR2 DISP STR3 DISP STR4 DISP STR5 DISP STR6 DISP STR7 DISP STR8 DISP STR9 DISP STR10 MOV AX,0;數(shù)據(jù)寄存器清零 MOV DX,0 MOV BX,0 MOV CX,0 STA1 : CAL

20、L CR ;回車換行;-初始化-INPUT: MOV AH,1 ;其中1H是鍵盤輸入并回顯,AL中有輸入字符INT 21H ;通過給AH寄存器賦值,再調(diào)用INT 21H指令,根據(jù)AH寄存器中的值執(zhí)行相應(yīng)的操作;-輸入字符- CMP AL,q JE J_SHU;-若輸入q,則返回dos狀態(tài)-CMP AL,= ;JE PD ;判斷配對(duì)標(biāo)志位;-是等號(hào),進(jìn)一步判斷輸入括號(hào)是否配對(duì)-CMP AL,28H ;JB BC ;JB為小于就跳轉(zhuǎn)CMP AL,39H ;JA BC ;JA為大于就跳轉(zhuǎn);-輸入字符的ASC碼小于28H或大于39H,則繼續(xù)輸入-CMP AL,2FH ;判斷是數(shù)字還是符號(hào)JBE JUD

21、 ;是符號(hào)轉(zhuǎn)入響應(yīng)操作;-INC WORD PTR SIGN1 ;將數(shù)字標(biāo)志位加1SUB AL,30H ;將ASC碼轉(zhuǎn)16進(jìn)制MOV AH,0 ;XCHG AX,DI ;互換兩個(gè)操作數(shù)的存放位置,實(shí)現(xiàn)字交換MOV BX,10 ;MUL BX ;無符號(hào)數(shù)乘法指令XCHG AX,DI ;ADD DI,AX ; JMP INPUT ;;-輸入為數(shù)值時(shí)的操作-PD: CMP WORD PTR SIGN2,0 ;判斷配對(duì)標(biāo)志位JE JUD ;跳到判斷數(shù)值是否輸入完畢 JMP BC ;不配對(duì)則顯示ERROR;-JUD: CMP WORD PTR SIGN1,0 ;判斷數(shù)值是否輸入完畢JE FUH1 ;跳到

22、判斷優(yōu)先級(jí)ADD DI,2 ;DI向下移一個(gè)字MOV WORD PTR SIGN1,0;數(shù)值標(biāo)志位清零;-FUH1: CALL ADVANCE ;判定優(yōu)先級(jí)CMP CH,5 ;判斷輸入的運(yùn)算符中是否有左括號(hào)JNE PY ;不是,則判斷輸入的運(yùn)算符中是否有右括號(hào);-INC WORD PTR SIGN2 ;是左括號(hào),括號(hào)標(biāo)志位加1;-PY: CMP CH,1 ;判斷輸入的是否是右括號(hào)JNE AGAIN ;跳到判斷運(yùn)算存儲(chǔ)區(qū)是否為空DEC WORD PTR SIGN2 ;是右括號(hào),括號(hào)標(biāo)志位減1;-AGAIN: CMP BYTE PTRSI,A;判斷運(yùn)算符存儲(chǔ)區(qū)是否為空J(rèn)E SAVE ;判斷輸入是否

23、為=CMP CH,SI ;JA SAVE ;計(jì)算高優(yōu)先級(jí)的 SI指向運(yùn)算符,每個(gè)運(yùn)算符都有相應(yīng)的權(quán)值CMP BYTE PTRSI,(JNE YIDO;尋找左括號(hào)DEC SI;是左括號(hào),還是向上移,判斷左括號(hào)前邊是否還有運(yùn)算符JMP INPUT;;- YIDO: DEC SI ;SI向上移MOV CL,SI ;將運(yùn)算符傳送給CLCALL MATCH ;判斷是什么運(yùn)算符并進(jìn)行相應(yīng)的計(jì)算JMP AGAIN ;判斷運(yùn)算符存儲(chǔ)區(qū)是否為空;-SAVE: CMP CH,0 ;JE OVER ;=時(shí),則輸出結(jié)果CMP CH,1 ;JE INPUT ;“)”不保存,輸入下一個(gè)數(shù)INC SI ;MOV SI,AL

24、 ;INC SI ;CMP CH,5 ;JNE GO_ON ;MOV CH,2 ;改變(的權(quán)值GO_ON: MOV SI,CH ;JMP INPUT ;-BC: LEA DX,ERROR ;將ERROR的偏移地址給DXMOV AH,9 ;INT 21H ;CALL CRJMP J_SHU1 ;-四則運(yùn)算子程序-MATCH PROC ;子程序,進(jìn)行相應(yīng)的運(yùn)算PUSH AX ;XOR AX,AX;異或XOR BX,BX;-乘法運(yùn)算-CMP CL,2AH ;乘法運(yùn)算JNE NEXT1SUB DI,2XCHG BX,DISUB DI,2XCHG AX,DIIMUL BXMOV DI,AXADD DI,

25、2JMP FINISH;-;-除法運(yùn)算-NEXT1: CMP CL,2FH ;除法運(yùn)算JNE NEXT2SUB DI,2XCHG BX,DISUB DI,2 XCHG AX,DICWDIDIV BXMOV DI,AXADD DI,2JMP FINISH;-;-加法運(yùn)算-NEXT2: CMP CL,2BH ;加法運(yùn)算JNE NEXT3SUB DI,2XCHG BX,DISUB DI,2ADD DI,BXADD DI,2JMP FINISH;-;-減法運(yùn)算-NEXT3: CMP CL,2DH ;減法運(yùn)算JNE FINISHSUB DI,2XCHG BX,DISUB DI,2SUB DI,BX AD

26、D DI,2FINISH: POP AX RETMATCH ENDP;-;-定義優(yōu)先級(jí)-ADVANCE PROCCHOICE 28H,1,5 ;( 28H為 ( 的ASCII碼OTHER1: CHOICE 29H,2,1 ;)OTHER2: CHOICE 2AH,3,4 ;*OTHER3: CHOICE 2FH,4,4 ;/OTHER4: CHOICE 2BH,5,3 ;+OTHER5: CHOICE 2DH,6,3 ;OTHER6: CHOICE 3DH,7,0 ;=OTHER7: RETADVANCE ENDP;-;-清屏*-Clear PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX MOV AH,06H MOV AL,00H MOV CH,0 MOV CL,0 MOV BH,0FH MOV DH,18H MOV DL,4FH INT 10H MOV BH,0 MOV DX,0 MOV AH,02

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論