版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> ( 2013—2014年度第一學(xué)期)</p><p> 名 稱(chēng): 微機(jī)原理及應(yīng)用 </p><p> 題 目: 8255/273實(shí)現(xiàn)六位簡(jiǎn)單計(jì)算器 </p><p> 院 系: 控計(jì)學(xué)院
2、 </p><p> 班 級(jí): 創(chuàng)新自動(dòng)化1101 </p><p> 學(xué) 號(hào): </p><p> 學(xué)生姓名: </p><p> 日期:2014年1月3日</p>&l
3、t;p> 一、課程設(shè)計(jì)的目的與要求</p><p> 目的:在微機(jī)原理及應(yīng)用課程中分別學(xué)過(guò)了微機(jī)原理各個(gè)基本組成模塊的原理和編程技術(shù)的基礎(chǔ)上,綜合應(yīng)用各部分知識(shí),在實(shí)驗(yàn)室現(xiàn)有設(shè)備的情況下,設(shè)計(jì)一個(gè)具有一定功能的應(yīng)用系統(tǒng),達(dá)到對(duì)各部分知識(shí)加深理解、融會(huì)貫通的目的,并進(jìn)一步鍛煉學(xué)生的動(dòng)手能力和綜合分析能力,同時(shí)培養(yǎng)學(xué)生的團(tuán)隊(duì)精神。要求每個(gè)同學(xué)獨(dú)立完成自己分擔(dān)的部分,整體方案可以組內(nèi)同學(xué)討論確定。 <
4、/p><p> 要求:能完成六位十進(jìn)制數(shù)的加、減、乘、除運(yùn)算以及平方運(yùn)算,操作過(guò)程與普通計(jì)算器相同,即先輸入一個(gè)操作數(shù),然后按下“+”“—”“×”“÷”鍵,再輸入下一個(gè)操作數(shù),按等號(hào)鍵開(kāi)始運(yùn)算并顯示結(jié)果,若結(jié)果超過(guò)六位,則顯示“E”。</p><p> 要求盡量與真實(shí)計(jì)算器相似。</p><p> 任務(wù):我負(fù)責(zé)的是軟件整體構(gòu)建,和對(duì)加法,減法,
5、乘法,除法,平方,清零以及帶小數(shù)運(yùn)算程序的編寫(xiě)和調(diào)試。</p><p><b> 二、設(shè)計(jì)正文</b></p><p> 將可編程外圍接口芯片8255A 與鍵盤(pán)和七段LED 連接,通過(guò)對(duì)8255A 編程及對(duì)鍵盤(pán)的操作實(shí)現(xiàn)計(jì)算功能。鍵盤(pán)碼包括數(shù)字0~9、運(yùn)算符號(hào)“+” “-” “*” “/”“=”和清零“CL”鍵。</p><p> 首先利
6、用程序不斷掃描件鍵盤(pán)是否有輸入,如果沒(méi)有就一直掃描,如果有就停止掃描,完成輸入。通過(guò)鍵盤(pán)依次輸入第一個(gè)運(yùn)算數(shù)字、運(yùn)算符號(hào)、第二個(gè)運(yùn)算數(shù)字、“=”,在七段LED 燈上顯示運(yùn)算結(jié)果,期間數(shù)字輸入有誤可按“C”鍵之后重新輸入。</p><p><b> 三、課程設(shè)計(jì)總結(jié)</b></p><p> 本次課程設(shè)計(jì)選擇了簡(jiǎn)易計(jì)算器設(shè)計(jì)的題目,不僅使我加深了對(duì)接口程序設(shè)計(jì)的認(rèn)識(shí)
7、,對(duì)可編程并行I/O接口芯片8255的工作原理也有了進(jìn)一步的了解,更重要的是培養(yǎng)了我們發(fā)現(xiàn)問(wèn)題,解決問(wèn)題的能力。</p><p> 根據(jù)微機(jī)原理課程所學(xué)相關(guān)知識(shí)及實(shí)驗(yàn)教程相關(guān)內(nèi)容,在基于proteus平臺(tái),使用匯編語(yǔ)言,以8086為核心的情況下,配合可編程并行接口器件8255A,LED數(shù)碼管等器件實(shí)現(xiàn)可進(jìn)行簡(jiǎn)單六位數(shù)加減乘除法及清零擴(kuò)展功能的十進(jìn)制計(jì)算器。在課程設(shè)計(jì)實(shí)踐中,我們不僅鍛煉了實(shí)際動(dòng)手能力,培養(yǎng)了團(tuán)隊(duì)
8、精神和嚴(yán)肅認(rèn)真的工作態(tài)度,更增強(qiáng)了自己在實(shí)際的工程設(shè)計(jì)中查閱資料,撰寫(xiě)設(shè)計(jì)報(bào)告表達(dá)設(shè)計(jì)思想和結(jié)果的能力。</p><p> 在編程過(guò)程中,需要很多細(xì)節(jié)的注意和推敲。本來(lái)很簡(jiǎn)單的想法,到了實(shí)際的編程過(guò)程中,就發(fā)現(xiàn)并不是那么簡(jiǎn)單。如減法的每次循環(huán)過(guò)程中的借位,時(shí)時(shí)刻刻都得注意,稍不留神就可能出錯(cuò)。編程不僅使我們對(duì)微機(jī)有了更深的理解,也教會(huì)了我們不要眼高手低,得腳踏實(shí)地,幫我們養(yǎng)成了嚴(yán)謹(jǐn)?shù)乃枷?。還有,本次課設(shè)中有各種
9、新的知識(shí)不在課本中,就需要我們?nèi)ゲ殚嗁Y料,上網(wǎng)搜索之類(lèi)。在這個(gè)過(guò)程中,不僅僅是反映在這幾頁(yè)報(bào)告中的知識(shí),更多的也有如protues的作圖,仿真過(guò)程中的各類(lèi)問(wèn)題的解決方法;以及鍵盤(pán)的各類(lèi)知識(shí)。有些東西,我們天天接觸,但要是讓我們親自做一下的時(shí)候,可能就會(huì)暴露出我們更多的問(wèn)題。很感謝能有這樣的機(jī)會(huì)去用已有的知識(shí)做一些我們力所能及的事。</p><p><b> 四、參考文獻(xiàn)</b></p
10、><p> [1]《清華大學(xué)TPC-2003A實(shí)驗(yàn)指導(dǎo)書(shū)》,2006版</p><p> [2] 李繼燦,《新編16/32位微型計(jì)算機(jī)原理及應(yīng)用》,清華大學(xué)出版社,第四版,2008年</p><p> [3] 楊國(guó)田,高明明 《微機(jī)原理實(shí)驗(yàn)指導(dǎo)書(shū)》 校內(nèi)待出版,第一版,2002年3月</p><p><b> 附錄</b&
11、gt;</p><p><b> 軟件設(shè)計(jì)流程圖</b></p><p><b> 2.硬件設(shè)計(jì)概要:</b></p><p> 2.1. LED 顯示的功能及實(shí)現(xiàn)</p><p> 七段 LED 顯示器由七個(gè)發(fā)光段構(gòu)成,每段均是一個(gè)LED 二極管。這七個(gè)發(fā)光段分別稱(chēng)為a,b,c,d,e,f
12、,g,通過(guò)控制不同段的點(diǎn)亮和熄滅,以顯示所要得到的數(shù)字。七段LED 的輸出功能也是通過(guò)8255的并行輸出實(shí)現(xiàn)。</p><p> LED 顯示數(shù)字編碼表</p><p> 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0FFH,0FFH,0FFH,0FFH,86H,0BFH</p><p> 2.2、825
13、5工作原理</p><p> 2.2.1.8255 引腳功能說(shuō)明:</p><p> D0~D7:數(shù)據(jù)線(xiàn),三態(tài)雙向數(shù)8位緩沖器,8255 與CPU 數(shù)據(jù)傳送的通道,當(dāng)CPU 執(zhí)行輸入輸出指令時(shí),通過(guò)它實(shí)現(xiàn)8 位數(shù)據(jù)的讀/寫(xiě)操作,控制字和狀態(tài)信息也通過(guò)數(shù)據(jù)總線(xiàn)傳送。</p><p> A0~A1:地址線(xiàn),用于選擇端口,即用其來(lái)選擇A口、B口、C口或寄存器控制口。
14、</p><p> RD(低電平有效):讀信號(hào)線(xiàn),當(dāng)這個(gè)輸入引腳為低電平時(shí),允許8255 通過(guò)數(shù)據(jù)總線(xiàn)向CPU 發(fā)送數(shù)據(jù)或狀態(tài)信息,即CPU 從8255 讀取信息或數(shù)據(jù)。</p><p> WR(低電平有效):寫(xiě)入信號(hào),當(dāng)這個(gè)輸入引腳為低電平時(shí),允許CPU 將數(shù)據(jù)或控制字寫(xiě)8255。</p><p> CS(低電平有效):片選信號(hào)線(xiàn),當(dāng)這個(gè)輸入引腳為低電平時(shí),
15、表示芯片被選中,允許8255 與CPU 進(jìn)行通訊。</p><p> RESET(高電平有效):復(fù)位輸入線(xiàn),當(dāng)該輸入端外于高電平時(shí),所有內(nèi)部寄存器(包括控制寄存器)均被清除,所有I/O 口均被置成輸入方式。</p><p> PA0~PA7:端口A 輸入輸出線(xiàn),8位數(shù)據(jù)輸入鎖存器和8位數(shù)據(jù)輸出鎖存器/緩沖器。</p><p> PB0~PB7:端口B 輸入輸出
16、線(xiàn),8位數(shù)據(jù)輸入緩沖器和8位數(shù)據(jù)輸出鎖存器/緩沖器</p><p> PC0~PC7:端口C 輸入輸出線(xiàn),端口B 輸入輸出線(xiàn),8位數(shù)據(jù)輸入緩沖器和8位數(shù)據(jù)輸出鎖存器/緩沖器</p><p> 實(shí)際使用時(shí),可以把A口、B口、C口分成兩個(gè)控制組,即A組和B組。A組控制電路由端口A和端口C的高4位(PC4~PC7)組成,B組控制電路由端口B和端口才的低4位(PC0~PC3)組成。</p
17、><p> 2.2.2.8255 的讀寫(xiě)控制:</p><p> 8255 的讀/寫(xiě)控制邏輯電路接受CPU 發(fā)來(lái)的控制口號(hào)RD、WR、RESET 和地址信號(hào)A1~A0。然后根據(jù)命令端口,控制信號(hào)的要求,將端口的數(shù)據(jù)讀出選信CPU 或者將CPU送來(lái)的數(shù)據(jù)寫(xiě)入端口,各端口的工作狀態(tài)。通過(guò)用輸出指令對(duì)8255A 的控制字寄存器編程,寫(xiě)入設(shè)定工作方式的控制字,可以讓3個(gè)數(shù)據(jù)口以不同的方式工作,端口
18、A 可工作于3 種方式的任一種,端口B 只能工作于方式0 和方式1,端口C 除了用于輸入輸出端口外,還能配合A 口和B 口工作,為這兩個(gè)端口的輸入輸出操作提供聯(lián)系信號(hào)。</p><p> 2.2.3.數(shù)據(jù)總線(xiàn)緩沖器</p><p> 它是一個(gè)雙向三態(tài)的8位數(shù)據(jù)緩沖器,8255A正是通過(guò)它與系統(tǒng)數(shù)據(jù)總線(xiàn)相連,用于輸入/輸出數(shù)據(jù)以及傳送由CPU發(fā)給8255A的控制字</p>
19、<p> 2.2.4.定義工作方式控制字</p><p> 工作方式0:8255A中各端口的基本輸入/輸出方式。</p><p> 2.3 微處理器8086芯片</p><p> 當(dāng)引腳接高電平時(shí),CPU工作于最小方式(單處理器系統(tǒng)方式,適合于較小規(guī)模的應(yīng)用)。此時(shí),引腳功能如下: </p><p> (1)AD15~AD
20、0:分時(shí)復(fù)用的存儲(chǔ)器或端口的地址和數(shù)據(jù)總線(xiàn)。傳送地址時(shí)為單向的三態(tài)輸出,而傳送數(shù)據(jù)時(shí)為雙向三態(tài)輸入/輸出。</p><p> (2)IO/M存儲(chǔ)器/輸入、輸出控制信號(hào)(輸出、三態(tài)):它用于區(qū)分CPU當(dāng)前是訪(fǎng)問(wèn)存儲(chǔ)器還是訪(fǎng)問(wèn)輸入/輸出端口。高電表示訪(fǎng)問(wèn)存儲(chǔ)器,說(shuō)明當(dāng)前要進(jìn)行CPU與存儲(chǔ)器之間的數(shù)據(jù)傳送。低電平表示訪(fǎng)問(wèn)輸入/輸出設(shè)備。表示當(dāng)前要進(jìn)行CPU與I/O端口之間的數(shù)據(jù)傳送。在DMA?xí)r,它被置為浮空。 <
21、;/p><p> ?。?)WR/LOCK(輸出,低電平有效,三態(tài)): 信號(hào)有效,即為低電平時(shí),表示CPU正在執(zhí)行存儲(chǔ)器或I/O寫(xiě)操作,在寫(xiě)周期中,WR在T2、T2、Tw期間都有效。在DMA?xí)r,WR被置為浮空。</p><p> ?。?)INTA:可屏蔽中斷響應(yīng)信號(hào),輸出,低電平有效。 CPU通過(guò)信號(hào)對(duì)外設(shè)提出的可屏蔽中斷請(qǐng)求做出響應(yīng)。為低電平時(shí),表示CPU已經(jīng)響應(yīng)外設(shè)的中斷請(qǐng)求,即將執(zhí)行中斷服
22、務(wù)程序。 </p><p> ?。?)ALE:地址鎖存允許信號(hào),輸出,高電平有效。 CPU利用ALE信號(hào)可以把AD15 ~AD0地址/數(shù)據(jù)、A19/S6~A16/S3地址/狀態(tài)線(xiàn)上的地址信息鎖存在地址鎖存器中。 </p><p> ?。?)DT:數(shù)據(jù)發(fā)送/接收信號(hào),輸出,三態(tài)。 DT/信號(hào)用來(lái)控制數(shù)據(jù)傳送的方向。DT/為高電平時(shí),CPU發(fā)送數(shù)據(jù)到存儲(chǔ)器或I/O端口;DT/為低電平時(shí),CPU
23、接收來(lái)自存儲(chǔ)器或I/O端口的數(shù)據(jù)。 </p><p> (6)DEN:數(shù)據(jù)允許控制信號(hào),輸出,三態(tài),低電平有效。信號(hào)用作總線(xiàn)收發(fā)器的選通控制信號(hào)。當(dāng)為低電平時(shí),表明CPU進(jìn)行數(shù)據(jù)的讀/寫(xiě)操作。 </p><p> (7)HOLD:總線(xiàn)保持請(qǐng)求信號(hào),輸入,高電平有效。在DMA數(shù)據(jù)傳送方式中,由總線(xiàn)控制器8237A發(fā)出一個(gè)高電平有效的總線(xiàn)請(qǐng)求信號(hào),通過(guò)HOLD引腳輸入到CPU,請(qǐng)求CPU讓
24、出總線(xiàn)控制權(quán)。 </p><p> ?。?)HLDA:總線(xiàn)保持響應(yīng)信號(hào),輸出,高電平有效。HLDA是與HOLD配合使用的聯(lián)絡(luò)信號(hào)。在HLDA有效期間,HLDA引腳輸出一個(gè)高電平有效的響應(yīng)信號(hào),同時(shí)總線(xiàn)將處于浮空狀態(tài),CPU讓出對(duì)總線(xiàn)的控制權(quán),將其交付給申請(qǐng)使用總線(xiàn)的8237A控制器使用,總線(xiàn)使用完后,會(huì)使HOLD信號(hào)變?yōu)榈碗娖剑珻PU又重新獲得對(duì)總線(xiàn)的控制權(quán)。</p><p> (9)R
25、D:讀控制信號(hào),三態(tài),輸出。當(dāng)RD=0時(shí),表示CPU?qǐng)?zhí)行存儲(chǔ)器或I/O端口的讀操作。是對(duì)內(nèi)存單元還是對(duì)I/O端口讀取數(shù)據(jù),取決于M/IO信號(hào)。在執(zhí)行DMA操作時(shí),RD被浮空。</p><p> ?。?0)READY:“準(zhǔn)備好”信號(hào)線(xiàn),輸入。該引腳接受被尋址的內(nèi)存或I/O端口發(fā)給CPU的響應(yīng)信號(hào),高電平時(shí)表示內(nèi)存或I/O端口已準(zhǔn)備就緒,CPU可以進(jìn)行數(shù)據(jù)傳輸。CPU在T3狀態(tài)開(kāi)始對(duì)READY信號(hào)采樣。若檢測(cè)到REA
26、DY為低電平,表示內(nèi)存或 I/O端口尚未準(zhǔn)備就緒,則CPU在T3狀態(tài)之后自動(dòng)插入等待狀態(tài)Tw,直到READY信號(hào)變?yōu)楦唠娖?,?nèi)存或I/O端口已準(zhǔn)備就緒,CPU才可以進(jìn)行數(shù)據(jù)傳輸。</p><p> 2.4、74LS273鎖存器</p><p><b> D0~D7:出入;</b></p><p><b> Q0~Q7:輸出;&l
27、t;/b></p><p> 第一腳WR:主清除端,低電平觸發(fā),即當(dāng)為低電平時(shí),芯片被清除,輸出全為0(低電平);</p><p> CP(CLK):觸發(fā)端,上升沿觸發(fā),即當(dāng)CP從低到高電平時(shí),D0~D7的數(shù)據(jù)通過(guò)芯片,為0時(shí)將數(shù)據(jù)鎖存,D0~D7的數(shù)據(jù)不變。 </p><p> 3.鍵盤(pán)輸入輸出模塊:</p><p> 鍵盤(pán)是
28、常用信息輸入元件,由一個(gè)個(gè)按鈕組成。</p><p> 下圖是一個(gè)4*4鍵盤(pán)結(jié)構(gòu)圖,將4*4鍵盤(pán)的八個(gè)管腳接8255的PC口,因?yàn)檫M(jìn)行鍵盤(pán)掃描一般要求有一部分的I/O口工作方式是輸入,另一部分I/O是輸出,具體到4*4鍵盤(pán)則要求四個(gè)I/O口輸入,另外四個(gè)輸出。行信息連C口低四位,列信息連A口低四位。</p><p> 當(dāng)進(jìn)行掃描時(shí),掃描信號(hào)由列引腳輸入鍵盤(pán)。以0111、1011、110
29、1 和1110 的順序每次掃描不同的列,然后讀取列引腳的信號(hào)就可以判斷是哪個(gè)鍵被按下。識(shí)別鍵盤(pán)上哪個(gè)鍵被壓下的過(guò)程的掃描步驟:</p><p> 1.檢測(cè)是否所有鍵都都松開(kāi)了,若沒(méi)有則反復(fù)檢測(cè)。</p><p> 2.但所有鍵都松開(kāi)了,再檢測(cè)是否有鍵壓下,若無(wú)鍵一下則反復(fù)檢測(cè)。</p><p> 3.如有鍵壓下,要消除鍵抖動(dòng),確認(rèn)有鍵壓下。</p>
30、<p> 4.對(duì)壓下的鍵進(jìn)行編碼,將該鍵的行列信號(hào)轉(zhuǎn)換成16 進(jìn)制碼,由此確定哪個(gè)鍵被壓下了。如出現(xiàn)多鍵重按的情況,只有在其它鍵均釋放后,僅剩一個(gè)鍵閉合時(shí),才把此鍵當(dāng)作本次壓下的鍵。</p><p> 5.該鍵釋放后,再回到2</p><p><b> 4.總原理圖</b></p><p> 3軟件設(shè)計(jì)特點(diǎn)(主要任務(wù)):&
31、lt;/p><p> 首先設(shè)計(jì)程序用到的代碼段,數(shù)據(jù)段,堆棧段。根據(jù)題目要求,我設(shè)計(jì)10位內(nèi)存存儲(chǔ)運(yùn)算結(jié)果,減小了計(jì)算溢出的可能性。為程序設(shè)計(jì)初始化主程序,保證程序運(yùn)行時(shí)避免出錯(cuò)。同時(shí)在每個(gè)子程序操作時(shí)將一些重要寄存器ax,dx等壓入堆棧,防止不必要的錯(cuò)誤。對(duì)于加減法我通過(guò)進(jìn)位或借位標(biāo)志進(jìn)行控制。對(duì)于乘法,我先將內(nèi)存的數(shù)據(jù)轉(zhuǎn)換成16進(jìn)制(乘0ah),并且記錄乘數(shù)的大小,用于被乘數(shù)的累加運(yùn)算。我之所以沒(méi)在乘法中使用1
32、6進(jìn)制的乘法指令是為了防止有一個(gè)數(shù)超過(guò)65536的情況發(fā)生,減小錯(cuò)誤的幾率,并且為我的程序增加了適用范圍以及容錯(cuò)性。對(duì)于除法,直接循環(huán)利用被除數(shù)減去除數(shù)即可,利用借位標(biāo)志退出機(jī)制。</p><p> 在完成加減乘除基本功能的程序后,我又增添了后續(xù)的小數(shù)功能,將小數(shù)與這4個(gè)子程序巧妙的聯(lián)合起來(lái),其中除了除法的功能弱一點(diǎn),其他都相對(duì)完善。同時(shí)我也添加了連續(xù)運(yùn)算的功能,雖然并不能分清優(yōu)先級(jí)別,但是對(duì)于簡(jiǎn)單計(jì)算機(jī)的性能
33、已有很大的改善。附圖如下:</p><p><b> 程序</b></p><p> CLEAR MACRO </p><p> push dx</p><p> push cx</p><p> push bx</p><p> pus
34、h ax</p><p><b> mov ah,6</b></p><p><b> mov al,0</b></p><p> mov bh,01h</p><p><b> mov cx,0</b></p><p> mov
35、dx,184fh</p><p><b> int 10h</b></p><p><b> pop dx</b></p><p><b> pop cx</b></p><p><b> pop bx</b></p>
36、<p><b> pop ax</b></p><p><b> ENDM </b></p><p> data segment</p><p> shuf dw 0;當(dāng)前數(shù)標(biāo)志符</p><p> yunf dw 0;運(yùn)算符標(biāo)志符</p>
37、<p> fssf dw 0 ;小數(shù)點(diǎn)標(biāo)志符</p><p> finf dw 0;完成符標(biāo)識(shí)符</p><p> fsf0 dw 0 ;小數(shù)1個(gè)數(shù)標(biāo)志符</p><p> fsf1 dw 0 ;小數(shù)2個(gè)數(shù)標(biāo)志符</p><p><b> fsf dw 0</b></p>
38、<p> numb0f db 0;NUMB0清空標(biāo)志</p><p> numb1f db 0;NUMB1清空標(biāo)志</p><p> numb0 db 10 dup(0);第一個(gè)運(yùn)算數(shù)</p><p> numb1 db 10 dup(0);第二個(gè)運(yùn)算數(shù)</p><p> numb2 db 10 dup(0)
39、;第三個(gè)運(yùn)算數(shù)</p><p> numb3 db 10dup(0) ;小數(shù) </p><p> fkey db "error重新輸入...$"</p><p><b> data ends</b></p><p> stack segment stack</p><p
40、> db 100 dup(0)</p><p> stack ends</p><p> code segment</p><p> assume ds:data,,ss:stack,cs:code</p><p> start:mov ax, data</p><p> mov ds, ax<
41、/p><p> ;----------------------------------------------------------------------------------------</p><p><b> ;各變量初始清0</b></p><p> mov si,0;清空兩個(gè)運(yùn)算數(shù)</p><p>
42、<b> mov cx,10</b></p><p> mov numb0,0</p><p> mov numb1,0</p><p> ini:mov numb0[si],0</p><p> mov numb1[si],0</p><p> mov numb2[si],0<
43、/p><p><b> inc si</b></p><p><b> loop ini</b></p><p> mov shuf,0;當(dāng)前數(shù)置0,表示指向第一個(gè)數(shù)</p><p> mov yunf,0;運(yùn)算符置0,表示沒(méi)有運(yùn)算符</p><p> mov
44、finf,0;完成符置0,表示沒(méi)有完成</p><p> mov fssf,0 ;置小數(shù)點(diǎn)符0,表示沒(méi)有小數(shù)點(diǎn)</p><p> mov fsf0,0 ;置小數(shù)個(gè)數(shù)符0,表示沒(méi)有小數(shù)部分</p><p> mov fsf1,0</p><p><b> mov fsf,0</b><
45、/p><p> mov numb0f,1;第一個(gè)數(shù)清空標(biāo)志置1,表示第一個(gè)數(shù)被清空</p><p> mov numb1f,1;第二個(gè)數(shù)清空標(biāo)志置1,表示第二個(gè)數(shù)被清空</p><p> ;------------------------------------------------------------------------------------
46、-----</p><p> ;--------------------------------------------------------------------------------------- </p><p><b> ru: </b></p><p><b> mov ah,1 </b></p
47、><p><b> int 21h</b></p><p><b> push ax</b></p><p> cmp al,'.' ;跳轉(zhuǎn)小數(shù)部分</p><p><b> jz fskey</b></p><p> cmp al
48、,'+'</p><p> jz addkey;跳轉(zhuǎn)至加法鍵部分</p><p> cmp al,'-'</p><p> jz subkey;跳轉(zhuǎn)至減法鍵部分</p><p> cmp al,'*'</p><p> jz mulkey;跳轉(zhuǎn)至乘法鍵部分
49、</p><p> cmp al,'/'</p><p> jz divkey;跳轉(zhuǎn)至除法鍵部分</p><p> cmp al,'c'</p><p> jz clrkey;跳轉(zhuǎn)至清除鍵部分 </p><p> cmp al,'9'</p>
50、<p> jbe numkey;跳轉(zhuǎn)至數(shù)字鍵部分</p><p> jmp equkey</p><p> ;-------------------------------------------------------------------------------------</p><p><b> ;數(shù)字鍵部分</b>
51、;</p><p><b> numkey:</b></p><p> sub al,30h</p><p> save_numb1:cmp yunf,0</p><p> jz save_numb0;若沒(méi)有運(yùn)算符號(hào)則將輸入數(shù)存入NUMB0</p><p> mov shuf,1;當(dāng)
52、前符值1,指向第二個(gè)數(shù)</p><p><b> mov si,9</b></p><p> cmp numb1[si],0;若最高位為空,則標(biāo)志當(dāng)先數(shù)沒(méi)有存滿(mǎn)六位,繼續(xù)存入</p><p> jnz ru ;否則直接返回輸入</p><p> cmp numb1f,1;若數(shù)當(dāng)前被清
53、空過(guò),則直接將輸入數(shù)存入最低位</p><p><b> jz place1</b></p><p> ;參與運(yùn)算的小數(shù)的總數(shù)</p><p> mov cx,10;逐位前移</p><p><b> mov si,0</b></p><p> cmp fss
54、f,1</p><p><b> jz xsd1</b></p><p><b> adjust1:</b></p><p> xchg al,numb1[si]</p><p><b> inc si</b></p><p> loop ad
55、just1</p><p> mov numb1f,0;將NUMB1F置0,表示第二個(gè)數(shù)沒(méi)有清零</p><p><b> jmp ru </b></p><p> place1:mov numb1[0],al</p><p> mov numb1f,0</p><p><b&g
56、t; jmp ru</b></p><p> save_numb0:mov shuf,0</p><p> cmp finf,0;若完成符為1,表示完成過(guò)一次運(yùn)算,則清空NUMBO</p><p> jz save_next </p><p> mov si,1;清空NUMB0</p
57、><p><b> mov cx,9</b></p><p> mov numb0,0</p><p> save_ini:mov numb0[si],0</p><p><b> inc si</b></p><p> loop save_ini</p>
58、<p> mov numb0f,1</p><p> mov finf,0</p><p> save_next:mov si,9 ;</p><p> cmp numb0[si],0</p><p><b> jnz ru</b></p><p> cmp numb
59、0f,1</p><p><b> jz place0</b></p><p> mov cx,10 </p><p><b> mov si,0 </b></p><p> cmp fssf,1</p><p><b> jz xsd0</b>
60、;</p><p><b> adjust0:</b></p><p> xchg al,numb0[si]</p><p><b> inc si</b></p><p> loop adjust0</p><p> mov numb0f,0</p>
61、<p><b> jmp ru</b></p><p> place0:mov numb0f,0</p><p> mov numb0[0],al</p><p><b> jmp ru</b></p><p><b> xsd1:</b></p&g
62、t;<p> add fsf1,1</p><p> jmp adjust1</p><p><b> xsd0:</b></p><p> add fsf0,1</p><p> jmp adjust0</p><p><b> ;小數(shù)點(diǎn)部分</b>
63、;</p><p><b> fskey:</b></p><p> mov fssf,1</p><p><b> jmp ru</b></p><p><b> ;等號(hào)鍵部分</b></p><p><b> equkey:<
64、;/b></p><p><b> call calp</b></p><p> mov finf,1 ;按下等號(hào)則調(diào)用CALP運(yùn)算子程序,</p><p> mov yunf,0 ;運(yùn)算后清空運(yùn)算符</p><p><b> ;置完成符</b></p><p&
65、gt;<b> jmp ru</b></p><p> ;--------------------------------------------------------------------------------------</p><p><b> ;運(yùn)算符號(hào)鍵部分</b></p><p> addkey:
66、 pop ax</p><p> mov fssf,0</p><p> cmp yunf,0;若之前沒(méi)有過(guò)運(yùn)算符,則置運(yùn)算符</p><p> jz placef </p><p> call calp;若之前有過(guò)運(yùn)算符,則調(diào)用CALP進(jìn)行運(yùn)算</p><p> jmp placef;運(yùn)算結(jié)束
67、后置當(dāng)前運(yùn)算符</p><p> subkey:pop ax</p><p> mov fssf,0</p><p> cmp yunf,0</p><p><b> jz placef</b></p><p><b> call calp</b></p>
68、;<p> jmp placef</p><p> mulkey: pop ax</p><p> mov fssf,0</p><p> cmp yunf,0</p><p><b> jz placef</b></p><p><b> call calp&
69、lt;/b></p><p> jmp placef</p><p> divkey: pop ax </p><p> mov fssf,0</p><p> cmp yunf,0</p><p><b> jz placef</b></p><p>&l
70、t;b> call calp</b></p><p> jmp placef</p><p><b> placef:</b></p><p> cmp al,'+'</p><p><b> jz addf</b></p><p>
71、; cmp al,'-'</p><p><b> jz subf</b></p><p> cmp al,'*'</p><p><b> jz mulf</b></p><p> cmp al,'/'</p><p&g
72、t;<b> jz divf</b></p><p> cmp al,'c'</p><p><b> jz clrkey</b></p><p> addf:mov yunf,1</p><p> jmp ru;置運(yùn)算符完畢后返回輸入</p><
73、p> subf:mov yunf,2 </p><p><b> jmp ru</b></p><p> mulf:mov yunf,3</p><p><b> jmp ru</b></p><p> divf:mov yunf ,4</p><p><
74、;b> jmp ru</b></p><p> clrkey:clear</p><p><b> mov bh,0</b></p><p><b> mov dh,0</b></p><p><b> mov dl,0</b></p>
75、<p><b> mov ah,2</b></p><p><b> int 10h </b></p><p> jmp start;按下clear鍵后跳轉(zhuǎn)至開(kāi)頭,全部清零</p><p> ;----------------------------------------------------
76、-----------------------------------</p><p> ;運(yùn)算子程序CALP </p><p><b> calp proc</b></p><p> cmp yunf,0;若運(yùn)算符為0,則直接轉(zhuǎn)輸入</p><p>
77、; jz yunf_over;否則跳轉(zhuǎn)至結(jié)束處ret</p><p> cmp yunf,1;根據(jù)運(yùn)算符調(diào)用運(yùn)算子程序</p><p><b> jz addcal</b></p><p> cmp yunf,2</p><p><b> jz subcal</b></p>
78、<p> cmp yunf,3</p><p><b> jz mulcal</b></p><p> cmp yunf,4</p><p><b> jz divcal</b></p><p> addcal:call addp</p><p>
79、jmp yunf_over;調(diào)用相應(yīng)計(jì)算子程序</p><p> subcal:call subp</p><p> jmp yunf_over</p><p> mulcal:call mulp</p><p> jmp yunf_over</p><p> divcal:call divp</p&
80、gt;<p> yunf_over:ret</p><p><b> calp endp</b></p><p> ;-----------------------------------------------------------------------------------------</p><p> ;加法子
81、程序 (帶小數(shù))</p><p><b> addp proc</b></p><p><b> push ax</b></p><p><b> push dx</b></p><p><b> clc</b></p><
82、p> mov dx ,fsf0</p><p> mov bx,fsf1;清除進(jìn)位標(biāo)志</p><p><b> cmp dx,bx</b></p><p> jnz tiaozh</p><p><b> cmp dx,0</b></p><p>&l
83、t;b> jz huizh1</b></p><p> mov fsf,dx</p><p> huizh1: mov cx,10</p><p><b> mov si,0</b></p><p> addnext_bit:mov al,numb0[si]</p><p&
84、gt; adc al,numb1[si]</p><p><b> aaa</b></p><p> mov numb0[si],al</p><p><b> inc si</b></p><p> loop addnext_bit</p><p><b&g
85、t; jc start</b></p><p> mov numb1f,1 </p><p><b> jmp xs</b></p><p><b> addp endp</b></p><p> ;---------------------------------------
86、--------------------------------------------------</p><p> ;減法子程序 (帶小數(shù))</p><p><b> subp proc</b></p><p><b> push ax</b></p><p><b> pus
87、h dx</b></p><p> clc ;清除進(jìn)位標(biāo)志</p><p> mov dx ,fsf0</p><p> mov bx,fsf1</p><p><b> cmp dx,bx</b></p><p> jnz tiaozh</
88、p><p><b> cmp dx,0</b></p><p><b> jz huizh2</b></p><p> mov fsf,dx</p><p> huizh2: mov cx,10</p><p> mov si,0;清除借位標(biāo)志</p>
89、<p> subnext_bit:mov al,numb0[si]</p><p> sbb al,numb1[si]</p><p><b> aas</b></p><p> mov numb0[si],al</p><p><b> inc si</b></p&g
90、t;<p> loop subnext_bit</p><p><b> jc start </b></p><p> mov numb1f,1 </p><p><b> jmp xs</b></p><p> subp endp </p&
91、gt;<p> ;乘法子程序 (帶小數(shù))</p><p> mulp proc </p><p> ;把bcd碼轉(zhuǎn)化成16進(jìn)制數(shù),供循環(huán)使用 </p><p><b> push ax</b></p><p><b> push dx</b></p>&
92、lt;p> mov di,0 ;存次數(shù)的低位</p><p> mov bp,0 ;存次數(shù)的高位</p><p><b> mov ax,0</b></p><p><b> mov cx,10</b></p><p><b>
93、 mov si,0 </b></p><p> mov dx,fsf0</p><p> add dx,fsf1</p><p> mov fsf,dx</p><p> xunjian0: ;排除有一個(gè)數(shù)為0的情況</p><p> cmp numb0[si],0&l
94、t;/p><p><b> jz jj0</b></p><p><b> jnz xia</b></p><p> jj0: inc si</p><p> loop xunjian0</p><p><b> cmp si,10</b><
95、;/p><p><b> jz xs0</b></p><p><b> xia: </b></p><p><b> mov cx,10</b></p><p><b> mov si,0</b></p><p><b&
96、gt; xunjian1:</b></p><p> cmp numb1[si],0</p><p><b> jz jj1</b></p><p><b> jnz jx</b></p><p> jj1:inc si</p><p> loop x
97、unjian1</p><p><b> cmp si,10</b></p><p><b> jz xs1</b></p><p><b> jx: </b></p><p> mov al,numb1</p><p> add di,ax
98、</p><p><b> mov ax,0</b></p><p> mov al,numb1[1]</p><p><b> mov bx,10</b></p><p><b> mul bx</b></p><p><b> a
99、dd di,ax</b></p><p><b> mov ax,0</b></p><p> mov al,numb1[2]</p><p> mov bx,100</p><p><b> mul bx</b></p><p><b> a
100、dd di,ax</b></p><p><b> mov ax,0</b></p><p> mov al,numb1[3]</p><p> mov bx,1000</p><p><b> mul bx</b></p><p> add di,ax
101、 </p><p><b> mov ax,0</b></p><p> mov al,numb1[4]</p><p> mov bx,10000</p><p><b> mul bx</b></p><p><b> add di,ax</b&
102、gt;</p><p> adc bp,dx </p><p> mov bx,100 </p><p><b> mov ax,0</b></p><p> mov al,numb1[5]</p><p><b> mul bx</b></p>&l
103、t;p> mov bx,1000</p><p><b> mul bx</b></p><p><b> add di,ax</b></p><p> adc bp,dx ;現(xiàn)在次數(shù)存在bp和di中 </p><p> ;numb1個(gè)numb0相加</p&
104、gt;<p><b> ;先把零頭加了</b></p><p> mov cx,di ;低位零頭存在di中</p><p> cmp cx,1 </p><p> jz display ;若為1倍,則不加直接跳出</p><p> sub
105、 cx,1 ;加倍數(shù)減一次</p><p> push cx </p><p> ;將numb0的內(nèi)容復(fù)制到numb2中 </p><p><b> mov cx,10</b></p><p><b> mov si,0</b></p>
106、;<p> beifen:mov al,numb0[si]</p><p> mov numb2[si],al </p><p> inc si </p><p> loop beifen</p><p><b> pop cx</b></p>
107、<p><b> ;復(fù)制結(jié)束</b></p><p> ;下面進(jìn)行連加,另增加一段numb2的內(nèi)存是為了解決由于adc與aaa必須連用,且aaa只能對(duì)al進(jìn)行操作的問(wèn)題 </p><p><b> extra:</b></p><p><b> pu
108、sh cx </b></p><p><b> mov si,0</b></p><p><b> mov cx,10</b></p><p><b> clc</b></p><p> in_adc1:mov al,numb2[si]</p>
109、<p> adc al,numb0[si]</p><p><b> aaa</b></p><p> mov numb2[si],al</p><p><b> inc si</b></p><p> loop in_adc1</p><p> jc
110、 yichu ;溢出則跳出</p><p><b> pop cx</b></p><p> loop extra </p><p><b> ;高位部分</b></p><p> main:cmp bp,0</p><p> jz
111、outside</p><p> ;mov si,0 ;由于是10000h個(gè)數(shù)相加,即加0ffff次</p><p><b> ;mov cx,6</b></p><p><b> ;clc </b></p><p> ;in_adc2:mov al,numb
112、0[si]</p><p> ;adc al,al</p><p><b> ;aaa</b></p><p> ;mov numb0[si],al</p><p><b> ;inc si</b></p><p> ;loop in_adc2</p>
113、<p> ;jc begin ;溢出則跳出 </p><p> mov cx,0ffffh ;剩下的0ffffh遍</p><p> extra1:push cx</p><p><b> mov si,0</b></p><p><b>
114、; mov cx,10</b></p><p><b> clc </b></p><p> in_adc3:mov al,numb2[si]</p><p> adc al,numb0[si]</p><p><b> aaa</b></p><p>
115、 mov numb2[si],al</p><p><b> inc si</b></p><p> loop in_adc3</p><p> ;jc begin ;溢出則跳出</p><p><b> pop cx</b></p><
116、p> loop extra1</p><p><b> dec bp </b></p><p><b> jmp main</b></p><p><b> outside:</b></p><p><b> mov cx,10</b>&l
117、t;/p><p><b> mov si,0</b></p><p><b> fuzhi:</b></p><p> mov dl,numb2[si]</p><p> mov numb0[si],dl</p><p><b> inc si</b&g
118、t;</p><p> loop fuzhi</p><p> mov numb1f,1 </p><p><b> jmp xs</b></p><p><b> mulp endp</b></p><p> ;--------------------------
119、---------------------------------------------------------------</p><p> ;除法子程序 (帶小數(shù))</p><p> divp proc </p><p><b> push ax</b></p><p><b> push
120、 dx</b></p><p> mov si,0FFH;判斷除數(shù)是否為0</p><p><b> mov cx,10</b></p><p> mov dx,fsf0</p><p> cmp dx,fsf1</p><p> jnz tiaozh_0</p&g
121、t;<p> check_0:inc si</p><p><b> cmp si,10</b></p><p> jz start;若6位皆為0則溢出清零</p><p> cmp numb1[si],0</p><p> jz check_0</p><p>
122、mov si,0;清除除法結(jié)果</p><p><b> mov cx,10</b></p><p> clrres:mov numb2[si],0</p><p><b> inc si</b></p><p> loop clrres</p><p> d
123、ivsub:mov si,0</p><p><b> mov cx,10</b></p><p> clc;清除借位標(biāo)志</p><p><b> subnext:</b></p><p> mov al,numb0[si]</p><p> sbb al,
124、numb1[si] </p><p><b> aas</b></p><p> mov numb0[si],al</p><p><b> inc si</b></p><p> loop subnext</p><p&
125、gt; jc div_over</p><p> ;每減一次則結(jié)果加1</p><p><b> clc</b></p><p><b> mov si,0</b></p><p><b> mov cx,9</b></p><p>
126、 mov al,numb2[si]</p><p><b> adc al,1</b></p><p><b> aaa</b></p><p> mov numb2[si],al</p><p> divres:inc si</p><p> mov al,nu
127、mb2[si]</p><p><b> adc al,0</b></p><p><b> aaa</b></p><p> mov numb2[si],al</p><p> loop divres</p><p> jmp divsub</p>
128、<p><b> div_over:</b></p><p><b> mov cx,10</b></p><p><b> mov si,0</b></p><p><b> fuzhi1:</b></p><p> mov dl,n
129、umb2[si]</p><p> mov numb0[si],dl </p><p><b> inc si</b></p><p> loop fuzhi1 </p><p> mov numb1f,1 </p><p><b> jmp xs</b></
130、p><p><b> divp endp</b></p><p> xs: ;顯示判斷連續(xù)運(yùn)算</p><p><b> pop dx</b></p><p><b> pop ax</b></p><p&g
131、t; cmp al,'='</p><p> je display</p><p> mov dx,fsf</p><p> mov fsf0,dx ;為小數(shù)點(diǎn)個(gè)數(shù)寄存器清零</p><p> mov fsf1,0</p><p> mov fssf,0</p&
132、gt;<p><b> mov cx,10</b></p><p><b> mov si,0</b></p><p> inii:mov numb1[si],0</p><p><b> inc si</b></p><p><b> loo
133、p inii</b></p><p> cmp al,'+'</p><p><b> jz addf</b></p><p> cmp al,'-'</p><p><b> jz subf</b></p><p> c
134、mp al,'*'</p><p><b> jz mulf</b></p><p> cmp al,'/'</p><p><b> jz divf</b></p><p> cmp al,'c'</p><p>&l
135、t;b> jz clrkey</b></p><p> display: push ax</p><p><b> push dx </b></p><p><b> mov si,9</b></p><p><b> retrans:</b>
136、</p><p> cmp numb0[si],0</p><p> jz rechange0</p><p><b> jmp next</b></p><p> next: mov ax,0b800h</p><p><b> mov es,ax</b>&
137、lt;/p><p><b> mov si,9</b></p><p><b> mov di,28</b></p><p><b> mov cx,10</b></p><p><b> mov dh,2</b></p><p&g
138、t;<b> dec fsf </b></p><p> mov bx,fsf</p><p> a: cmp si,fsf ;顯示小數(shù)點(diǎn)</p><p><b> jz xsxs</b></p><p> mov dl,numb0[si]</p><
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 簡(jiǎn)單計(jì)算器課程設(shè)計(jì)報(bào)告
- 簡(jiǎn)單計(jì)算器課程設(shè)計(jì)報(bào)告
- 微機(jī)課程設(shè)計(jì)--計(jì)算器
- 微機(jī)課程設(shè)計(jì)--計(jì)算器
- 計(jì)算器java課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器
- 簡(jiǎn)單計(jì)算器課程設(shè)計(jì)
- c++簡(jiǎn)單計(jì)算器課程設(shè)計(jì)報(bào)告
- 微機(jī)課程設(shè)計(jì)--簡(jiǎn)易計(jì)算器
- c++課程設(shè)計(jì)報(bào)告--簡(jiǎn)單計(jì)算器
- 簡(jiǎn)單的計(jì)算器課程設(shè)計(jì)
- 課程設(shè)計(jì)---簡(jiǎn)單的計(jì)算器
- vb課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器
- 簡(jiǎn)單的計(jì)算器課程設(shè)計(jì)
- 課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器的設(shè)計(jì)
- 課程設(shè)計(jì)--簡(jiǎn)單的計(jì)算器設(shè)計(jì)
- 課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器的設(shè)計(jì)
- 微機(jī)原理簡(jiǎn)易計(jì)算器課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--簡(jiǎn)單計(jì)算器
- 課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告--簡(jiǎn)單的計(jì)算器設(shè)計(jì)
- c++課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器
評(píng)論
0/150
提交評(píng)論