

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計報告</b></p><p> ( 2013—2014年度第一學期)</p><p> 名 稱: 微機原理及應(yīng)用 </p><p> 題 目: 8255/273實現(xiàn)六位簡單計算器 </p><p> 院 系: 控計學院
2、 </p><p> 班 級: 創(chuàng)新自動化1101 </p><p> 學 號: </p><p> 學生姓名: </p><p> 日期:2014年1月3日</p>&l
3、t;p> 一、課程設(shè)計的目的與要求</p><p> 目的:在微機原理及應(yīng)用課程中分別學過了微機原理各個基本組成模塊的原理和編程技術(shù)的基礎(chǔ)上,綜合應(yīng)用各部分知識,在實驗室現(xiàn)有設(shè)備的情況下,設(shè)計一個具有一定功能的應(yīng)用系統(tǒng),達到對各部分知識加深理解、融會貫通的目的,并進一步鍛煉學生的動手能力和綜合分析能力,同時培養(yǎng)學生的團隊精神。要求每個同學獨立完成自己分擔的部分,整體方案可以組內(nèi)同學討論確定。 <
4、/p><p> 要求:能完成六位十進制數(shù)的加、減、乘、除運算以及平方運算,操作過程與普通計算器相同,即先輸入一個操作數(shù),然后按下“+”“—”“×”“÷”鍵,再輸入下一個操作數(shù),按等號鍵開始運算并顯示結(jié)果,若結(jié)果超過六位,則顯示“E”。</p><p> 要求盡量與真實計算器相似。</p><p> 任務(wù):我負責的是軟件整體構(gòu)建,和對加法,減法,
5、乘法,除法,平方,清零以及帶小數(shù)運算程序的編寫和調(diào)試。</p><p><b> 二、設(shè)計正文</b></p><p> 將可編程外圍接口芯片8255A 與鍵盤和七段LED 連接,通過對8255A 編程及對鍵盤的操作實現(xiàn)計算功能。鍵盤碼包括數(shù)字0~9、運算符號“+” “-” “*” “/”“=”和清零“CL”鍵。</p><p> 首先利
6、用程序不斷掃描件鍵盤是否有輸入,如果沒有就一直掃描,如果有就停止掃描,完成輸入。通過鍵盤依次輸入第一個運算數(shù)字、運算符號、第二個運算數(shù)字、“=”,在七段LED 燈上顯示運算結(jié)果,期間數(shù)字輸入有誤可按“C”鍵之后重新輸入。</p><p><b> 三、課程設(shè)計總結(jié)</b></p><p> 本次課程設(shè)計選擇了簡易計算器設(shè)計的題目,不僅使我加深了對接口程序設(shè)計的認識
7、,對可編程并行I/O接口芯片8255的工作原理也有了進一步的了解,更重要的是培養(yǎng)了我們發(fā)現(xiàn)問題,解決問題的能力。</p><p> 根據(jù)微機原理課程所學相關(guān)知識及實驗教程相關(guān)內(nèi)容,在基于proteus平臺,使用匯編語言,以8086為核心的情況下,配合可編程并行接口器件8255A,LED數(shù)碼管等器件實現(xiàn)可進行簡單六位數(shù)加減乘除法及清零擴展功能的十進制計算器。在課程設(shè)計實踐中,我們不僅鍛煉了實際動手能力,培養(yǎng)了團隊
8、精神和嚴肅認真的工作態(tài)度,更增強了自己在實際的工程設(shè)計中查閱資料,撰寫設(shè)計報告表達設(shè)計思想和結(jié)果的能力。</p><p> 在編程過程中,需要很多細節(jié)的注意和推敲。本來很簡單的想法,到了實際的編程過程中,就發(fā)現(xiàn)并不是那么簡單。如減法的每次循環(huán)過程中的借位,時時刻刻都得注意,稍不留神就可能出錯。編程不僅使我們對微機有了更深的理解,也教會了我們不要眼高手低,得腳踏實地,幫我們養(yǎng)成了嚴謹?shù)乃枷搿_€有,本次課設(shè)中有各種
9、新的知識不在課本中,就需要我們?nèi)ゲ殚嗁Y料,上網(wǎng)搜索之類。在這個過程中,不僅僅是反映在這幾頁報告中的知識,更多的也有如protues的作圖,仿真過程中的各類問題的解決方法;以及鍵盤的各類知識。有些東西,我們天天接觸,但要是讓我們親自做一下的時候,可能就會暴露出我們更多的問題。很感謝能有這樣的機會去用已有的知識做一些我們力所能及的事。</p><p><b> 四、參考文獻</b></p
10、><p> [1]《清華大學TPC-2003A實驗指導書》,2006版</p><p> [2] 李繼燦,《新編16/32位微型計算機原理及應(yīng)用》,清華大學出版社,第四版,2008年</p><p> [3] 楊國田,高明明 《微機原理實驗指導書》 校內(nèi)待出版,第一版,2002年3月</p><p><b> 附錄</b&
11、gt;</p><p><b> 軟件設(shè)計流程圖</b></p><p><b> 2.硬件設(shè)計概要:</b></p><p> 2.1. LED 顯示的功能及實現(xiàn)</p><p> 七段 LED 顯示器由七個發(fā)光段構(gòu)成,每段均是一個LED 二極管。這七個發(fā)光段分別稱為a,b,c,d,e,f
12、,g,通過控制不同段的點亮和熄滅,以顯示所要得到的數(shù)字。七段LED 的輸出功能也是通過8255的并行輸出實現(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 引腳功能說明:</p><p> D0~D7:數(shù)據(jù)線,三態(tài)雙向數(shù)8位緩沖器,8255 與CPU 數(shù)據(jù)傳送的通道,當CPU 執(zhí)行輸入輸出指令時,通過它實現(xiàn)8 位數(shù)據(jù)的讀/寫操作,控制字和狀態(tài)信息也通過數(shù)據(jù)總線傳送。</p><p> A0~A1:地址線,用于選擇端口,即用其來選擇A口、B口、C口或寄存器控制口。
14、</p><p> RD(低電平有效):讀信號線,當這個輸入引腳為低電平時,允許8255 通過數(shù)據(jù)總線向CPU 發(fā)送數(shù)據(jù)或狀態(tài)信息,即CPU 從8255 讀取信息或數(shù)據(jù)。</p><p> WR(低電平有效):寫入信號,當這個輸入引腳為低電平時,允許CPU 將數(shù)據(jù)或控制字寫8255。</p><p> CS(低電平有效):片選信號線,當這個輸入引腳為低電平時,
15、表示芯片被選中,允許8255 與CPU 進行通訊。</p><p> RESET(高電平有效):復位輸入線,當該輸入端外于高電平時,所有內(nèi)部寄存器(包括控制寄存器)均被清除,所有I/O 口均被置成輸入方式。</p><p> PA0~PA7:端口A 輸入輸出線,8位數(shù)據(jù)輸入鎖存器和8位數(shù)據(jù)輸出鎖存器/緩沖器。</p><p> PB0~PB7:端口B 輸入輸出
16、線,8位數(shù)據(jù)輸入緩沖器和8位數(shù)據(jù)輸出鎖存器/緩沖器</p><p> PC0~PC7:端口C 輸入輸出線,端口B 輸入輸出線,8位數(shù)據(jù)輸入緩沖器和8位數(shù)據(jù)輸出鎖存器/緩沖器</p><p> 實際使用時,可以把A口、B口、C口分成兩個控制組,即A組和B組。A組控制電路由端口A和端口C的高4位(PC4~PC7)組成,B組控制電路由端口B和端口才的低4位(PC0~PC3)組成。</p
17、><p> 2.2.2.8255 的讀寫控制:</p><p> 8255 的讀/寫控制邏輯電路接受CPU 發(fā)來的控制口號RD、WR、RESET 和地址信號A1~A0。然后根據(jù)命令端口,控制信號的要求,將端口的數(shù)據(jù)讀出選信CPU 或者將CPU送來的數(shù)據(jù)寫入端口,各端口的工作狀態(tài)。通過用輸出指令對8255A 的控制字寄存器編程,寫入設(shè)定工作方式的控制字,可以讓3個數(shù)據(jù)口以不同的方式工作,端口
18、A 可工作于3 種方式的任一種,端口B 只能工作于方式0 和方式1,端口C 除了用于輸入輸出端口外,還能配合A 口和B 口工作,為這兩個端口的輸入輸出操作提供聯(lián)系信號。</p><p> 2.2.3.數(shù)據(jù)總線緩沖器</p><p> 它是一個雙向三態(tài)的8位數(shù)據(jù)緩沖器,8255A正是通過它與系統(tǒng)數(shù)據(jù)總線相連,用于輸入/輸出數(shù)據(jù)以及傳送由CPU發(fā)給8255A的控制字</p>
19、<p> 2.2.4.定義工作方式控制字</p><p> 工作方式0:8255A中各端口的基本輸入/輸出方式。</p><p> 2.3 微處理器8086芯片</p><p> 當引腳接高電平時,CPU工作于最小方式(單處理器系統(tǒng)方式,適合于較小規(guī)模的應(yīng)用)。此時,引腳功能如下: </p><p> (1)AD15~AD
20、0:分時復用的存儲器或端口的地址和數(shù)據(jù)總線。傳送地址時為單向的三態(tài)輸出,而傳送數(shù)據(jù)時為雙向三態(tài)輸入/輸出。</p><p> ?。?)IO/M存儲器/輸入、輸出控制信號(輸出、三態(tài)):它用于區(qū)分CPU當前是訪問存儲器還是訪問輸入/輸出端口。高電表示訪問存儲器,說明當前要進行CPU與存儲器之間的數(shù)據(jù)傳送。低電平表示訪問輸入/輸出設(shè)備。表示當前要進行CPU與I/O端口之間的數(shù)據(jù)傳送。在DMA時,它被置為浮空。 <
21、;/p><p> ?。?)WR/LOCK(輸出,低電平有效,三態(tài)): 信號有效,即為低電平時,表示CPU正在執(zhí)行存儲器或I/O寫操作,在寫周期中,WR在T2、T2、Tw期間都有效。在DMA時,WR被置為浮空。</p><p> ?。?)INTA:可屏蔽中斷響應(yīng)信號,輸出,低電平有效。 CPU通過信號對外設(shè)提出的可屏蔽中斷請求做出響應(yīng)。為低電平時,表示CPU已經(jīng)響應(yīng)外設(shè)的中斷請求,即將執(zhí)行中斷服
22、務(wù)程序。 </p><p> (5)ALE:地址鎖存允許信號,輸出,高電平有效。 CPU利用ALE信號可以把AD15 ~AD0地址/數(shù)據(jù)、A19/S6~A16/S3地址/狀態(tài)線上的地址信息鎖存在地址鎖存器中。 </p><p> ?。?)DT:數(shù)據(jù)發(fā)送/接收信號,輸出,三態(tài)。 DT/信號用來控制數(shù)據(jù)傳送的方向。DT/為高電平時,CPU發(fā)送數(shù)據(jù)到存儲器或I/O端口;DT/為低電平時,CPU
23、接收來自存儲器或I/O端口的數(shù)據(jù)。 </p><p> ?。?)DEN:數(shù)據(jù)允許控制信號,輸出,三態(tài),低電平有效。信號用作總線收發(fā)器的選通控制信號。當為低電平時,表明CPU進行數(shù)據(jù)的讀/寫操作。 </p><p> ?。?)HOLD:總線保持請求信號,輸入,高電平有效。在DMA數(shù)據(jù)傳送方式中,由總線控制器8237A發(fā)出一個高電平有效的總線請求信號,通過HOLD引腳輸入到CPU,請求CPU讓
24、出總線控制權(quán)。 </p><p> ?。?)HLDA:總線保持響應(yīng)信號,輸出,高電平有效。HLDA是與HOLD配合使用的聯(lián)絡(luò)信號。在HLDA有效期間,HLDA引腳輸出一個高電平有效的響應(yīng)信號,同時總線將處于浮空狀態(tài),CPU讓出對總線的控制權(quán),將其交付給申請使用總線的8237A控制器使用,總線使用完后,會使HOLD信號變?yōu)榈碗娖?,CPU又重新獲得對總線的控制權(quán)。</p><p> ?。?)R
25、D:讀控制信號,三態(tài),輸出。當RD=0時,表示CPU執(zhí)行存儲器或I/O端口的讀操作。是對內(nèi)存單元還是對I/O端口讀取數(shù)據(jù),取決于M/IO信號。在執(zhí)行DMA操作時,RD被浮空。</p><p> ?。?0)READY:“準備好”信號線,輸入。該引腳接受被尋址的內(nèi)存或I/O端口發(fā)給CPU的響應(yīng)信號,高電平時表示內(nèi)存或I/O端口已準備就緒,CPU可以進行數(shù)據(jù)傳輸。CPU在T3狀態(tài)開始對READY信號采樣。若檢測到REA
26、DY為低電平,表示內(nèi)存或 I/O端口尚未準備就緒,則CPU在T3狀態(tài)之后自動插入等待狀態(tài)Tw,直到READY信號變?yōu)楦唠娖?,?nèi)存或I/O端口已準備就緒,CPU才可以進行數(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ā),即當為低電平時,芯片被清除,輸出全為0(低電平);</p><p> CP(CLK):觸發(fā)端,上升沿觸發(fā),即當CP從低到高電平時,D0~D7的數(shù)據(jù)通過芯片,為0時將數(shù)據(jù)鎖存,D0~D7的數(shù)據(jù)不變。 </p><p> 3.鍵盤輸入輸出模塊:</p><p> 鍵盤是
28、常用信息輸入元件,由一個個按鈕組成。</p><p> 下圖是一個4*4鍵盤結(jié)構(gòu)圖,將4*4鍵盤的八個管腳接8255的PC口,因為進行鍵盤掃描一般要求有一部分的I/O口工作方式是輸入,另一部分I/O是輸出,具體到4*4鍵盤則要求四個I/O口輸入,另外四個輸出。行信息連C口低四位,列信息連A口低四位。</p><p> 當進行掃描時,掃描信號由列引腳輸入鍵盤。以0111、1011、110
29、1 和1110 的順序每次掃描不同的列,然后讀取列引腳的信號就可以判斷是哪個鍵被按下。識別鍵盤上哪個鍵被壓下的過程的掃描步驟:</p><p> 1.檢測是否所有鍵都都松開了,若沒有則反復檢測。</p><p> 2.但所有鍵都松開了,再檢測是否有鍵壓下,若無鍵一下則反復檢測。</p><p> 3.如有鍵壓下,要消除鍵抖動,確認有鍵壓下。</p>
30、<p> 4.對壓下的鍵進行編碼,將該鍵的行列信號轉(zhuǎn)換成16 進制碼,由此確定哪個鍵被壓下了。如出現(xiàn)多鍵重按的情況,只有在其它鍵均釋放后,僅剩一個鍵閉合時,才把此鍵當作本次壓下的鍵。</p><p> 5.該鍵釋放后,再回到2</p><p><b> 4.總原理圖</b></p><p> 3軟件設(shè)計特點(主要任務(wù)):&
31、lt;/p><p> 首先設(shè)計程序用到的代碼段,數(shù)據(jù)段,堆棧段。根據(jù)題目要求,我設(shè)計10位內(nèi)存存儲運算結(jié)果,減小了計算溢出的可能性。為程序設(shè)計初始化主程序,保證程序運行時避免出錯。同時在每個子程序操作時將一些重要寄存器ax,dx等壓入堆棧,防止不必要的錯誤。對于加減法我通過進位或借位標志進行控制。對于乘法,我先將內(nèi)存的數(shù)據(jù)轉(zhuǎn)換成16進制(乘0ah),并且記錄乘數(shù)的大小,用于被乘數(shù)的累加運算。我之所以沒在乘法中使用1
32、6進制的乘法指令是為了防止有一個數(shù)超過65536的情況發(fā)生,減小錯誤的幾率,并且為我的程序增加了適用范圍以及容錯性。對于除法,直接循環(huán)利用被除數(shù)減去除數(shù)即可,利用借位標志退出機制。</p><p> 在完成加減乘除基本功能的程序后,我又增添了后續(xù)的小數(shù)功能,將小數(shù)與這4個子程序巧妙的聯(lián)合起來,其中除了除法的功能弱一點,其他都相對完善。同時我也添加了連續(xù)運算的功能,雖然并不能分清優(yōu)先級別,但是對于簡單計算機的性能
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;當前數(shù)標志符</p><p> yunf dw 0;運算符標志符</p>
37、<p> fssf dw 0 ;小數(shù)點標志符</p><p> finf dw 0;完成符標識符</p><p> fsf0 dw 0 ;小數(shù)1個數(shù)標志符</p><p> fsf1 dw 0 ;小數(shù)2個數(shù)標志符</p><p><b> fsf dw 0</b></p>
38、<p> numb0f db 0;NUMB0清空標志</p><p> numb1f db 0;NUMB1清空標志</p><p> numb0 db 10 dup(0);第一個運算數(shù)</p><p> numb1 db 10 dup(0);第二個運算數(shù)</p><p> numb2 db 10 dup(0)
39、;第三個運算數(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;清空兩個運算數(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;當前數(shù)置0,表示指向第一個數(shù)</p><p> mov yunf,0;運算符置0,表示沒有運算符</p><p> mov
44、finf,0;完成符置0,表示沒有完成</p><p> mov fssf,0 ;置小數(shù)點符0,表示沒有小數(shù)點</p><p> mov fsf0,0 ;置小數(shù)個數(shù)符0,表示沒有小數(shù)部分</p><p> mov fsf1,0</p><p><b> mov fsf,0</b><
45、/p><p> mov numb0f,1;第一個數(shù)清空標志置1,表示第一個數(shù)被清空</p><p> mov numb1f,1;第二個數(shù)清空標志置1,表示第二個數(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;若沒有運算符號則將輸入數(shù)存入NUMB0</p><p> mov shuf,1;當
52、前符值1,指向第二個數(shù)</p><p><b> mov si,9</b></p><p> cmp numb1[si],0;若最高位為空,則標志當先數(shù)沒有存滿六位,繼續(xù)存入</p><p> jnz ru ;否則直接返回輸入</p><p> cmp numb1f,1;若數(shù)當前被清
53、空過,則直接將輸入數(shù)存入最低位</p><p><b> jz place1</b></p><p> ;參與運算的小數(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,表示第二個數(shù)沒有清零</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,表示完成過一次運算,則清空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ù)點部分</b>
63、;</p><p><b> fskey:</b></p><p> mov fssf,1</p><p><b> jmp ru</b></p><p><b> ;等號鍵部分</b></p><p><b> equkey:<
64、;/b></p><p><b> call calp</b></p><p> mov finf,1 ;按下等號則調(diào)用CALP運算子程序,</p><p> mov yunf,0 ;運算后清空運算符</p><p><b> ;置完成符</b></p><p&
65、gt;<b> jmp ru</b></p><p> ;--------------------------------------------------------------------------------------</p><p><b> ;運算符號鍵部分</b></p><p> addkey:
66、 pop ax</p><p> mov fssf,0</p><p> cmp yunf,0;若之前沒有過運算符,則置運算符</p><p> jz placef </p><p> call calp;若之前有過運算符,則調(diào)用CALP進行運算</p><p> jmp placef;運算結(jié)束
67、后置當前運算符</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;置運算符完畢后返回輸入</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)至開頭,全部清零</p><p> ;----------------------------------------------------
76、-----------------------------------</p><p> ;運算子程序CALP </p><p><b> calp proc</b></p><p> cmp yunf,0;若運算符為0,則直接轉(zhuǎn)輸入</p><p>
77、; jz yunf_over;否則跳轉(zhuǎn)至結(jié)束處ret</p><p> cmp yunf,1;根據(jù)運算符調(diào)用運算子程序</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)計算子程序</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;清除進位標志</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 ;清除進位標志</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;清除借位標志</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進制數(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: ;排除有一個數(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個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)容復制到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> ;復制結(jié)束</b></p><p> ;下面進行連加,另增加一段numb2的內(nèi)存是為了解決由于adc與aaa必須連用,且aaa只能對al進行操作的問題 </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個數(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;清除借位標志</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ù)運算</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ù)點個數(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ù)點</p><p><b> jz xsxs</b></p><p> mov dl,numb0[si]</p><
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 簡單計算器課程設(shè)計報告
- 簡單計算器課程設(shè)計報告
- 微機課程設(shè)計--計算器
- 微機課程設(shè)計--計算器
- 計算器java課程設(shè)計--簡單計算器
- 簡單計算器課程設(shè)計
- c++簡單計算器課程設(shè)計報告
- 微機課程設(shè)計--簡易計算器
- c++課程設(shè)計報告--簡單計算器
- 簡單的計算器課程設(shè)計
- 課程設(shè)計---簡單的計算器
- vb課程設(shè)計--簡單計算器
- 簡單的計算器課程設(shè)計
- 課程設(shè)計--簡單計算器的設(shè)計
- 課程設(shè)計--簡單的計算器設(shè)計
- 課程設(shè)計--簡單計算器的設(shè)計
- 微機原理簡易計算器課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--簡單計算器
- 課程設(shè)計實驗報告--簡單的計算器設(shè)計
- c++課程設(shè)計--簡單計算器
評論
0/150
提交評論