微機(jī)設(shè)計(jì)報(bào)告(四則運(yùn)算器)_第1頁(yè)
微機(jī)設(shè)計(jì)報(bào)告(四則運(yùn)算器)_第2頁(yè)
微機(jī)設(shè)計(jì)報(bào)告(四則運(yùn)算器)_第3頁(yè)
微機(jī)設(shè)計(jì)報(bào)告(四則運(yùn)算器)_第4頁(yè)
微機(jī)設(shè)計(jì)報(bào)告(四則運(yùn)算器)_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 學(xué) 院: 班 級(jí): 姓 名: 學(xué) 號(hào): 課程設(shè)計(jì)題目:四則運(yùn)算計(jì)算器課程名稱:匯編語言與微機(jī)原理評(píng)閱成績(jī):評(píng)閱意見:成績(jī)?cè)u(píng)定教師簽名:日期: 年 月 目 錄概述1一、設(shè)計(jì)要求1二、設(shè)計(jì)思想1三、程序工作原理2四、程序流程圖及說明3五、程序源代碼7六、程序運(yùn)行示例18七、設(shè)計(jì)過程中遇到的問題及解決方法18八、設(shè)計(jì)心得19九、參考文獻(xiàn)19四則運(yùn)算計(jì)算器概述此計(jì)算器,可以實(shí)現(xiàn)從鍵盤輸入一個(gè)十進(jìn)制的四則運(yùn)算表達(dá)式,如:-3+4*(5-6)-8/2,編程計(jì)算表達(dá)式的值,輸出十進(jìn)制結(jié)果。表達(dá)式和結(jié)果可以是三位或四位十進(jìn)制,也可以是帶負(fù)數(shù)的十進(jìn)制數(shù),并且*/()位置任意擺放(只要符合數(shù)學(xué)上的運(yùn)算邏輯)。一

2、、設(shè)計(jì)要求用匯編語言設(shè)計(jì)一個(gè)程序,用來實(shí)現(xiàn)計(jì)算器的四則運(yùn)算功能。需要實(shí)現(xiàn)在屏幕要顯示輸入的表達(dá)式,以及運(yùn)算結(jié)果。例如:-3+4*(5-6)-8/2計(jì)算表達(dá)式的結(jié)果,并將該表達(dá)式及結(jié)果顯示出來; 設(shè)計(jì)要求如下:(1)由鍵盤作為輸入部分。(2)能進(jìn)行四則混合運(yùn)算,并且能計(jì)算帶括號(hào)和負(fù)數(shù)的數(shù)學(xué)表達(dá)式。(3)按 esc 鍵則退出計(jì)算器菜單界面并返回 dos 系統(tǒng),否則繼續(xù)輸入表達(dá)式,求得對(duì)應(yīng)的結(jié)果。二、設(shè)計(jì)思想根據(jù)題目的要求,可以把整個(gè)源程序大致劃分六大步驟。(1) 首先鍵盤輸入合法中綴算術(shù)表達(dá)式,并將其存儲(chǔ)到s1中。(2) 然后調(diào)用子程序change將中綴式轉(zhuǎn)化為后綴式。(3) 調(diào)用子程序calcu

3、late對(duì)后綴表達(dá)式進(jìn)行有符號(hào)數(shù)的運(yùn)算,并將最終結(jié)果存放在棧中。(4) pop ax,ax-storage,即用storage 存放最終運(yùn)算結(jié)果。(5) 調(diào)用子程序output將運(yùn)算結(jié)果輸出。(6) 通過用鍵盤輸入esc退出dos程序。三、程序工作原理步驟一的原理:此處用系統(tǒng)功能1號(hào)調(diào)用,每次從鍵盤輸入一個(gè)字符,就將其存入到數(shù)組s1中,然后在判斷此字符是否為回車,如果不是,則循環(huán),繼續(xù)輸入字符,否則,程序往下執(zhí)行。步驟二的原理:此處最核心的就是中綴表達(dá)式轉(zhuǎn)化為后綴表達(dá)式的算法。具體思路為:用一個(gè)棧來存儲(chǔ)與運(yùn)算符號(hào).先將字符壓入棧中,并假設(shè)其優(yōu)先級(jí)為0.然后遍歷s1中的字符,遇到數(shù)字直接存入s2

4、中并且輸完數(shù)字后向s2中輸入一空格以備計(jì)算結(jié)果時(shí)用。遇到運(yùn)算符則先判斷其與棧頂運(yùn)算符的優(yōu)先級(jí)誰大。如果s1中運(yùn)算符號(hào)優(yōu)先級(jí)大,則此運(yùn)算符號(hào)直接入棧;否則棧頂符號(hào)先出棧到s2,待棧頂符號(hào)優(yōu)先級(jí)小于s1中符號(hào)時(shí),s1中元素入棧。步驟三的原理:遍歷s2中的字符,遇到空格,則將前面數(shù)字字符串轉(zhuǎn)換成的數(shù)據(jù)壓入棧中。遇到加號(hào),從棧中彈出兩個(gè)數(shù)據(jù)進(jìn)行加法運(yùn)算,并將運(yùn)算結(jié)果壓入棧中。遇到減號(hào),從棧中彈出兩個(gè)數(shù)據(jù)進(jìn)行減法運(yùn)算,并將運(yùn)算結(jié)果壓入棧中。遇到乘號(hào),從棧中彈出兩個(gè)數(shù)據(jù)進(jìn)行乘法運(yùn)算,并將運(yùn)算結(jié)果壓入棧中。遇到除號(hào),從棧中彈出兩個(gè)數(shù)據(jù)進(jìn)行除法運(yùn)算,并將運(yùn)算結(jié)果壓入棧中。整個(gè)字符串遍歷完后,最終計(jì)算結(jié)果就保存

5、在棧中。步驟四的原理:將棧中保存的最后運(yùn)算結(jié)果彈出,并保存到storage中。步驟五的原理:先判斷運(yùn)算結(jié)果是否為負(fù)數(shù),如果是,將-存入數(shù)組n中,并對(duì)運(yùn)算結(jié)果求補(bǔ)。然后判斷數(shù)據(jù)所在范圍,小于32767大于一萬則將運(yùn)算結(jié)果除以一萬,并將商賦給數(shù)組n;然后將余數(shù)除以一千將商賦給數(shù)組n;再將余數(shù)除以一百并將商賦給數(shù)組n;再將余數(shù)除以十并將商賦給數(shù)組n;最終將余數(shù)賦給數(shù)組n。如果數(shù)據(jù)更小,也是如此實(shí)現(xiàn),只是步驟更少些。步驟六的原理:通過ret output語句跳轉(zhuǎn)到call output語句的下一條指令,執(zhí)行next1模塊(判斷鍵盤輸入是否為esc),若為esc的話跳轉(zhuǎn)到exit模塊從而退出程序。四、程

6、序流程圖及說明程序總流程圖:中綴表達(dá)式轉(zhuǎn)化為后綴表達(dá)式的流程圖: 其每次向s2中輸入一個(gè)字符,di就會(huì)加1。當(dāng)壓入 (后,再壓入0作為運(yùn)算符優(yōu)先級(jí)的判斷;當(dāng)壓入+或-后,再壓入01作為運(yùn)算符優(yōu)先級(jí)的判斷;當(dāng)壓入*或/后,再壓入02作為運(yùn)算符優(yōu)先級(jí)的判斷。計(jì)算后綴表達(dá)式數(shù)值的流程圖:輸出運(yùn)算結(jié)果程序的流程圖:五、程序源代碼data segments1 db 60 dup(?),$ ;存儲(chǔ)輸入的中綴表達(dá)式子s2 db 60 dup(?),$ ;存儲(chǔ)后綴表達(dá)式子n db 10 dup(?),$ ;存儲(chǔ)要輸出的數(shù)字字符串storage dw ?,$ ;存儲(chǔ)運(yùn)算結(jié)果buf0 db 0dh,0ahdb*,

7、0dh,0ahdb* *,0dh,0ahdb* four arithmetic operation calculator *,0dh,0ahdb* this program is designed by *,0dh,0ahdb* wangyuli 200941843302 *,0dh,0ahdb* *,0dh,0ahdb*,0dh,0ah db please input +,-,*,/,() expression,0dh,0ah,$;buf1 db 0ah,0dh,*expression error!*$data endsstack segment stack db 40 dup(?)stac

8、k endscode segment assume cs:code,ds:data,ss:stackstart: mov ax,data mov ds,ax mov dx,offset buf0 ;輸出字符串 mov ah,9 ;buf0,提示輸入表達(dá)式 int 21h mov si,0 ;輸入的第一個(gè)數(shù)為負(fù)數(shù)的處理方法 mov ah,1 int 21h cmp al,- jne ll ;如果al不等于-號(hào)則跳轉(zhuǎn)到ll mov s1si,0 inc si ll: mov s1si,al ;將al的內(nèi)容傳送到偏移地址為si+s1(相對(duì)基址變址尋址)的儲(chǔ)存單元 inc si lll: mov ah

9、,1 ;循環(huán)輸入表達(dá)式 int 21h mov s1si,al inc si cmp al,0dh jne lll mov dl,0ah mov ah,2 int 21h call change ;調(diào)用中綴轉(zhuǎn)后綴子程序 call calculate ;調(diào)用計(jì)算后綴表達(dá)式子程序exit: mov ah,4ch int 21h error:mov dx,offset buf1 ;輸出字符串 mov ah,9 ;buf1,提示輸入表達(dá)錯(cuò)誤 int 21h jmp next1 next : pop ax ;從ax中彈出一個(gè)數(shù)據(jù) cmp ax, ;比較這個(gè)數(shù)據(jù)是否為 je next1 ;是則跳轉(zhuǎn)到nex

10、t1 mov storage,ax ;把a(bǔ)x賦給storage call output ;調(diào)用輸出運(yùn)算結(jié)果子程序next1: mov ah,7 ;從鍵盤輸入一個(gè)字符不回顯 int 21h cmp al,1bh ;判斷這個(gè)字符是否為esc je exit change proc near ;中綴表達(dá)式轉(zhuǎn)換為 mov ah,0 ;后綴表達(dá)式的子程序 mov dh,0 mov si,0 mov di,0 push di cha: mov al,s1si ;數(shù)組元素的個(gè)數(shù)讀入al中 inc si cmp al,0dh je a cmp al,( je l1 ;al等于(跳轉(zhuǎn)到l1 cmp al,+ j

11、e l2 cmp al,- je l3 cmp al,* je l4 cmp al,/ je l5 cmp al,) je b cmp al,0 jge c ;al大于或等于0轉(zhuǎn)移到c jmp error ;跳轉(zhuǎn)到error模塊 l1: push ax ;對(duì)左括號(hào)的處理 mov ax,0 push ax cmp s1si,- jne cha mov s2di,0 inc di mov s2di, inc dil2: mov bp,sp ;對(duì)加法的處理 mov dl,bp cmp dl,01h jge l21 push ax mov dx,0101h push dx jmp chal21: po

12、p dx pop bx mov s2di,bl inc di jmp l2 e: je nextl3: mov bp,sp ;對(duì)減法的處理 mov dx,bp cmp dl,01h jge l31 push ax mov dx,0201h push dx jmp chal31: pop dx pop bx mov s2di,bl inc di ;di自加1 jmp l3b: je l6a:je l8l4: mov bp,sp ;對(duì)乘法的處理 mov dx,bp cmp dl,02h jge l41 push ax mov dx,0302h push dx jmp chal41: pop dx

13、pop bx mov s2di,bl inc di jmp l4c:jge l7 l5: mov bp,sp ;對(duì)除法的處理 mov dx,bp cmp dl,02h jge l51 push ax mov dx,0402h push dx jmp chal51: pop dx pop bx mov ds:s2di,bl inc di jmp l5d: je el6: mov bp,sp ;對(duì)右括號(hào)的處理 cmp byte ptr bp,0 jne l61 pop dx pop ax jmp chal61: pop dx pop bx mov s2di,bl inc di jmp l6 l7:

14、 cmp al,9 ;對(duì)數(shù)字的處理 jle l71l71: mov s2di,al inc di cmp byte ptr s1si,0 jge l72 mov al, mov s2di,al inc di jmp cha l72:cmp byte ptr s1si,9 jle l73 ;s1si小于等于9跳轉(zhuǎn)到l73l73: mov al,si inc si jmp l71 l8: mov bp,sp cmp byte ptr bp,0 jg l81 pop ax jmp l9l81: pop dx pop bx mov s2di,bl inc di jmp l8 l9: mov s2di,

15、0dh retchange endpcalculate proc near ;計(jì)算后綴表達(dá)式子程序 mov si,0 mov di,0 mov ah,0 mov bx, push bxcal: mov al,s2di inc di cmp al,0dh je d cmp al, je cal cmp al,+ je f1 cmp al,- je f2 cmp al,* je f3 cmp al,/ je f4 cmp al,0 jge f5 jmp errorf5: cmp al,9 jle f51f51: mov dl,al and dl,0fh mov bl,10 mov al,0f52:

16、imul bl add al,dl cmp byte ptr s2di, jne f53 push ax jmp calf53:mov dl,s2di inc di and dl,0fh jmp f52 f4: pop dx ;除法運(yùn)算 pop ax idiv dl and ax,000fh push ax jmp calf3: pop dx ;乘法運(yùn)算 pop ax imul dl push ax jmp calf2: pop dx ;減法運(yùn)算 pop ax sub ax,dx push ax jmp calf1: pop ax ;加法運(yùn)算 pop dx add ax,dx push ax

17、jmp cal retcalculate endpoutput proc near ;輸出運(yùn)算結(jié)果子程序 mov si,0 mov ax,storage cmp ax,0 jge c1 neg ax ;取ax的補(bǔ)碼 mov nsi,- ;將-存入數(shù)組n中 inc sic1: cmp ax,10000 ;大于等于一萬則跳轉(zhuǎn)到c11 jge c11 cmp ax,1000 ;大于等于1000則跳轉(zhuǎn)到c12 jge c12 cmp ax,100 ;大于等于100則跳轉(zhuǎn)到c2 jge c2 cmp ax,10 ;大于等于10則跳轉(zhuǎn)到c3 jge c3 cmp ax,0 jge c4c11: mov d

18、x,0 mov bx,10000 idiv bx ;運(yùn)算結(jié)果除以一萬,并將商賦給數(shù)組n add al,30h mov ds:nsi,al inc si mov ax,dx jmp c1c12: mov dx,0 mov bx,1000 ;運(yùn)算結(jié)果除以一千,并將商賦給數(shù)組n idiv bx add al,30h mov ds:nsi,al inc si mov ax,dx jmp c1c2: mov cl,100 ;運(yùn)算結(jié)果除以一百,并將商賦給數(shù)組n idiv cl add al,30h mov ds:nsi,al inc si mov al,ah mov ah,0 jmp c1c3: mov

19、cl,10 ;運(yùn)算結(jié)果除以一十,并將商賦給數(shù)組n idiv cl add al,30h mov ds:nsi,al inc si mov al,ah mov ah,0 jmp c1c4: add al,30h mov nsi,al inc si jmp c0c0:lea dx,n mov ah,9 int 21hret ;返回到call output后的下一條指令output endp code endsend start六、程序運(yùn)行示例以下是輸入一個(gè)帶括號(hào)的四則混合運(yùn)算表達(dá)式輸出的結(jié)果:以下是輸入一個(gè)帶負(fù)數(shù)的四則混合運(yùn)算表達(dá)式輸出的結(jié)果:以下是輸入高位十進(jìn)制的四則混合運(yùn)算表達(dá)式的輸出結(jié)果:以

20、下是輸入錯(cuò)誤符號(hào)后報(bào)錯(cuò),然后按esc退出的結(jié)果:七、設(shè)計(jì)過程中遇到的問題及解決方法(1)在這次設(shè)計(jì)過程中用到的工具是masm5,在這個(gè)編程環(huán)境下使用je,jmp,jge之類的語句不能跳轉(zhuǎn)太長(zhǎng),很容易超出范圍。所以只有在中途設(shè)置個(gè)跳轉(zhuǎn)中轉(zhuǎn)函數(shù)。例如設(shè)置中轉(zhuǎn)函數(shù)為a,要跳到l8,先jmp 到a,然后a在jmp到l8。(2)在設(shè)計(jì)中綴表達(dá)式怎么轉(zhuǎn)換成后綴表達(dá)式遇到了算術(shù)符號(hào)優(yōu)先權(quán)的問題,后面通過一個(gè)棧來存放運(yùn)算符,然后給每種運(yùn)算符設(shè)定一個(gè)優(yōu)先級(jí)別,例如,+、-為01,*、/為02。然后通過與s1中的字符串比較優(yōu)先權(quán),根據(jù)優(yōu)先權(quán)的大小彈出響應(yīng)的運(yùn)算符參與數(shù)據(jù)運(yùn)算。(3)考慮到計(jì)算器怎么才能實(shí)現(xiàn)帶負(fù)數(shù)的運(yùn)算,先判斷運(yùn)算結(jié)果是否為負(fù)數(shù),如果是,將-存入數(shù)組n中,并對(duì)運(yùn)算結(jié)果求補(bǔ)。(4)最后碰到了怎么實(shí)現(xiàn)通過按esc鍵退出程序,因?yàn)槌绦蛞呀?jīng)編譯完成,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論