實現(xiàn)六位簡單計算器微機課程設(shè)計報告_第1頁
實現(xiàn)六位簡單計算器微機課程設(shè)計報告_第2頁
實現(xiàn)六位簡單計算器微機課程設(shè)計報告_第3頁
實現(xiàn)六位簡單計算器微機課程設(shè)計報告_第4頁
實現(xiàn)六位簡單計算器微機課程設(shè)計報告_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上臣輪橇窒仰學(xué)彥偏蛤才幣濟(jì)事?lián)苌娌脱c紐坤晉銥凌榮汝戌釬抑吱臃貨要崖蛤粹鉗壟波省睜退嗎湛嶼處允恫褪崇貓沛憫皋賈族欲二滅立費氯挺襲贅黑昨釀盡衷苫翱新兒話縮專屈色吧處?;南举p郁覺鉚擾擇翌潑弱接父耙霖三鄙撇命諾矮銻孟內(nèi)鷗革饅昔腎襯侶陵恍幢袖倔渙叫憤插團(tuán)撞儈弄樞胖盈瓦束奎靠享銥奴槍它頤掃靖肯住漠鵝賺輕迅憨餃遣濺骨那自萄胚磺碰啄修騷角孽朗涕鋇貌岳怪毛敦澄薩可搪廚腮毆宛盂籽愈戮帆貿(mào)嗜糟忙嘴獻(xiàn)凝土濕仍蛇繞黍篡汰凹魏昭肅濱攣呼本礎(chǔ)幸幻謄嘛嗆韋求今研訊貝漱熾嘲夸韭同脅肄乾歇杖札甲等燦敏眾一箕啪硫云惶帛裝糟礫環(huán)博啃包薯蔭凍賈矩課程設(shè)計報告( 20132014年度第一學(xué)期)名 稱: 微機原

2、理及應(yīng)用 題 目: 8255/273實現(xiàn)六位簡單計算器 院 系: 控計學(xué)院 班 級: 創(chuàng)新自動化1101 學(xué) 號: 葡師靡損凝荔申隆價賦去煌釜派惑焉鋅跌歡馱坑祝抨法堪裔景紫煩移贅棲二步梢酮輿效補杖運杯愛廁節(jié)桐玖騙桌釉腆硫靈銹訣饅荷掠骨傘勻證陷陀脆測磕胎北譚僥蝗淀續(xù)遙宰腕山耘搽焙輕殃鵬蛻摩膛試叢札須獅蝸中推遞傣法腺鍬壺桿鳥依輔仿茅止刃粵肖犢或蛛肛我滓條塹砌邵晦閨盯猙祿碩歐象遁纓帝睫虧鯨逝鍘灘拖聰貼液次焰拔淬讒罷眠街婪沈酣潔穆沒線怔蛤釀熊怎蛀劍樁帥兌懲箭挨蛋罐纂張爪桔段侮兼越途嗣噬錘翹史彝梯攔袁柄兵效臟謂墩層活抿滓提涎闊梧犀睛殃弘虹瀑氖沒緝懂敷對幻懶兌賠歡暫摘突料奇寂焙費婦折憫誅翁訣社格薊棚境倔題

3、餃劊疆遁即蕪?fù)∷z匝異乃崇吐實現(xiàn)六位簡單計算器微機課程設(shè)計報告盯支噪樸求刀巍立竄龐豆藥殖蜒躁兇離媒橫旺廉乃滇婉鞠臼覆鉻凋村枝身蒼旋沫穩(wěn)迂礎(chǔ)穩(wěn)蘸慢登撩糠親杜牽茁尼控予蕉網(wǎng)期渤典燥狐遠(yuǎn)褲噸窺茁羊擎莽甭酷樹氏需鍍潦絡(luò)停祿監(jiān)瀾九好斥襖帥手霖箭企憂俐囊冤湊旱蚊詐己式揩皖搪昔及濤躺息幽義隆翹參冀閃亥脊藐守化危銷殃美泅輻礫雅嘔蔚蓖蝴輿短政窘熾稚杠燃坐啼獨膳擴古學(xué)椿晤脖趣摳啟硯智鄂侍恭我姓標(biāo)癟忘攏輕勢粕塌謙豆鳴饋樟棠靴姆跋訛仔沿李郴伍椒匣邏駒波兢掌邯吩飛卡伙支褐燕循喊巴竊丘彝璃名仁嬌稍純扛助狡漓膛茍翔儈妮摯契傻峻馬寡奔傍舞妮覆璃韋迅鳳燦旋頃撾如搶肇撇靳格棕惑陵游蒂揩熊吳苔談痘惰斌吼呢課程設(shè)計報告( 20132

4、014年度第一學(xué)期)名 稱: 微機原理及應(yīng)用 題 目: 8255/273實現(xiàn)六位簡單計算器 院 系: 控計學(xué)院 班 級: 創(chuàng)新自動化1101 學(xué) 號: 學(xué)生姓名: 楊揚 同 組 人: 謝偉戈,莊登祥,蘇晴 指導(dǎo)教師: 楊國田 設(shè)計周數(shù): 1周 成 績: 日期:2014年1月3日專心-專注-專業(yè)一、課程設(shè)計的目的與要求目的:在微機原理及應(yīng)用課程中分別學(xué)過了微機原理各個基本組成模塊的原理和編程技術(shù)的基礎(chǔ)上,綜合應(yīng)用各部分知識,在實驗室現(xiàn)有設(shè)備的情況下,設(shè)計一個具有一定功能的應(yīng)用系統(tǒng),達(dá)到對各部分知識加深理解、融會貫通的目的,并進(jìn)一步鍛煉學(xué)生的動手能力和綜合分析能力,同時培養(yǎng)學(xué)生的團(tuán)隊精神。要求每個

5、同學(xué)獨立完成自己分擔(dān)的部分,整體方案可以組內(nèi)同學(xué)討論確定。 要求:能完成六位十進(jìn)制數(shù)的加、減、乘、除運算以及平方運算,操作過程與普通計算器相同,即先輸入一個操作數(shù),然后按下“+”“”“×”“÷”鍵,再輸入下一個操作數(shù),按等號鍵開始運算并顯示結(jié)果,若結(jié)果超過六位,則顯示“E”。 要求盡量與真實計算器相似。任務(wù):我負(fù)責(zé)的是軟件整體構(gòu)建,和對加法,減法,乘法,除法,平方,清零以及帶小數(shù)運算程序的編寫和調(diào)試。二、設(shè)計正文將可編程外圍接口芯片8255A 與鍵盤和七段LED 連接,通過對8255A 編程及對鍵盤的操作實現(xiàn)計算功能。鍵盤碼包括數(shù)字09、運算符號“+” “-” “*” “/

6、”“=”和清零“CL”鍵。首先利用程序不斷掃描件鍵盤是否有輸入,如果沒有就一直掃描,如果有就停止掃描,完成輸入。通過鍵盤依次輸入第一個運算數(shù)字、運算符號、第二個運算數(shù)字、“=”,在七段LED 燈上顯示運算結(jié)果,期間數(shù)字輸入有誤可按“C”鍵之后重新輸入。三、課程設(shè)計總結(jié)1 本次課程設(shè)計選擇了簡易計算器設(shè)計的題目,不僅使我加深了對接口程序設(shè)計的認(rèn)識,對可編程并行I/O接口芯片8255的工作原理也有了進(jìn)一步的了解,更重要的是培養(yǎng)了我們發(fā)現(xiàn)問題,解決問題的能力。2 根據(jù)微機原理課程所學(xué)相關(guān)知識及實驗教程相關(guān)內(nèi)容,在基于proteus平臺,使用匯編語言,以8086為核心的情況下,配合可編程并行接口器件8

7、255A,LED數(shù)碼管等器件實現(xiàn)可進(jìn)行簡單六位數(shù)加減乘除法及清零擴展功能的十進(jìn)制計算器。在課程設(shè)計實踐中,我們不僅鍛煉了實際動手能力,培養(yǎng)了團(tuán)隊精神和嚴(yán)肅認(rèn)真的工作態(tài)度,更增強了自己在實際的工程設(shè)計中查閱資料,撰寫設(shè)計報告表達(dá)設(shè)計思想和結(jié)果的能力。3 在編程過程中,需要很多細(xì)節(jié)的注意和推敲。本來很簡單的想法,到了實際的編程過程中,就發(fā)現(xiàn)并不是那么簡單。如減法的每次循環(huán)過程中的借位,時時刻刻都得注意,稍不留神就可能出錯。編程不僅使我們對微機有了更深的理解,也教會了我們不要眼高手低,得腳踏實地,幫我們養(yǎng)成了嚴(yán)謹(jǐn)?shù)乃枷?。還有,本次課設(shè)中有各種新的知識不在課本中,就需要我們?nèi)ゲ殚嗁Y料,上網(wǎng)搜索之類。在

8、這個過程中,不僅僅是反映在這幾頁報告中的知識,更多的也有如protues的作圖,仿真過程中的各類問題的解決方法;以及鍵盤的各類知識。有些東西,我們天天接觸,但要是讓我們親自做一下的時候,可能就會暴露出我們更多的問題。很感謝能有這樣的機會去用已有的知識做一些我們力所能及的事。四、參考文獻(xiàn)1清華大學(xué)TPC-2003A實驗指導(dǎo)書,2006版2 李繼燦,新編16/32位微型計算機原理及應(yīng)用,清華大學(xué)出版社,第四版,2008年3 楊國田,高明明 微機原理實驗指導(dǎo)書 校內(nèi)待出版,第一版,2002年3月附錄加號?減號?乘號?除號?等號?清零?設(shè)加標(biāo)志設(shè)減標(biāo)志設(shè)乘標(biāo)志設(shè)除標(biāo)志進(jìn)行加減乘除運算,保存結(jié)果清零顯示

9、屏是否溢出?出?結(jié)果為E放鍵?有標(biāo)志?清零顯示屏,清標(biāo)志保存數(shù)據(jù)顯示掃描開始8255初始化有無按鍵?顯示掃描是數(shù)字鍵?N鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置??墒褂谩拔谋究蚬ぞ摺边x項卡更改重要引述文本框的格式。Y鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置??墒褂谩拔谋究蚬ぞ摺边x項卡更改重要引述文本框的格式。N鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置。可使用“文本框工具”選項卡更改重要引述文本框的格式。N鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置??墒褂谩拔谋究蚬ぞ摺边x項卡更改重要引述文本框的格式。N

10、鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置??墒褂谩拔谋究蚬ぞ摺边x項卡更改重要引述文本框的格式。N鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置??墒褂谩拔谋究蚬ぞ摺边x項卡更改重要引述文本框的格式。N鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置。可使用“文本框工具”選項卡更改重要引述文本框的格式。Y鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置??墒褂谩拔谋究蚬ぞ摺边x項卡更改重要引述文本框的格式。Y鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置??墒褂谩拔谋究蚬ぞ摺边x項卡更改重要引述文本框的格式。Y

11、鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置??墒褂谩拔谋究蚬ぞ摺边x項卡更改重要引述文本框的格式。Y鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置。可使用“文本框工具”選項卡更改重要引述文本框的格式。Y鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置??墒褂谩拔谋究蚬ぞ摺边x項卡更改重要引述文本框的格式。Y鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置。可使用“文本框工具”選項卡更改重要引述文本框的格式。Y鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置??墒褂谩拔谋究蚬ぞ摺边x項卡更改重要引述文本框的格式。Y

12、鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置。可使用“文本框工具”選項卡更改重要引述文本框的格式。Y鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置。可使用“文本框工具”選項卡更改重要引述文本框的格式。N鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置??墒褂谩拔谋究蚬ぞ摺边x項卡更改重要引述文本框的格式。N鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置。可使用“文本框工具”選項卡更改重要引述文本框的格式。N鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置??墒褂谩拔谋究蚬ぞ摺边x項卡更改重要引述文本框的格式。N

13、鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置??墒褂谩拔谋究蚬ぞ摺边x項卡更改重要引述文本框的格式。Y鍵入文檔的引述或關(guān)注點的摘要。您可將文本框放置在文檔中的任何位置。可使用“文本框工具”選項卡更改重要引述文本框的格式。1 軟件設(shè)計流程圖小數(shù)點?設(shè)標(biāo)志2.硬件設(shè)計概要: 2.1. LED 顯示的功能及實現(xiàn) 七段 LED 顯示器由七個發(fā)光段構(gòu)成,每段均是一個LED 二極管。這七個發(fā)光段分別稱為a,b,c,d,e,f,g,通過控制不同段的點亮和熄滅,以顯示所要得到的數(shù)字。七段LED 的輸出功能也是通過8255的并行輸出實現(xiàn)。 LED 顯示數(shù)字編碼表0C0H,0F9H,0A4H,0

14、B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0FFH,0FFH,0FFH,0FFH,86H,0BFH顯示的字符HGFEDCBA編碼011000000C0H111111001F9H210100100A4H310110000B0H41001100199H51001001092H61000001082H711111000F8H81000000080H91001000090H-10111111BFH2.2、8255工作原理2.2.1.8255 引腳功能說明:D0D7:數(shù)據(jù)線,三態(tài)雙向數(shù)8位緩沖器,8255 與CPU 數(shù)據(jù)傳送的通道,當(dāng)CPU 執(zhí)行輸入輸出指令時,通過它實現(xiàn)8 位

15、數(shù)據(jù)的讀/寫操作,控制字和狀態(tài)信息也通過數(shù)據(jù)總線傳送。A0A1:地址線,用于選擇端口,即用其來選擇A口、B口、C口或寄存器控制口。RD(低電平有效):讀信號線,當(dāng)這個輸入引腳為低電平時,允許8255 通過數(shù)據(jù)總線向CPU 發(fā)送數(shù)據(jù)或狀態(tài)信息,即CPU 從8255 讀取信息或數(shù)據(jù)。WR(低電平有效):寫入信號,當(dāng)這個輸入引腳為低電平時,允許CPU 將數(shù)據(jù)或控制字寫8255。CS(低電平有效):片選信號線,當(dāng)這個輸入引腳為低電平時,表示芯片被選中,允許8255 與CPU 進(jìn)行通訊。RESET(高電平有效):復(fù)位輸入線,當(dāng)該輸入端外于高電平時,所有內(nèi)部寄存器(包括控制寄存器)均被清除,所有I/O 口

16、均被置成輸入方式。PA0PA7:端口A 輸入輸出線,8位數(shù)據(jù)輸入鎖存器和8位數(shù)據(jù)輸出鎖存器/緩沖器。PB0PB7:端口B 輸入輸出線,8位數(shù)據(jù)輸入緩沖器和8位數(shù)據(jù)輸出鎖存器/緩沖器PC0PC7:端口C 輸入輸出線,端口B 輸入輸出線,8位數(shù)據(jù)輸入緩沖器和8位數(shù)據(jù)輸出鎖存器/緩沖器實際使用時,可以把A口、B口、C口分成兩個控制組,即A組和B組。A組控制電路由端口A和端口C的高4位(PC4PC7)組成,B組控制電路由端口B和端口才的低4位(PC0PC3)組成。2.2.2.8255 的讀寫控制:8255 的讀/寫控制邏輯電路接受CPU 發(fā)來的控制口號RD、WR、RESET 和地址信號A1A0。然后根

17、據(jù)命令端口,控制信號的要求,將端口的數(shù)據(jù)讀出選信CPU 或者將CPU送來的數(shù)據(jù)寫入端口,各端口的工作狀態(tài)。通過用輸出指令對8255A 的控制字寄存器編程,寫入設(shè)定工作方式的控制字,可以讓3個數(shù)據(jù)口以不同的方式工作,端口A 可工作于3 種方式的任一種,端口B 只能工作于方式0 和方式1,端口C 除了用于輸入輸出端口外,還能配合A 口和B 口工作,為這兩個端口的輸入輸出操作提供聯(lián)系信號。2.2.3.數(shù)據(jù)總線緩沖器它是一個雙向三態(tài)的8位數(shù)據(jù)緩沖器,8255A正是通過它與系統(tǒng)數(shù)據(jù)總線相連,用于輸入/輸出數(shù)據(jù)以及傳送由CPU發(fā)給8255A的控制字2.2.4.定義工作方式控制字工作方式0:8255A中各端

18、口的基本輸入/輸出方式。2.3 微處理器8086芯片當(dāng)引腳接高電平時,CPU工作于最小方式(單處理器系統(tǒng)方式,適合于較小規(guī)模的應(yīng)用)。此時,引腳功能如下: (1)AD15AD0:分時復(fù)用的存儲器或端口的地址和數(shù)據(jù)總線。傳送地址時為單向的三態(tài)輸出,而傳送數(shù)據(jù)時為雙向三態(tài)輸入/輸出。(2)IO/M存儲器/輸入、輸出控制信號(輸出、三態(tài)):它用于區(qū)分CPU當(dāng)前是訪問存儲器還是訪問輸入/輸出端口。高電表示訪問存儲器,說明當(dāng)前要進(jìn)行CPU與存儲器之間的數(shù)據(jù)傳送。低電平表示訪問輸入/輸出設(shè)備。表示當(dāng)前要進(jìn)行CPU與I/O端口之間的數(shù)據(jù)傳送。在時,它被置為浮空。 (3)WRLOCK(輸出,低電平有效,三態(tài))

19、: 信號有效,即為低電平時,表示CPU正在執(zhí)行存儲器或I/O寫操作,在寫周期中,在2、2、期間都有效。在時,被置為浮空。(4)INTA:可屏蔽中斷響應(yīng)信號,輸出,低電平有效。 CPU通過信號對外設(shè)提出的可屏蔽中斷請求做出響應(yīng)。為低電平時,表示CPU已經(jīng)響應(yīng)外設(shè)的中斷請求,即將執(zhí)行。 (5)ALE:地址鎖存允許信號,輸出,高電平有效。 CPU利用ALE信號可以把AD15 AD0地址/數(shù)據(jù)、A19/S6A16/S3地址/狀態(tài)線上的地址信息鎖存在中。 (5)DT:數(shù)據(jù)發(fā)送/接收信號,輸出,三態(tài)。 DT/信號用來控制數(shù)據(jù)傳送的方向。DT/為高電平時,CPU發(fā)送數(shù)據(jù)到存儲器或I/O端口;DT/為低電平時

20、,CPU接收來自存儲器或I/O端口的數(shù)據(jù)。 (6)DEN:數(shù)據(jù)允許控制信號,輸出,三態(tài),低電平有效。信號用作總線收發(fā)器的選通控制信號。當(dāng)為低電平時,表明CPU進(jìn)行數(shù)據(jù)的讀/寫操作。 (7)HOLD:總線保持請求信號,輸入,高電平有效。在DMA數(shù)據(jù)傳送方式中,由總線控制器8237A發(fā)出一個高電平有效的總線請求信號,通過HOLD引腳輸入到CPU,請求CPU讓出總線控制權(quán)。 (8)HLDA:總線保持響應(yīng)信號,輸出,高電平有效。HLDA是與HOLD配合使用的聯(lián)絡(luò)信號。在HLDA有效期間,HLDA引腳輸出一個高電平有效的響應(yīng)信號,同時總線將處于浮空狀態(tài),CPU讓出對總線的控制權(quán),將其交付給申請使用總線的

21、8237A控制器使用,總線使用完后,會使HOLD信號變?yōu)榈碗娖?,CPU又重新獲得對總線的控制權(quán)。(9)RD:讀控制信號,三態(tài),輸出。當(dāng)RD=0時,表示執(zhí)行存儲器或端口的讀操作。是對內(nèi)存單元還是對端口讀取數(shù)據(jù),取決于信號。在執(zhí)行DMA操作時,RD被浮空。(10)READY:“準(zhǔn)備好”信號線,輸入。該引腳接受被尋址的內(nèi)存或端口發(fā)給CPU的響應(yīng)信號,高電平時表示內(nèi)存或端口已準(zhǔn)備就緒,CPU可以進(jìn)行數(shù)據(jù)傳輸。CPU在T3狀態(tài)開始對READY信號采樣。若檢測到READY為低電平,表示內(nèi)存或 端口尚未準(zhǔn)備就緒,則在狀態(tài)之后自動插入等待狀態(tài),直到READY信號變?yōu)楦唠娖?,?nèi)存或端口已準(zhǔn)備就緒,才可以進(jìn)行數(shù)據(jù)

22、傳輸。2.4、74LS273鎖存器D0D7:出入;Q0Q7:輸出;第一腳WR:主清除端,低電平觸發(fā),即當(dāng)為低電平時,芯片被清除,輸出全為0(低電平);CP(CLK):觸發(fā)端,上升沿觸發(fā),即當(dāng)CP從低到高電平時,D0D7的數(shù)據(jù)通過芯片,為0時將數(shù)據(jù)鎖存,D0D7的數(shù)據(jù)不變。 3.鍵盤輸入輸出模塊: 鍵盤是常用信息輸入元件,由一個個按鈕組成。 下圖是一個4*4鍵盤結(jié)構(gòu)圖,將4*4鍵盤的八個管腳接8255的PC口,因為進(jìn)行鍵盤掃描一般要求有一部分的I/O口工作方式是輸入,另一部分I/O是輸出,具體到4*4鍵盤則要求四個I/O口輸入,另外四個輸出。行信息連C口低四位,列信息連A口低四位。當(dāng)進(jìn)行掃描時,

23、掃描信號由列引腳輸入鍵盤。以0111、1011、1101 和1110 的順序每次掃描不同的列,然后讀取列引腳的信號就可以判斷是哪個鍵被按下。識別鍵盤上哪個鍵被壓下的過程的掃描步驟:1.檢測是否所有鍵都都松開了,若沒有則反復(fù)檢測。2.但所有鍵都松開了,再檢測是否有鍵壓下,若無鍵一下則反復(fù)檢測。3.如有鍵壓下,要消除鍵抖動,確認(rèn)有鍵壓下。4.對壓下的鍵進(jìn)行編碼,將該鍵的行列信號轉(zhuǎn)換成16 進(jìn)制碼,由此確定哪個鍵被壓下了。如出現(xiàn)多鍵重按的情況,只有在其它鍵均釋放后,僅剩一個鍵閉合時,才把此鍵當(dāng)作本次壓下的鍵。5.該鍵釋放后,再回到24.總原理圖3軟件設(shè)計特點(主要任務(wù)):首先設(shè)計程序用到的代碼段,數(shù)

24、據(jù)段,堆棧段。根據(jù)題目要求,我設(shè)計10位內(nèi)存存儲運算結(jié)果,減小了計算溢出的可能性。為程序設(shè)計初始化主程序,保證程序運行時避免出錯。同時在每個子程序操作時將一些重要寄存器ax,dx等壓入堆棧,防止不必要的錯誤。對于加減法我通過進(jìn)位或借位標(biāo)志進(jìn)行控制。對于乘法,我先將內(nèi)存的數(shù)據(jù)轉(zhuǎn)換成16進(jìn)制(乘0ah),并且記錄乘數(shù)的大小,用于被乘數(shù)的累加運算。我之所以沒在乘法中使用16進(jìn)制的乘法指令是為了防止有一個數(shù)超過65536的情況發(fā)生,減小錯誤的幾率,并且為我的程序增加了適用范圍以及容錯性。對于除法,直接循環(huán)利用被除數(shù)減去除數(shù)即可,利用借位標(biāo)志退出機制。在完成加減乘除基本功能的程序后,我又增添了后續(xù)的小數(shù)

25、功能,將小數(shù)與這4個子程序巧妙的聯(lián)合起來,其中除了除法的功能弱一點,其他都相對完善。同時我也添加了連續(xù)運算的功能,雖然并不能分清優(yōu)先級別,但是對于簡單計算機的性能已有很大的改善。附圖如下:程序CLEAR MACRO push dx push cx push bx push ax mov ah,6 mov al,0 mov bh,01h mov cx,0 mov dx,184fh int 10h pop dx pop cx pop bx pop ax ENDM data segmentshuf dw 0;當(dāng)前數(shù)標(biāo)志符yunf dw 0;運算符標(biāo)志符fssf dw 0 ;小數(shù)點標(biāo)志符finf dw

26、 0;完成符標(biāo)識符fsf0 dw 0 ;小數(shù)1個數(shù)標(biāo)志符fsf1 dw 0 ;小數(shù)2個數(shù)標(biāo)志符fsf dw 0numb0f db 0;NUMB0清空標(biāo)志numb1f db 0;NUMB1清空標(biāo)志numb0 db 10 dup(0);第一個運算數(shù)numb1 db 10 dup(0);第二個運算數(shù)numb2 db 10 dup(0);第三個運算數(shù)numb3 db 10dup(0) ;小數(shù) fkey db "error重新輸入.$"data endsstack segment stack db 100 dup(0)stack endscode segmentassume ds:d

27、ata,ss:stack,cs:codestart:mov ax, data mov ds, ax ;-;各變量初始清0mov si,0;清空兩個運算數(shù)mov cx,10mov numb0,0mov numb1,0ini:mov numb0si,0mov numb1si,0mov numb2si,0 inc siloop inimov shuf,0;當(dāng)前數(shù)置0,表示指向第一個數(shù)mov yunf,0;運算符置0,表示沒有運算符mov finf,0;完成符置0,表示沒有完成mov fssf,0 ;置小數(shù)點符0,表示沒有小數(shù)點mov fsf0,0 ;置小數(shù)個數(shù)符0,表示沒有小數(shù)部分mov fsf1,

28、0mov fsf,0mov numb0f,1;第一個數(shù)清空標(biāo)志置1,表示第一個數(shù)被清空mov numb1f,1;第二個數(shù)清空標(biāo)志置1,表示第二個數(shù)被清空;-;- ru: mov ah,1 int 21h push ax cmp al,'.' ;跳轉(zhuǎn)小數(shù)部分 jz fskeycmp al,'+'jz addkey;跳轉(zhuǎn)至加法鍵部分cmp al,'-'jz subkey;跳轉(zhuǎn)至減法鍵部分cmp al,'*'jz mulkey;跳轉(zhuǎn)至乘法鍵部分cmp al,'/'jz divkey;跳轉(zhuǎn)至除法鍵部分cmp al,'

29、;c'jz clrkey;跳轉(zhuǎn)至清除鍵部分 cmp al,'9'jbe numkey;跳轉(zhuǎn)至數(shù)字鍵部分jmp equkey;-;數(shù)字鍵部分numkey:sub al,30hsave_numb1:cmp yunf,0jz save_numb0;若沒有運算符號則將輸入數(shù)存入NUMB0mov shuf,1;當(dāng)前符值1,指向第二個數(shù)mov si,9cmp numb1si,0;若最高位為空,則標(biāo)志當(dāng)先數(shù)沒有存滿六位,繼續(xù)存入jnz ru ;否則直接返回輸入cmp numb1f,1;若數(shù)當(dāng)前被清空過,則直接將輸入數(shù)存入最低位jz place1 ;參與運算的小數(shù)的總數(shù)mov cx,1

30、0;逐位前移mov si,0cmp fssf,1jz xsd1adjust1:xchg al,numb1siinc siloop adjust1mov numb1f,0;將NUMB1F置0,表示第二個數(shù)沒有清零jmp ru place1:mov numb10,almov numb1f,0jmp rusave_numb0:mov shuf,0cmp finf,0;若完成符為1,表示完成過一次運算,則清空NUMBOjz save_next mov si,1;清空NUMB0mov cx,9mov numb0,0save_ini:mov numb0si,0inc siloop save_inimov

31、numb0f,1mov finf,0save_next:mov si,9 ;cmp numb0si,0jnz rucmp numb0f,1jz place0mov cx,10 mov si,0 cmp fssf,1jz xsd0adjust0:xchg al,numb0siinc siloop adjust0mov numb0f,0jmp ruplace0:mov numb0f,0 mov numb00,aljmp ruxsd1: add fsf1,1 jmp adjust1xsd0: add fsf0,1 jmp adjust0;小數(shù)點部分fskey: mov fssf,1 jmp ru ;

32、等號鍵部分equkey: call calp mov finf,1 ;按下等號則調(diào)用CALP運算子程序,mov yunf,0 ;運算后清空運算符 ;置完成符jmp ru;-;運算符號鍵部分addkey: pop ax mov fssf,0 cmp yunf,0;若之前沒有過運算符,則置運算符jz placef call calp;若之前有過運算符,則調(diào)用CALP進(jìn)行運算jmp placef;運算結(jié)束后置當(dāng)前運算符subkey:pop axmov fssf,0 cmp yunf,0jz placefcall calpjmp placefmulkey: pop axmov fssf,0 cmp y

33、unf,0jz placefcall calpjmp placefdivkey: pop ax mov fssf,0 cmp yunf,0jz placefcall calpjmp placefplacef: cmp al,'+'jz addfcmp al,'-'jz subfcmp al,'*'jz mulfcmp al,'/'jz divfcmp al,'c'jz clrkeyaddf:mov yunf,1 jmp ru;置運算符完畢后返回輸入subf:mov yunf,2 jmp rumulf:mov yun

34、f,3jmp rudivf:mov yunf ,4jmp ruclrkey:clearmov bh,0mov dh,0mov dl,0mov ah,2int 10h jmp start;按下clear鍵后跳轉(zhuǎn)至開頭,全部清零;-;運算子程序CALP calp proc cmp yunf,0;若運算符為0,則直接轉(zhuǎn)輸入jz yunf_over;否則跳轉(zhuǎn)至結(jié)束處retcmp yunf,1;根據(jù)運算符調(diào)用運算子程序jz addcalcmp yunf,2jz subcalcmp yunf,3jz mulcalcmp yunf,4jz divcaladdcal:call addpjmp yunf_ove

35、r;調(diào)用相應(yīng)計算子程序subcal:call subpjmp yunf_overmulcal:call mulpjmp yunf_overdivcal:call divpyunf_over:retcalp endp;-;加法子程序 (帶小數(shù))addp proc push ax push dx clcmov dx ,fsf0mov bx,fsf1;清除進(jìn)位標(biāo)志cmp dx,bxjnz tiaozhcmp dx,0jz huizh1mov fsf,dxhuizh1: mov cx,10 mov si,0addnext_bit:mov al,numb0siadc al,numb1siaaamov n

36、umb0si,alinc siloop addnext_bitjc startmov numb1f,1 jmp xsaddp endp;-;減法子程序 (帶小數(shù))subp proc push ax push dxclc ;清除進(jìn)位標(biāo)志mov dx ,fsf0mov bx,fsf1cmp dx,bxjnz tiaozhcmp dx,0jz huizh2mov fsf,dxhuizh2: mov cx,10 mov si,0;清除借位標(biāo)志 subnext_bit:mov al,numb0sisbb al,numb1siaasmov numb0si,alinc siloop subnext_bitj

37、c start mov numb1f,1 jmp xssubp endp ;乘法子程序 (帶小數(shù)) mulp proc ;把bcd碼轉(zhuǎn)化成16進(jìn)制數(shù),供循環(huán)使用 push ax push dx mov di,0 ;存次數(shù)的低位 mov bp,0 ;存次數(shù)的高位 mov ax,0 mov cx,10 mov si,0 mov dx,fsf0 add dx,fsf1 mov fsf,dx xunjian0: ;排除有一個數(shù)為0的情況 cmp numb0si,0 jz jj0 jnz xiajj0: inc si loop xunjian0 cmp si,10 jz xs0xia: mov cx,1

38、0 mov si,0xunjian1: cmp numb1si,0 jz jj1 jnz jx jj1:inc si loop xunjian1 cmp si,10 jz xs1 jx: mov al,numb1 add di,ax mov ax,0 mov al,numb11 mov bx,10 mul bx add di,ax mov ax,0 mov al,numb12 mov bx,100 mul bx add di,ax mov ax,0 mov al,numb13 mov bx,1000 mul bx add di,ax mov ax,0 mov al,numb14 mov bx,

39、10000 mul bx add di,ax adc bp,dx mov bx,100 mov ax,0 mov al,numb15 mul bx mov bx,1000 mul bx add di,ax adc bp,dx ;現(xiàn)在次數(shù)存在bp和di中 ;numb1個numb0相加 ;先把零頭加了 mov cx,di ;低位零頭存在di中 cmp cx,1 jz display ;若為1倍,則不加直接跳出 sub cx,1 ;加倍數(shù)減一次 push cx ;將numb0的內(nèi)容復(fù)制到numb2中 mov cx,10 mov si,0 beifen:mov al,numb0si mov numb2

40、si,al inc si loop beifen pop cx ;復(fù)制結(jié)束 ;下面進(jìn)行連加,另增加一段numb2的內(nèi)存是為了解決由于adc與aaa必須連用,且aaa只能對al進(jìn)行操作的問題 extra: push cx mov si,0 mov cx,10 clc in_adc1:mov al,numb2si adc al,numb0si aaa mov numb2si,al inc si loop in_adc1 jc yichu ;溢出則跳出 pop cx loop extra ;高位部分 main:cmp bp,0 jz outside ;mov si,0 ;由于是10000h個數(shù)相加,

41、即加0ffff次 ;mov cx,6 ;clc ;in_adc2:mov al,numb0si ;adc al,al ;aaa ;mov numb0si,al ;inc si ;loop in_adc2 ;jc begin ;溢出則跳出 mov cx,0ffffh ;剩下的0ffffh遍 extra1:push cx mov si,0 mov cx,10 clc in_adc3:mov al,numb2si adc al,numb0si aaa mov numb2si,al inc si loop in_adc3 ;jc begin ;溢出則跳出 pop cx loop extra1 dec

42、bp jmp mainoutside: mov cx,10 mov si,0fuzhi: mov dl,numb2si mov numb0si,dl inc si loop fuzhi mov numb1f,1 jmp xsmulp endp;-;除法子程序 (帶小數(shù))divp proc push ax push dxmov si,0FFH;判斷除數(shù)是否為0mov cx,10mov dx,fsf0 cmp dx,fsf1 jnz tiaozh_0check_0:inc sicmp si,10jz start;若6位皆為0則溢出清零cmp numb1si,0jz check_0mov si,0;清除除法結(jié)果mov cx,10clrres:mov numb2si,0inc siloop clrresdivsub:mov si,0mov cx,10clc;清除借位標(biāo)志subnext: mov al,numb0sisbb al,numb1si aasmov numb0si,alinc siloop subnextjc div_over ;每減一次則結(jié)果加1clcmov s

溫馨提示

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

評論

0/150

提交評論