版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、 學 院: 班 級: 姓 名: 學 號: 課程設計題目:四則運算計算器課程名稱:匯編語言與微機原理評閱成績:評閱意見:成績評定教師簽名:日期: 年 月 目 錄概述1一、設計要求1二、設計思想1三、程序工作原理2四、程序流程圖及說明3五、程序源代碼7六、程序運行示例18七、設計過程中遇到的問題及解決方法18八、設計心得19九、參考文獻19四則運算計算器概述此計算器,可以實現(xiàn)從鍵盤輸入一個十進制的四則運算表達式,如:-3+4*(5-6)-8/2,編程計算表達式的值,輸出十進制結果。表達式和結果可以是三位或四位十進制,也可以是帶負數(shù)的十進制數(shù),并且*/()位置任意擺放(只要符合數(shù)學上的運算邏輯)。一
2、、設計要求用匯編語言設計一個程序,用來實現(xiàn)計算器的四則運算功能。需要實現(xiàn)在屏幕要顯示輸入的表達式,以及運算結果。例如:-3+4*(5-6)-8/2計算表達式的結果,并將該表達式及結果顯示出來; 設計要求如下:(1)由鍵盤作為輸入部分。(2)能進行四則混合運算,并且能計算帶括號和負數(shù)的數(shù)學表達式。(3)按 esc 鍵則退出計算器菜單界面并返回 dos 系統(tǒng),否則繼續(xù)輸入表達式,求得對應的結果。二、設計思想根據(jù)題目的要求,可以把整個源程序大致劃分六大步驟。(1) 首先鍵盤輸入合法中綴算術表達式,并將其存儲到s1中。(2) 然后調(diào)用子程序change將中綴式轉化為后綴式。(3) 調(diào)用子程序calcu
3、late對后綴表達式進行有符號數(shù)的運算,并將最終結果存放在棧中。(4) pop ax,ax-storage,即用storage 存放最終運算結果。(5) 調(diào)用子程序output將運算結果輸出。(6) 通過用鍵盤輸入esc退出dos程序。三、程序工作原理步驟一的原理:此處用系統(tǒng)功能1號調(diào)用,每次從鍵盤輸入一個字符,就將其存入到數(shù)組s1中,然后在判斷此字符是否為回車,如果不是,則循環(huán),繼續(xù)輸入字符,否則,程序往下執(zhí)行。步驟二的原理:此處最核心的就是中綴表達式轉化為后綴表達式的算法。具體思路為:用一個棧來存儲與運算符號.先將字符壓入棧中,并假設其優(yōu)先級為0.然后遍歷s1中的字符,遇到數(shù)字直接存入s2
4、中并且輸完數(shù)字后向s2中輸入一空格以備計算結果時用。遇到運算符則先判斷其與棧頂運算符的優(yōu)先級誰大。如果s1中運算符號優(yōu)先級大,則此運算符號直接入棧;否則棧頂符號先出棧到s2,待棧頂符號優(yōu)先級小于s1中符號時,s1中元素入棧。步驟三的原理:遍歷s2中的字符,遇到空格,則將前面數(shù)字字符串轉換成的數(shù)據(jù)壓入棧中。遇到加號,從棧中彈出兩個數(shù)據(jù)進行加法運算,并將運算結果壓入棧中。遇到減號,從棧中彈出兩個數(shù)據(jù)進行減法運算,并將運算結果壓入棧中。遇到乘號,從棧中彈出兩個數(shù)據(jù)進行乘法運算,并將運算結果壓入棧中。遇到除號,從棧中彈出兩個數(shù)據(jù)進行除法運算,并將運算結果壓入棧中。整個字符串遍歷完后,最終計算結果就保存
5、在棧中。步驟四的原理:將棧中保存的最后運算結果彈出,并保存到storage中。步驟五的原理:先判斷運算結果是否為負數(shù),如果是,將-存入數(shù)組n中,并對運算結果求補。然后判斷數(shù)據(jù)所在范圍,小于32767大于一萬則將運算結果除以一萬,并將商賦給數(shù)組n;然后將余數(shù)除以一千將商賦給數(shù)組n;再將余數(shù)除以一百并將商賦給數(shù)組n;再將余數(shù)除以十并將商賦給數(shù)組n;最終將余數(shù)賦給數(shù)組n。如果數(shù)據(jù)更小,也是如此實現(xiàn),只是步驟更少些。步驟六的原理:通過ret output語句跳轉到call output語句的下一條指令,執(zhí)行next1模塊(判斷鍵盤輸入是否為esc),若為esc的話跳轉到exit模塊從而退出程序。四、程
6、序流程圖及說明程序總流程圖:中綴表達式轉化為后綴表達式的流程圖: 其每次向s2中輸入一個字符,di就會加1。當壓入 (后,再壓入0作為運算符優(yōu)先級的判斷;當壓入+或-后,再壓入01作為運算符優(yōu)先級的判斷;當壓入*或/后,再壓入02作為運算符優(yōu)先級的判斷。計算后綴表達式數(shù)值的流程圖:輸出運算結果程序的流程圖:五、程序源代碼data segments1 db 60 dup(?),$ ;存儲輸入的中綴表達式子s2 db 60 dup(?),$ ;存儲后綴表達式子n db 10 dup(?),$ ;存儲要輸出的數(shù)字字符串storage dw ?,$ ;存儲運算結果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,提示輸入表達式 int 21h mov si,0 ;輸入的第一個數(shù)為負數(shù)的處理方法 mov ah,1 int 21h cmp al,- jne ll ;如果al不等于-號則跳轉到ll mov s1si,0 inc si ll: mov s1si,al ;將al的內(nèi)容傳送到偏移地址為si+s1(相對基址變址尋址)的儲存單元 inc si lll: mov ah
9、,1 ;循環(huán)輸入表達式 int 21h mov s1si,al inc si cmp al,0dh jne lll mov dl,0ah mov ah,2 int 21h call change ;調(diào)用中綴轉后綴子程序 call calculate ;調(diào)用計算后綴表達式子程序exit: mov ah,4ch int 21h error:mov dx,offset buf1 ;輸出字符串 mov ah,9 ;buf1,提示輸入表達錯誤 int 21h jmp next1 next : pop ax ;從ax中彈出一個數(shù)據(jù) cmp ax, ;比較這個數(shù)據(jù)是否為 je next1 ;是則跳轉到nex
10、t1 mov storage,ax ;把ax賦給storage call output ;調(diào)用輸出運算結果子程序next1: mov ah,7 ;從鍵盤輸入一個字符不回顯 int 21h cmp al,1bh ;判斷這個字符是否為esc je exit change proc near ;中綴表達式轉換為 mov ah,0 ;后綴表達式的子程序 mov dh,0 mov si,0 mov di,0 push di cha: mov al,s1si ;數(shù)組元素的個數(shù)讀入al中 inc si cmp al,0dh je a cmp al,( je l1 ;al等于(跳轉到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轉移到c jmp error ;跳轉到error模塊 l1: push ax ;對左括號的處理 mov ax,0 push ax cmp s1si,- jne cha mov s2di,0 inc di mov s2di, inc dil2: mov bp,sp ;對加法的處理 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 ;對減法的處理 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 ;對乘法的處理 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 ;對除法的處理 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 ;對右括號的處理 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 ;對數(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跳轉到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 ;計算后綴表達式子程序 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 ;除法運算 pop ax idiv dl and ax,000fh push ax jmp calf3: pop dx ;乘法運算 pop ax imul dl push ax jmp calf2: pop dx ;減法運算 pop ax sub ax,dx push ax jmp calf1: pop ax ;加法運算 pop dx add ax,dx push ax
17、jmp cal retcalculate endpoutput proc near ;輸出運算結果子程序 mov si,0 mov ax,storage cmp ax,0 jge c1 neg ax ;取ax的補碼 mov nsi,- ;將-存入數(shù)組n中 inc sic1: cmp ax,10000 ;大于等于一萬則跳轉到c11 jge c11 cmp ax,1000 ;大于等于1000則跳轉到c12 jge c12 cmp ax,100 ;大于等于100則跳轉到c2 jge c2 cmp ax,10 ;大于等于10則跳轉到c3 jge c3 cmp ax,0 jge c4c11: mov d
18、x,0 mov bx,10000 idiv bx ;運算結果除以一萬,并將商賦給數(shù)組n add al,30h mov ds:nsi,al inc si mov ax,dx jmp c1c12: mov dx,0 mov bx,1000 ;運算結果除以一千,并將商賦給數(shù)組n idiv bx add al,30h mov ds:nsi,al inc si mov ax,dx jmp c1c2: mov cl,100 ;運算結果除以一百,并將商賦給數(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 ;運算結果除以一十,并將商賦給數(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六、程序運行示例以下是輸入一個帶括號的四則混合運算表達式輸出的結果:以下是輸入一個帶負數(shù)的四則混合運算表達式輸出的結果:以下是輸入高位十進制的四則混合運算表達式的輸出結果:以
20、下是輸入錯誤符號后報錯,然后按esc退出的結果:七、設計過程中遇到的問題及解決方法(1)在這次設計過程中用到的工具是masm5,在這個編程環(huán)境下使用je,jmp,jge之類的語句不能跳轉太長,很容易超出范圍。所以只有在中途設置個跳轉中轉函數(shù)。例如設置中轉函數(shù)為a,要跳到l8,先jmp 到a,然后a在jmp到l8。(2)在設計中綴表達式怎么轉換成后綴表達式遇到了算術符號優(yōu)先權的問題,后面通過一個棧來存放運算符,然后給每種運算符設定一個優(yōu)先級別,例如,+、-為01,*、/為02。然后通過與s1中的字符串比較優(yōu)先權,根據(jù)優(yōu)先權的大小彈出響應的運算符參與數(shù)據(jù)運算。(3)考慮到計算器怎么才能實現(xiàn)帶負數(shù)的運算,先判斷運算結果是否為負數(shù),如果是,將-存入數(shù)組n中,并對運算結果求補。(4)最后碰到了怎么實現(xiàn)通過按esc鍵退出程序,因為程序已經(jīng)編譯完成,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保護環(huán)境從我做起的演講稿
- 中秋佳節(jié)致辭范文(15篇)
- 人生大事觀后感(19篇)
- 為開學典禮的致辭(25篇)
- 中學生開學典禮致辭(8篇)
- 影響學生個性形成與發(fā)展的因素
- 集合課件教學課件
- 2025年安徽宣城廣德市引進高層次醫(yī)療衛(wèi)生人才15人筆試備考題庫及答案解析
- 2025年高考語文復習知識清單第六章文言文閱讀專題05選擇性必修下冊文言知識梳理(學生版+解析)
- 2024年11月6日車輛傷害事故演練方案
- 第三章營養(yǎng)性添加劑氨基酸添加劑課件
- JJF(蘇) 179-2015 風量儀校準規(guī)范-(現(xiàn)行有效)
- python期末考試練習題庫(含答案)
- 組織知識清單
- 《倍的認識》說課完整版課件
- 中國的地勢與地形課件
- 發(fā)電機房安全安全操作規(guī)程
- 加強醫(yī)養(yǎng)結合服務監(jiān)管實施方案
- 幼兒園班級區(qū)域環(huán)境創(chuàng)設課件
- Q∕GDW 12151-2021 采用對接裝置的輸電線路流動式起重機組塔施工工藝導則
- 《敘事式心理治療》精品PPT
評論
0/150
提交評論