版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 課 程 設(shè) 計</p><p> 學(xué) 號</p><p><b> 課程設(shè)計任務(wù)書</b></p><p> 學(xué)生姓名: 專業(yè)班級: 自動化100... </p><p> 指導(dǎo)教師: 工作單位: 自動化學(xué)院 <
2、/p><p> 題 目:統(tǒng)計打字練習(xí)對錯率的程序設(shè)計 </p><p> 初始條件:帶有編輯器、匯編程序、連接程序和調(diào)試程序的電腦一臺。</p><p> 要求完成的主要任務(wù): </p><p> (包括課程設(shè)計工作量及其技術(shù)要求,以及說明書撰寫等具體要求)</p><p> 采用匯
3、編語言設(shè)計一個統(tǒng)計打字練習(xí)對錯率的程序。在緩沖區(qū)中預(yù)放了一些字母,運行時,按照屏幕上顯示的字母輸入練習(xí),每輸入完一行按回車鍵后,顯示練習(xí)輸入的對錯率。按Q退出程序。</p><p><b> 設(shè)計任務(wù)及要求分析</b></p><p><b> 方案比較及認(rèn)證說明</b></p><p><b> 系統(tǒng)原理
4、闡述</b></p><p> 軟件設(shè)計課題需要說明:軟件思想,流程圖,源程序及程序注釋</p><p><b> 調(diào)試記錄及結(jié)果分析</b></p><p><b> 總結(jié)</b></p><p><b> 參考資料</b></p><
5、p> 附錄:芯片資料或程序清單,軟件演示屏幕拷貝圖或硬件實物圖</p><p><b> 時間安排:</b></p><p> 12月31日~1月2日: 收集資料,方案選擇</p><p> 1月3日~1月8日: 整體流程,程序細(xì)節(jié)</p><p> 1月9日~1月10日: 調(diào)試程序,報告撰寫&l
6、t;/p><p> 1月11日: 交設(shè)計報告,程序演示,答辯</p><p> 指導(dǎo)教師簽名: 年 月 日</p><p> 系主任(或責(zé)任教師)簽名: 年 月 日</p><p><b> 摘 要&l
7、t;/b></p><p> 隨著時代的進(jìn)步,打字是現(xiàn)代生活中每個人都需要做的事了,無論是娛樂還是工作。而打字的速度和正確率也很重要。用匯編語言編寫一個練習(xí)打字的小軟件,既有趣有能學(xué)以致用,增強動手創(chuàng)新能力。</p><p> 匯編語言是面向機器的程序設(shè)計語言。在匯編語言中,用助記符代替機器指令和操作碼,用地址符號或標(biāo)號代替指令或操作數(shù)的地址,如此就增強了程序的可讀性和編寫難度,
8、像這樣的符號化的程序設(shè)計語言就是匯編語言,因此亦稱為符號語言。匯編語言是直接面向處理器的程序設(shè)計語言,處理器在指令的控制下工作,處理器可以識別的每一條指令稱為機器指令?;旧?,匯編語言列每一條指令都對應(yīng)著處理器的一條機器指令。匯編語言包括兩個部分:語法部分和編譯器。語法部分提供與機器指令相對于的助記符,方便指令的書寫和閱讀。匯編語言設(shè)計的程序直接簡潔,目標(biāo)代碼小,占用內(nèi)存少,執(zhí)行速度快,但缺乏可移植性,容易產(chǎn)生bug,難于調(diào)試,開發(fā)效率
9、低。</p><p> 微機原理及接口技術(shù)是一門實踐性和工程性很強的專業(yè)技術(shù)課,因此不僅要重視理論教學(xué)更應(yīng)注意實踐技能的培養(yǎng)和訓(xùn)練。課程設(shè)計是本課程的重要組成部分,通過課程設(shè)計,使學(xué)生鞏固、加深和拓寬學(xué)習(xí)內(nèi)容的理解,培養(yǎng)分析、設(shè)計和調(diào)試8086微機系統(tǒng)的能力。</p><p> 關(guān)鍵字:匯編語言 指令 操作數(shù)</p><p><b> 目 錄&l
10、t;/b></p><p> 1.設(shè)計任務(wù)及要求1</p><p> 1.1《微機原理與接口技術(shù)》課程設(shè)計目的1</p><p><b> 1.2設(shè)計任務(wù)1</b></p><p><b> 1.3設(shè)計要求1</b></p><p> 2.方案比較及論
11、證2</p><p><b> 2.1方案比較2</b></p><p><b> 2.2方案論述2</b></p><p> 3.軟件設(shè)計說明3</p><p><b> 3.1軟件思想3</b></p><p> 3.2程序流程圖
12、5</p><p><b> 3.3代碼設(shè)計7</b></p><p> 4. 程序的調(diào)試與運行10</p><p> 4.1調(diào)試環(huán)境簡介10</p><p> 4.2 調(diào)試過程及結(jié)果分析10</p><p> 1. 程序調(diào)試過程10</p><p>
13、 5.課程設(shè)計收獲及心得體會13</p><p><b> 附錄一15</b></p><p> 統(tǒng)計打字練習(xí)對錯率的程序設(shè)計</p><p><b> 1.設(shè)計任務(wù)及要求</b></p><p> 1.1《微機原理與接口技術(shù)》課程設(shè)計目的</p><p>
14、 對典型的微機應(yīng)用系統(tǒng)進(jìn)行設(shè)計,要求根據(jù)具體的課題題目畫出系統(tǒng)結(jié)構(gòu)框圖、系統(tǒng)接線圖;能用所學(xué)習(xí)的匯編語言進(jìn)行典型的程序設(shè)計并上機進(jìn)行調(diào)試。并能根據(jù)要求寫出設(shè)計課程設(shè)計報告,報告要求文字整潔、語言通順、制圖規(guī)范、程序完整正確。</p><p><b> 1.2設(shè)計任務(wù)</b></p><p> 設(shè)計一個統(tǒng)計打字練習(xí)對錯率的程序。在緩沖區(qū)中預(yù)放了一些字母,運行時,按照
15、屏幕上顯示的字母輸入練習(xí),每輸入完一行按回車鍵后,顯示練習(xí)輸入的對錯率。按Q退出程序。</p><p><b> 1.3設(shè)計要求</b></p><p> 1.設(shè)計要求:(1)設(shè)計一個在鍵盤上練習(xí)打字并能統(tǒng)計正確率的程序。</p><p> ?。?)熟悉和掌握有關(guān)鍵盤和時間的中斷及字符顯示計數(shù)。</p><p>
16、(3)編制鍵盤中斷和時間中斷處理程序,并保存原中斷向量。程序運行時,使用自編的中斷向量處理程序。程序退出時,恢復(fù)中斷向量。</p><p> 2.設(shè)計功能:(1)按照顯示的字母輸入練習(xí),每輸入完一行按回車鍵后,可顯示出練習(xí)輸入的時間及正確率,打字練習(xí)過程中輸入的字符與打字練習(xí)的內(nèi)容不符時會產(chǎn)生警報,打字練習(xí)可以一直進(jìn)行下去直至練習(xí)者停止</p><p> ?。?)能用自編的中斷向量處理程
17、序處理中斷。</p><p><b> 2.方案比較及論證</b></p><p><b> 2.1方案比較</b></p><p> 根據(jù)打字計時練習(xí)的設(shè)計要求可知,我們可以依據(jù)緩沖區(qū)中字符系列的產(chǎn)生這一要求的實現(xiàn)有兩種設(shè)計方案:方案一是緩沖區(qū)中的字母是預(yù)先設(shè)定好的,后面所進(jìn)行的打字練習(xí)是依照預(yù)先設(shè)定好的字符系列進(jìn)
18、行;方案二是緩沖區(qū)中的字母是隨機生成的,每一次打字練習(xí)的字符系列都是隨機產(chǎn)生的。其他要求的實現(xiàn)都是一樣的。</p><p> 方案一:緩沖區(qū)中的字符系列是預(yù)先設(shè)定好的。這種設(shè)計方案要求在內(nèi)存中預(yù)先開辟一段存儲空間存放將要進(jìn)行打字練習(xí)的字符系列,在后面進(jìn)行打字練習(xí)的時候再將字符系列取出進(jìn)行操作。這種設(shè)計方案占用的內(nèi)存較多并且需要先將字符系列取出后再進(jìn)行操作,程序?qū)懫饋砗荛L,指令太多,同時設(shè)計的方案對于使用者來說太
19、過單一,想嘗試不同字符系列的打字練習(xí)時還要另行修改程序,適用性差。</p><p> 方案二:緩沖區(qū)中的字符系列是系統(tǒng)自動隨機生成的。這種設(shè)計方案要求系統(tǒng)隨機生成字符系列,不需要預(yù)先分配內(nèi)存單元,在開始新一輪的打字練習(xí)時就自動隨機生成字符系列。這種設(shè)計方案運用到的指令少,占用的內(nèi)存少,設(shè)計的程序適用性好,不需要修改程序就可以嘗試不同的字符系列的打字練習(xí)。</p><p><b>
20、; 2.2方案論述</b></p><p> 在設(shè)計打字練習(xí)時,根據(jù)打字練習(xí)的過程來設(shè)計打字計時練習(xí)的程序,首先在打字練習(xí)的界面上要有輸出的提示信息提示對打字練習(xí)要進(jìn)行的操作,其次是打字練習(xí)內(nèi)容字母系列的生成,然后才開始進(jìn)行打字練習(xí),打字計時練習(xí)的過程在系統(tǒng)內(nèi)部是一個不斷循環(huán)的過程,在系統(tǒng)內(nèi)部時鐘每次嘀嗒計數(shù)循環(huán)一次,首先需要判斷是否從鍵盤鍵入字符,這里面有一個循環(huán)檢測的過程直至有字符鍵入系統(tǒng),其
21、次需要知道鍵入的字符是否是特殊字符,判斷打字練習(xí)進(jìn)行哪步操作。這是一個大的分支程序,需要有很多的跳轉(zhuǎn)并且需要不斷的調(diào)用子程序?qū)崿F(xiàn)不同的功能。最后在一輪打字練習(xí)結(jié)束時需要有一個分支的選擇,是再次進(jìn)行打字練習(xí)的設(shè)置還是退出打字練習(xí)的程序。</p><p><b> 3.軟件設(shè)計說明</b></p><p><b> 3.1軟件思想</b><
22、/p><p> 由打字計時練習(xí)的設(shè)計要求可知設(shè)計主要分為以下幾個步驟:打字練習(xí)過程中提示信息的輸出,隨機字母系列的生成,打字練習(xí)過程中鍵入字符的正確與否,打字練習(xí)過程的正確率的顯示,字母系列是否鍵入完畢。</p><p> 運用匯編語言設(shè)計的程序分為主程序和子程序。主程序主要用于隨機字母系列的生成,打字計時練習(xí)過程鍵入字符正確與否的判斷,字母系列是否輸入完畢,打字計時練習(xí)的新一輪的開始。子
23、程序分別實現(xiàn)不同的功能,分別如下:</p><p> 子程序SHUCHU_TISHI中,實現(xiàn)的是打字練習(xí)過程中輸出提示信息。</p><p> 子程序DECDIV實現(xiàn)的是數(shù)字以ASCII字符形式輸出</p><p> 子程序TIME實現(xiàn)的是打字練習(xí)過程的輸出</p><p> 子程序SOUND實現(xiàn)的打字計時練習(xí)過程中鍵入字符與相應(yīng)打字
24、內(nèi)容不等時的警報。</p><p> 方案一的設(shè)計思路:系統(tǒng)隨機生成打字練習(xí)的內(nèi)容</p><p> 將需要輸出的提示信息,記錄打字練習(xí)的正確率參數(shù)單元等預(yù)先放在DATA數(shù)據(jù)段中,程序開始時就輸出提示信息然后系統(tǒng)隨機生成打字內(nèi)容存放在內(nèi)存中,然后開始打字練習(xí),由自編的中斷程序PRESS檢測按鍵時產(chǎn)生的中斷,并把按鍵的掃描碼轉(zhuǎn)換為ASCII碼,這個工作和ROM09類型的鍵盤中斷例行程序所
25、完成的工作大致相同,只是在解釋各個鍵時作了簡化,即只解釋了可顯示字符,如英文字母、數(shù)字及一些符號;其他特殊鍵,如組合鍵、雙態(tài)鍵、功能鍵等都未作解釋,只作為字符碼0來處理。在主程序部分保存原09類型的中斷向量,設(shè)置自編例行程序的中斷向量,設(shè)置中斷屏蔽位,然后開中斷。鍵入的字符時,還應(yīng)判斷字符是否為空格(20H)。如為空格,需要再次的調(diào)用INT21H中斷,從鍵盤輸入字符直至輸入的字符不是空格,還要判斷是否是退出和回車,如果是跳到重新輸入字符
26、處,重新開始從鍵盤鍵入字符判斷。如果不是,進(jìn)入鍵入的字符是否是正確處,進(jìn)行各自相應(yīng)的操作直至鍵入某一功能鍵(如Esc鍵、Shift鍵等)退出程序,結(jié)束打字練習(xí)。</p><p> 在鍵盤打字計時采用10類型的鍵盤中斷,來取得輸入字符并將字符顯示在屏幕上。</p><p> 在統(tǒng)計正確率時需要利用數(shù)制轉(zhuǎn)換子程序,將系統(tǒng)自行計數(shù)的二進(jìn)制轉(zhuǎn)換成十進(jìn)制輸出。</p><p&
27、gt; 自行編制鍵盤中斷處理程序,并保存原中斷向量。程序運行時,使用自編的中斷向量處理程序。程序退出時,恢復(fù)中斷向量。</p><p> 自編中斷處理程序也是本課題需要考慮的重要問題。雖然系統(tǒng)自帶了許多中斷例行程序可以由INT指令來執(zhí)行,但在本課題中需要對原中斷例行程序的功能進(jìn)行擴充才可。</p><p><b> 3.2程序流程圖</b></p>
28、<p><b> 主程序如圖所示:</b></p><p><b> 圖一主程序流程圖</b></p><p> 上圖為主程序流程圖,是依據(jù)設(shè)計思路中未調(diào)用子程序的幾個步驟得來。</p><p> SOUND PROC </p><p> PUSH AX
29、 報警子程序流程圖如圖3所示:</p><p> PUSH CX </p><p> IN AL, 61H</p><p> AND AL, 11111101B</p><p> OUT 61H, AL</p><p> MOV CX, 10000</p>
30、;<p><b> AGAIN_S:</b></p><p><b> XOR AL, 2</b></p><p> OUT 61H, AL</p><p> CALL DELAY</p><p> LOOP AGAIN_S</p><p><b
31、> POP CX</b></p><p> POP AX</p><p><b> RET</b></p><p> SOUND ENDP</p><p> DELAY PROC </p><p><b> PUSH CX</b
32、></p><p> MOV CX, 0FFFH</p><p> NEXT_D: NOP</p><p> LOOP NEXT_D </p><p> POP CX 圖3 報警子程序流程圖&l
33、t;/p><p><b> RET</b></p><p> DELAY ENDP </p><p> 在主程序中對鍵入字符ACSII是否介于33和127之間的判斷,其流程圖如圖4所示:</p><p> 圖4:鍵入字符的判斷流程圖</p><p><b> 3.3代碼
34、設(shè)計</b></p><p> 1. 功能模塊說明</p><p> (1)定義數(shù)據(jù)段,設(shè)置主要參數(shù):</p><p> 輸出提示信息,記錄正確率的參數(shù)</p><p><b> ?。?)代碼段</b></p><p> 調(diào)用中斷8259,鍵盤中斷</p>&l
35、t;p> ?。?)使用子程序分化各子功能</p><p> SHUCHU_TISHI PROC ;輸出提示信息</p><p> SOUND PROC ;發(fā)聲</p><p> DECDIV PROC NEAR ;轉(zhuǎn)化成字符顯示</p><p> 2. 具體代碼實現(xiàn)及關(guān)鍵
36、代碼分析</p><p><b> ??;定義堆棧段</b></p><p> ;**********************************************************************************</p><p> SSEG SEGMENT STACK 'STACK'
37、</p><p> DW 100 DUP(?)</p><p> SSEG ENDS</p><p> ;**********************************************************************************</p><p> 整個程序按兩個中斷源分為
38、兩部分。在數(shù)據(jù)段中,前半部分是鍵盤處理所需要的數(shù)據(jù)變量,包括輸入字符,字符緩沖區(qū),09H中斷向量的保存單元等。后半部分有一個打字練習(xí)內(nèi)容及其地址表SADDR,記錄對錯率的變量COUNT0,COUNT1中斷向量的存貯單元等。</p><p> 在堆棧段定義一個“先進(jìn)先出”的緩沖區(qū)(buffer):由于鍵盤是通過中斷方式工作的,由于鍵盤中斷的出現(xiàn)是完全隨機的,因此要示鍵盤I/O程序要緩沖或保留它接收的任一鍵盤輸入。
39、故需定義一個緩沖區(qū),也叫循環(huán)隊列。</p><p><b> ?。欢x數(shù)據(jù)段</b></p><p> ;**********************************************************************************DSEG SEGMENT 'DATA'</p><p&g
40、t;<b> ;顯示窗口內(nèi)容</b></p><p> MSG1 DB 'PRESS "ENTER" TO START!$'</p><p> MSG2 DB 'PRESS "ESC" TO END! $'</p><p> MSG4 DB '
41、 THE RATE OF CORRECT:$'</p><p> MSG5 DB ' PRESS "ENTER" TO RESTART!$'</p><p> MSG6 DB ' PRESS " ESC" TO OUT! $'</p><p>
42、; SECONT DB 0 </p><p> COUNT0 DW 0 ;為了記錄正確的字符數(shù)</p><p> COUNT1 DW 0 ;字符總個數(shù)</p><p> COUNT2 DW 0 ;為了到行尾時自動翻行的控制</p><p> DSEG ENDS</p><p>
43、 ;**********************************************************************************</p><p> 數(shù)據(jù)段定義了在后面要用到的記錄打字練習(xí)的正確率及需要輸出的提示信息</p><p><b> ??;定義代碼段</b></p><p> ;*******
44、***************************************************************************</p><p> CSEG SEGMENT 'CODE'</p><p> ASSUME CS:CSEG, SS:SSEG, DS:DSEG</p><p> ;*************
45、*********************************************************************</p><p> 主程序start:輸出打字操作的提示信息,隨機生成字符系列,打字練習(xí)過程,打字正確率的計算。</p><p> ?。惠敵鎏崾拘畔⒊绦騍HUCHU_TISHI PROC:通過對DH,DL的賦值將光標(biāo)定位在DH行DL列,調(diào)用宏定義OUT
46、PUT設(shè)置輸出字符串的屬性并在DH行DL列輸出</p><p> ;輸出提示信息***********************************</p><p> SHUCHU_TISHI PROC</p><p><b> ADD DH,3</b></p><p><b> ADD DL,28&
47、lt;/b></p><p> OUTPUT MSG1,14, DH, DL</p><p><b> ADD DH, 2</b></p><p><b> ADD DL,2</b></p><p> OUTPUT MSG2, 11, DH, DL</p><p&g
48、t;<b> RET</b></p><p> SHUCHU_TISHI ENDP</p><p> ;*********************************************</p><p> ??;正確率統(tǒng)計和報警程序</p><p> 由于本次課設(shè)還要求設(shè)計的匯編語言程序具有統(tǒng)計正確率的功能
49、,所以必須要有一段可以實現(xiàn)記錄輸入字符個數(shù),并通過一個判斷輸入的字符是否與屏幕上由程序自動生成的字符串當(dāng)中相對應(yīng)的字符相同的程序,若相同的話,則使得統(tǒng)計輸入正確的字符的寄存器增加一,然后將這兩個程序聯(lián)合使用來實現(xiàn)正確率的功能。由于這兩個程序當(dāng)中有需要調(diào)用其他子程序,涉及到的程序過多,這里只給出一小段核心程序,如下:</p><p> MOVTO DH, DL ; 顯示
50、光標(biāo)的位置</p><p> MOV AX, COUNT0</p><p> CALL BINDEC ; 顯示輸入字母的個數(shù)</p><p><b> MOV AH, 2</b></p><p> MOV DL, '/'
51、 </p><p> INT 21H </p><p> MOV AX, BINDEC ; 顯示輸入正確的字母個數(shù)</p><p> CALL CHANGE</p><p><b> POP DX</b><
52、;/p><p><b> JMP PRESS</b></p><p> 首先在這段程序當(dāng)中,用到了宏指令MOVTO,前面也說到了該宏指令可以通過控制DH、DL的值來控制輸出字符的位置。從而可以方便的控制想要顯示的內(nèi)容在屏幕上的位置。在這段程序當(dāng)中還涉及到了INT 21H中斷的應(yīng)用,當(dāng)AH當(dāng)中為02H時,DL當(dāng)中的存儲內(nèi)容就是直接顯示的內(nèi)容,在這里我們用到“/”即分?jǐn)?shù)的
53、形式來表達(dá)正確率,而不是直接計算出百分比?!?” 前面顯示的內(nèi)容是用戶輸入的內(nèi)容與程序顯示的字符一致的個數(shù),作為分子,而“/”后面顯示的內(nèi)容是用戶一共鍵入的字符個數(shù),作為分母。由于在計算機當(dāng)中,數(shù)據(jù)均以二進(jìn)制的形式來儲存,但二進(jìn)制并不是我們所習(xí)慣的數(shù)值表達(dá)方式,所以數(shù)據(jù)輸出前需要經(jīng)過一個進(jìn)制轉(zhuǎn)換程序的處理,經(jīng)轉(zhuǎn)換以后再輸出到屏幕上供用戶觀看。在這里就又涉及到了進(jìn)制轉(zhuǎn)換程序。由于在本程序當(dāng)中,進(jìn)制轉(zhuǎn)換程序并不是主要的程序單元,它只用作為輔
54、助程序。需要提到的是當(dāng)用戶鍵入的字符錯誤,即不與程序自動產(chǎn)生的字符串中對應(yīng)的字符相同時,需要調(diào)用到報警程序單元。用戶鍵入錯誤字符有報警是本次課設(shè)的又一個主要要求,顯然在調(diào)用報警程序之前,需要先判斷鍵入的字符是否正確,在錯誤時才會調(diào)用報警程序,這就需要有一個可以判</p><p> 4. 程序的調(diào)試與運行</p><p><b> 4.1調(diào)試環(huán)境簡介</b><
55、/p><p> 軟件簡介: MFPCI98 集成實驗環(huán)境是針對匯編語言初學(xué)者的特點開發(fā)的一個簡單易用的匯編語言學(xué)習(xí)軟件(支持最新操作系統(tǒng)Vista),它具有錯誤信息自動定位、關(guān)鍵字實時幫助并且在幫助中動畫演示匯編指令的執(zhí)行過程、語法著色、無限次撤消與恢復(fù)、WORD式的查找、替換、定位、支持中文、長文件名、軟件可以安裝在任意文件夾等功能。</p><p> 4.2 調(diào)試過程及結(jié)果分析<
56、/p><p><b> 1. 程序調(diào)試過程</b></p><p> 啟動全屏幕編輯軟件MFPCI98,輸入源程序。輸入完畢后,按Ctrl+S保存程序,規(guī)定擴展名為*.ASM。</p><p> 對源程序進(jìn)行匯編。源程序進(jìn)行匯編有三個步驟:第一個是匯編生成OBJ文件,即二進(jìn)制目標(biāo)文件,這是匯編的主要目的。第二個是連接。第三個是運行。</
57、p><p> 匯編過程中,如果源程序有語法錯誤,則匯編結(jié)束后,會指出源程序中的錯誤,這時可以通過修改源程序中的錯誤,最后,得到?jīng)]有語法錯誤的OBJ文件。當(dāng)沒有語法錯誤而又無法得到正確結(jié)果時,可用調(diào)試來進(jìn)行驗證。它通過單步、設(shè)置斷點等多種方式為我們提供非常有效的調(diào)試手段。</p><p><b> 程序運行結(jié)果</b></p><p><b
58、> 調(diào)試窗口如下:</b></p><p> 設(shè)置主程序段顯示輸出信息,程序功能應(yīng)該實現(xiàn)下圖所示:</p><p> 按下ENTER鍵后開始打字練習(xí)出現(xiàn)的界面:</p><p> 3)從鍵盤上鍵入字母系列后的界面:</p><p> 4)按下ESC鍵后,程序停止運行,運行RESTART程序,其輸出界面如下:<
59、;/p><p> 5)按下ENTER后重新開始新一輪的打字練習(xí),界面如下:</p><p> 3. 調(diào)試中出現(xiàn)的問題:</p><p> 在設(shè)計程序過程中沒有注意到要操作的目標(biāo)數(shù)據(jù)(內(nèi)存中的數(shù)據(jù))的大小和使用的操作容器(寄存器)的大小不是一致。在整個程序中沒有考慮到光標(biāo)的定位,致使字符的輸出在屏幕上沒有任何規(guī)律。在對堆棧進(jìn)行操作時,沒考慮到壓入和彈出堆棧的順序。&
60、lt;/p><p> 在自編中斷程序時當(dāng)中斷結(jié)束時,必須恢復(fù)原來的中斷向量,否則后續(xù)程序不能正確使用系統(tǒng)提供的例行程序。設(shè)置和恢復(fù)中斷向量時,要訪問程序內(nèi)部數(shù)據(jù)變量,DS作為調(diào)用參數(shù)寄存器,要正確設(shè)置。 某些硬件中斷例行程序在程序起始處將DS置成了ROM的數(shù)據(jù)段,所以在該中斷的嵌套例行程序中,若要訪問自編程序的數(shù)據(jù)變量,則必須將DS切換成用戶數(shù)據(jù)段。</p><p> 5.課程設(shè)計收獲及心
61、得體會</p><p> 這次的課程設(shè)計有很多的感悟與收獲。</p><p> 運用匯編語言來編寫一個實用的程序?qū)τ谖襾碚f是很有難度的。但是當(dāng)真的要做的時候也只好盡自己最大的努力去做。我在這個過程中有很多自己的感受,感覺匯編語言真的是很神奇,很有意思。從最剛開始的什么都不會到后來可以自己編程序,看著自己做出來的東西,心里感覺很快樂,這次的設(shè)計和其他課程設(shè)計有共同的地方,那就是不僅加深和
62、鞏固了我們的課本知識,而且增強了我們自己動腦動手的能力。但是我想它也有它的獨特之處,那就是讓我們進(jìn)入一個神奇的編程世界。對于我來說真的新奇,很有趣,也使我有更多的興趣學(xué)習(xí)匯編。</p><p> 在課程設(shè)計中過程中尤其是匯編的時候總會出現(xiàn)這樣或者那樣的問題,這要求我們要學(xué)會分析問題并且學(xué)會解決問題,有時需要查書籍查資料看自己的錯誤在哪里,在這個過程中調(diào)試是極為重要的,通過一步一步的調(diào)試找出問題的癥結(jié)所在。有時剛
63、剛解決了這里的一個問題別的地方又有新的問題出現(xiàn),這是我們不能泄氣,我們要學(xué)會思考,是什么原因使得別的地方又有新的問題,是不匹配還是其他原因。</p><p> 總的來說我覺得微機原理與接口技術(shù)是一門很有趣的課程。它在討論某一部分原理時又要涉及到其它部分的工作原理。這樣一來,不僅不能在短時間內(nèi)較深入理解計算機的工作原理,而且也很難孤立地理解某一部分的工作原理??偸菍W(xué)會了一些新知識,弄清了一些原來保留的問題,又出現(xiàn)
64、了一些新問題直到把保留的問題基本搞清楚。</p><p><b> 6.參考文獻(xiàn)</b></p><p> 趙潤林、范國渠. 匯編語言程序設(shè)計教程與實訓(xùn)[M].北京大學(xué)出版社.2006</p><p> 楊季文. 80X86匯編語言程序設(shè)計教程[M].清華大學(xué)出版社.1998</p><p> 錢曉捷. 匯編語
65、言程序設(shè)計[M].電子工業(yè)出版社.2000</p><p> [4] 溫冬蟬,沈美明.IBM PC匯編語言程序設(shè)計[M].清華大學(xué)出版 社.2002</p><p> [5] 艾德才等編著.微型接口技術(shù)實用教程[M].清華大學(xué)出版社.2002</p><p> [6] 姚燕南,薛均義主編.微型計算機原理與接口技術(shù)[M].高等教育出版社.2004</p
66、><p><b> 附錄一</b></p><p><b> 程序代碼如下:</b></p><p> LF EQU 0AH</p><p> CR EQU 0DH ;宏定義部分</p><p> PRINT MACRO P1,P2 ;輸出“*”
67、</p><p><b> PUSH AX</b></p><p><b> PUSH BX</b></p><p><b> PUSH CX</b></p><p> MOV AH, 09H</p><p> MOV AL, P1</p
68、><p> MOV BH, 0 </p><p> MOV BL, P2</p><p><b> MOV CX, 1</b></p><p><b> INT 10H</b></p><p>&l
69、t;b> POP CX</b></p><p><b> POP BX</b></p><p><b> POP AX</b></p><p><b> ENDM</b></p><p> MOVTO MACRO P1,P2 ;移動光標(biāo)到指定位置&l
70、t;/p><p><b> PUSH AX</b></p><p><b> PUSH DX</b></p><p><b> MOV AH, 2</b></p><p> MOV DH, P1</p><p> MOV DL, P2</p&
71、gt;<p><b> INT 10H</b></p><p><b> POP DX</b></p><p><b> POP AX</b></p><p><b> ENDM</b></p><p> OUTPUT MACRO
72、 MSG,P1,P2,P3 ;輸出字符串</p><p> LOCAL DIFFER, EXITOF</p><p><b> PUSH AX</b></p><p><b> PUSH BX</b></p><p><b> PUSH CX</b></
73、p><p><b> PUSH DX</b></p><p><b> PUSH DI</b></p><p> MOV DH, P2</p><p> MOV DL, P3</p><p><b> MOV BH, 0</b></p>
74、<p> MOV BL, P1</p><p><b> MOV DI, 0</b></p><p><b> DIFFER:</b></p><p> MOV AH, 02H</p><p><b> INT 10H</b></p>&
75、lt;p> MOV CL, MSG[DI]</p><p> CMP CL, '$'</p><p><b> JE EXITOF</b></p><p><b> MOV AH, 9</b></p><p> MOV AL, MSG[DI] </p
76、><p><b> MOV CX, 1</b></p><p><b> INT 10H</b></p><p><b> INC DI</b></p><p><b> INC DL</b></p><p> JMP DIF
77、FER</p><p><b> EXITOF:</b></p><p><b> POP DI</b></p><p><b> POP DX</b></p><p><b> POP CX</b></p><p><
78、;b> POP BX</b></p><p><b> POP AX</b></p><p> ENDM </p><p> DSEG SEGMENT 'DATA'</p><p><b> ;顯示窗口內(nèi)容</b></p>&
79、lt;p> MSG1 DB 'PRESS "ENTER" TO START!$'</p><p> MSG2 DB 'PRESS "ESC" TO END! $'</p><p> MSG4 DB ' THE RATE OF CORRECT:$'</p><
80、p> MSG5 DB ' PRESS "ENTER" TO RESTART!$'</p><p> MSG6 DB ' PRESS " ESC" TO OUT! $'</p><p> SECONT DB 0 </p><p> C
81、OUNT0 DW 0 ;為了記錄正確的字符數(shù)</p><p> COUNT1 DW 0 ;字符總個數(shù)</p><p> COUNT2 DW 0 ;為了到行尾時自動翻行的控制</p><p> DSEG ENDS</p><p> SSEG SEGMENT STACK 'STACK'&l
82、t;/p><p> DW 100 DUP(?)</p><p> SSEG ENDS</p><p> CSEG SEGMENT 'CODE'</p><p> ASSUME CS:CSEG, SS:SSEG, DS:DSEG</p><p> ;***********
83、********************************</p><p> START PROC FAR</p><p> PUSH DS</p><p> MOV AX, 0</p><p> PUSH AX</p><p> MOV AX, DSEG</
84、p><p> MOV DS, AX</p><p> MOV ES, AX</p><p> CALL SHUCHU_TISHI ;輸出提示信息</p><p><b> LZ:</b></p><p> MOV AH, 1 ;帶回顯的鍵符輸入</p>
85、<p><b> INT 21H</b></p><p> MOV BL, AL ;AL=輸入的字符</p><p> CMP AL,CR ;判斷輸入的字符是否是ENTER鍵</p><p> JE PRACTISE</p><p> CMP AL,1BH ;判斷是否要退出打字
86、練習(xí)程序</p><p><b> JE TZD_1</b></p><p><b> JMP LZ</b></p><p><b> PRACTISE:</b></p><p><b> MOV DH,4</b></p><p
87、><b> MOV DL,1</b></p><p> LOOP1:MOVTO DH,DL </p><p> PRINT '',0</p><p><b> INC DL</b></p><p><b> CMP DL,46</b></p
88、><p><b> JB LOOP1</b></p><p><b> MOV DH, 2</b></p><p><b> MOV DL, 1</b></p><p> MOVTO DH, DL</p><p><b> MOV AH,
89、 0</b></p><p><b> INT 1AH</b></p><p> MOV AL, DL ;隨機生成字母</p><p><b> CONT_1:</b></p><p> CMP AL, 7EH </p><p><b&
90、gt; JA CONT</b></p><p> CMP AL, 21H</p><p><b> JB CON</b></p><p><b> JMP CONTI</b></p><p><b> CONT:</b></p><p&
91、gt; SUB AL, 7EH</p><p> JMP CONT_1</p><p><b> CON:</b></p><p> ADD AL, 20H</p><p> JMP CONT_1</p><p><b> CONTI:</b></p>
92、<p> MOV CX, 45</p><p> MOV AH, 9 </p><p> MOV BL, 00001101B</p><p><b> MOV DH, 2</b></p><p><b> MOV DL, 0</b></p><p&g
93、t; JMP SHUCHU </p><p> TZD_1: ;跳轉(zhuǎn)點到“EXIT”</p><p> JMP TZD_2 </p><p><b> SHUCHU:</b></p><p><b> INC DL</b></p>
94、<p> MOVTO DH, DL</p><p> INT 10H </p><p> ADD AL, 13</p><p> CMP AL, 7EH </p><p> JA CONTINUE</p><p> LOOP SHUCHU</p><p> J
95、MP DAZIRUKOU</p><p><b> CONTINUE:</b></p><p> SUB AL, 7EH</p><p> ADD AL, 20H</p><p> LOOP SHUCHU ;到此為輸出上面一行要打字練習(xí)的內(nèi)容</p><p> ;下面開始打字
96、練習(xí)*******************************************</p><p> DAZIRUKOU:</p><p><b> MOV DH, 4</b></p><p><b> MOV DL, 1</b></p><p><b> DAZI:&
97、lt;/b></p><p> ;顯示正確率*********************************************************</p><p><b> PUSH DX </b></p><p><b> JMP DAZI1</b></p><p><
98、;b> DAZI1:</b></p><p> MOV DH, 20</p><p><b> MOV DL, 1</b></p><p> MOV DH, 22</p><p><b> MOV DL, 1</b></p><p> OUTP
99、UT MSG4, 9, DH, DL</p><p> MOV DH, 22</p><p> MOV DL, 26</p><p> MOVTO DH, DL</p><p> MOV AX, COUNT0</p><p> CALL BINDEC</p><p><b>
100、 MOV AH, 2</b></p><p> MOV DL, '/'</p><p><b> INT 21H</b></p><p> MOV AX, COUNT1 </p><p> CALL BINDEC</p><p><b> POP
101、DX</b></p><p><b> JMP PRESS</b></p><p> ;*******************************************************************</p><p><b> PRESS:</b></p><p&
102、gt; MOVTO DH, DL</p><p> MOV AH, 01H</p><p><b> INT 16H</b></p><p> JNE KEY ;測試有無鍵盤按下</p><p><b> JMP PRESS</b></p><p>
103、;<b> KEY:</b></p><p> MOV AH, 00</p><p><b> INT 16H</b></p><p> CMP AL, 20h ;如果是空格就暫停</p><p><b> JE PAUSE</b></p>
104、<p><b> JMP ISESC</b></p><p> PAUSE: ;輸入是空格就結(jié)束暫停</p><p><b> PUSH DX</b></p><p> MOV AH, 06H</p><p> MOV DL, 0FFH</
105、p><p><b> INT 21H</b></p><p><b> POP DX</b></p><p> CMP AL, 20H</p><p><b> JNE PAUSE</b></p><p><b> ISESC:</
106、b></p><p> CMP AL, 1BH</p><p><b> JE TZD_2</b></p><p> CMP AL, 08H</p><p><b> JE DELETE</b></p><p> INC COUNT2</p>&
107、lt;p> INC COUNT1 ;是上面的字符,則COUNT1加1</p><p> JMP ISEQUAL</p><p> TZD_DAZI2:</p><p><b> JMP DAZI</b></p><p> TZD_2: </p>
108、<p><b> JMP SKIP</b></p><p><b> DELETE:</b></p><p><b> NOP</b></p><p><b> DEL:</b></p><p> PRINT ' '
109、,0</p><p> TZD_DAZI1: ;跳轉(zhuǎn)點,到“打字”</p><p> JMP TZD_DAZI2</p><p><b> ISEQUAL: </b></p><p> MOV BL, AL</p><p> CMP AL, 21H</
110、p><p><b> JB WRONG</b></p><p> CMP AL, 7FH</p><p><b> JA WRONG</b></p><p><b> SUB DH, 3</b></p><p> MOVTO DH, DL</
111、p><p> PRINT ' ',0</p><p><b> INC DL</b></p><p> MOVTO DH, DL</p><p><b> INC DH</b></p><p><b> DEC DL</b><
112、/p><p> MOVTO DH, DL</p><p> MOV AH, 8 ;讀得光標(biāo)處字符送到AL中</p><p><b> INT 10H</b></p><p> CMP AL, BL</p><p><b> JE EQUAL</b><
113、/p><p> CALL SOUND ;在此處添加警報聲</p><p> MOV AL, BL</p><p> MOV BL, 12</p><p> JMP UNEQUAL</p><p><b> WRONG:</b></p><p> TZD
114、_DAZI0:</p><p> JMP TZD_DAZI1</p><p><b> EQUAL:</b></p><p> INC COUNT0</p><p> MOV AL, BL</p><p> MOV BL, 10</p><p><b>
115、 UNEQUAL:</b></p><p><b> ADD DH ,2</b></p><p> MOVTO DH, DL</p><p><b> MOV AH, 9</b></p><p><b> MOV CX, 1</b></p>
116、<p><b> INT 10H</b></p><p><b> INC DL</b></p><p> MOV AX, COUNT2</p><p> CMP AL, 45</p><p> JB TZD_DAZI0</p><p> SUB AX
117、, 45</p><p> MOV COUNT2, AX</p><p> REFLESH: ;滿一行后自動刷新(78個字符)</p><p><b> MOV AH, 7</b></p><p><b> INT 21H</b></p><
118、;p> PRACTISE1:</p><p> JMP PRACTISE</p><p><b> SKIP:</b></p><p><b> MOV DH, 5</b></p><p> MOV DL, 18</p><p><b> JMP
119、SKIP1</b></p><p> PRACTISE0:</p><p> JMP PRACTISE</p><p> SKIP1: </p><p> ADD DH, 10</p><p> OUTPUT MSG5, 10, DH, DL</p><p><
120、;b> ADD DH, 2</b></p><p> OUTPUT MSG6, 11, DH, DL</p><p> JMP RESTART</p><p> PRACTICE:</p><p> JMP PRACTISE</p><p><b> RESTART:</
121、b></p><p> MOV AH, 00</p><p><b> INT 16H</b></p><p> CMP AL, 0DH</p><p> MOV SECONT, 0</p><p> MOV COUNT0, 0</p><p> MOV
122、COUNT1, 0</p><p> MOV COUNT2, 0</p><p> JE PRACTICE</p><p> CMP AL, 1BH</p><p><b> JE EXIT</b></p><p><b> NONE:NOP</b></p&
123、gt;<p> JMP RESTART</p><p><b> EXIT: </b></p><p><b> MOV AH, 0</b></p><p><b> MOV AL, 3</b></p><p> INT 10H </p&g
124、t;<p> MOV AH, 4CH</p><p><b> INT 21H</b></p><p><b> RET</b></p><p> START ENDP</p><p> ;輸出提示信息***********************************
125、</p><p> SHUCHU_TISHI PROC</p><p><b> ADD DH,3</b></p><p><b> ADD DL,28</b></p><p> OUTPUT MSG1,14, DH, DL</p><p><b> AD
126、D DH, 2</b></p><p><b> ADD DL,2</b></p><p> OUTPUT MSG2, 11, DH, DL</p><p><b> RET</b></p><p> SHUCHU_TISHI ENDP</p><p>
127、 ;發(fā)聲*************************************</p><p> SOUND PROC </p><p><b> PUSH AX</b></p><p> PUSH CX </p><p> IN AL, 61H</p><p> AND AL,
128、 11111101B</p><p> OUT 61H, AL</p><p> MOV CX, 10000</p><p><b> AGAIN_S:</b></p><p><b> XOR AL, 2</b></p><p> OUT 61H, AL</
129、p><p> CALL DELAY</p><p> LOOP AGAIN_S</p><p><b> POP CX</b></p><p><b> POP AX</b></p><p><b> RET</b></p><
130、p> SOUND ENDP</p><p> DELAY PROC ;延時</p><p><b> PUSH CX</b></p><p> MOV CX, 0FFFH</p><p> NEXT_D: NOP</p><p> LOOP NEXT_D</p&g
131、t;<p><b> POP CX</b></p><p><b> RET</b></p><p> DELAY ENDP </p><p> ;將2進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制數(shù)********************</p><p> BINDEC
132、 PROC NEAR </p><p> MOV CX,10D ;顯示十位</p><p> CALL DECDIV </p><p> MOV CX,1 ;顯示個位</p><p> CALL DECDIV </p>
133、<p><b> RET </b></p><p> BINDEC ENDP </p><p> DECDIV PROC NEAR ;轉(zhuǎn)化成字符顯示</p><p><b> MOV DX,0 </b></p><p><b>
134、 DIV CX </b></p><p><b> MOV BX,0 </b></p><p> ADD AL,30H ;轉(zhuǎn)換成ASCII</p><p> MOV AH,0EH </p><p> INT 10H
135、 ;顯示一個字符</p><p> MOV AX,DX </p><p><b> RET </b></p><p> DECDIV ENDP</p><p> ;********************************************* </p><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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- vb課程設(shè)計報告---打字程序設(shè)計報告
- vb課程設(shè)計報告---打字程序設(shè)計報告
- VB課程設(shè)計報告---打字程序設(shè)計報告.doc
- 微機原理課程設(shè)計----打字練習(xí)程序
- vb課程設(shè)計--打字練習(xí)應(yīng)用程序
- 打字練習(xí)課程設(shè)計報告(內(nèi)附源程序)
- 程序設(shè)計課程設(shè)計報告_網(wǎng)站訪問統(tǒng)計系統(tǒng)
- 程序設(shè)計課程設(shè)計報告_網(wǎng)站訪問統(tǒng)計系統(tǒng)
- 微機原理課程設(shè)計---打字練習(xí)
- 課程設(shè)計--unix程序設(shè)計課程設(shè)計
- 程序設(shè)計課程設(shè)計報告
- 程序設(shè)計課程設(shè)計報告
- matlab程序設(shè)計 課程設(shè)計
- 微機原理課程設(shè)計--打字計時練習(xí)
- java課程設(shè)計-- 打字速度測試程序
- java課程設(shè)計---java程序設(shè)計
- matlab程序設(shè)計 課程設(shè)計 (2)
- 程序設(shè)計課程設(shè)計--鏈表操作
- 《java程序設(shè)計》課程設(shè)計報告
- 【課程設(shè)計】面向?qū)ο蟪绦蛟O(shè)計
評論
0/150
提交評論