打字測(cè)試練習(xí)_第1頁
打字測(cè)試練習(xí)_第2頁
打字測(cè)試練習(xí)_第3頁
打字測(cè)試練習(xí)_第4頁
打字測(cè)試練習(xí)_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、微機(jī)原理及接口課程設(shè)計(jì)報(bào)告課題名稱打字測(cè)試練習(xí)學(xué)院自動(dòng)控制與機(jī)械工程學(xué)院專業(yè)通信技術(shù)班級(jí)姓名學(xué)號(hào)時(shí)間2012年1月13日目錄任務(wù)書第一章 設(shè)計(jì)概述1.1 設(shè)計(jì)課題1.2 設(shè)計(jì)任務(wù)1.3 設(shè)計(jì)目的1.4 設(shè)備環(huán)境第二章 設(shè)計(jì)的相關(guān)知識(shí)2.1 匯編語言的程序設(shè)計(jì)2.2 BIOS中斷介紹2.3 DOS中斷介紹2.4 子程序設(shè)計(jì)第三章 設(shè)計(jì)方案3.1 設(shè)計(jì)思想分析3.2 設(shè)計(jì)方案實(shí)現(xiàn)3.3 程序流程圖3.4 源程序第四章 調(diào)試及運(yùn)行結(jié)果第五章 課程設(shè)計(jì)心得體會(huì)5.1 心得體會(huì)及系統(tǒng)改進(jìn)5.2 課程設(shè)計(jì)遇到的問題和解決方案參考文獻(xiàn)附錄微機(jī)原理課程設(shè)計(jì)任務(wù)書一 課題題目:打字測(cè)試練習(xí)二 課題要求:在DOS

2、環(huán)境中設(shè)計(jì)一個(gè)打字測(cè)試練習(xí)的程序:具體要求:1. 屏幕上顯示出提示信息和練習(xí)例句;2. 按照例句在從鍵盤上輸入字母;3. 每輸入完一行后回車,顯示練習(xí)輸入的時(shí)間、輸入的正確數(shù)和錯(cuò)誤數(shù)和下一行例句;4. 按Esc鍵可退出程序。5. 參考設(shè)計(jì)基本思路編程實(shí)現(xiàn)上述功能;6. 設(shè)計(jì)說明書:包括設(shè)計(jì)思想、程序流程圖和源程序。三 設(shè)計(jì)基本思路 見課程設(shè)計(jì)指導(dǎo)書四 時(shí)間進(jìn)度表:序號(hào)內(nèi)容安排時(shí)間(天)備注1分析設(shè)計(jì),收集資料準(zhǔn)備階段22編程測(cè)試階段5上機(jī)3編寫課程設(shè)計(jì)論文(說明書)階段2上機(jī)4考核評(píng)定成績階段1合計(jì)10五 考核方式序號(hào)考核內(nèi)容時(shí)間(分)備注1將所設(shè)計(jì)的源程序、復(fù)制到指定目錄中,并匯編、連接2上

3、機(jī)2運(yùn)行程序,驗(yàn)證設(shè)計(jì)結(jié)果1上機(jī)3答辯5上機(jī)六 補(bǔ)充說明1.設(shè)計(jì)題目必須調(diào)試成功(生成的可執(zhí)行文件必須能運(yùn)行并且能夠?qū)崿F(xiàn)題目實(shí)現(xiàn)的功能),考核是獨(dú)立完成考核內(nèi)容,若未完成沒有成績。2.設(shè)計(jì)說明書必須獨(dú)立完成,若果出現(xiàn)70%相同視為雷同,取消其成績。七 主要參考資料1.微機(jī)原理與接口技術(shù) 李蘭友編 清華大學(xué)出版社 20092.微機(jī)原理與應(yīng)用 潘名蓮編 電子科技大學(xué)出版社 19953.新編深入DOS編程 求伯君主編 學(xué)苑出版社 1994第一章 設(shè)計(jì)概述1.1 設(shè)計(jì)課題 打字測(cè)試練習(xí)1.2 設(shè)計(jì)任務(wù)在DOS環(huán)境中編程完成以下任務(wù): (1) 屏幕上顯示出提示信息和練習(xí)例句;(2) 按照例句在從鍵盤上輸

4、入字母;(3) 每輸入完一行后回車,顯示練習(xí)輸入的時(shí)間、輸入的正確數(shù)和錯(cuò)誤數(shù)和下一行例句;(4) 按Esc鍵可退出程序。(5) 參考設(shè)計(jì)基本思路編程實(shí)現(xiàn)上述功能;(6) 設(shè)計(jì)說明書:包括設(shè)計(jì)思想、程序流程圖和源程序。1.3 設(shè)計(jì)目的學(xué)習(xí)匯編語言綜合應(yīng)用程序設(shè)計(jì)方法,提高匯編語言實(shí)際應(yīng)用能力,充分了解計(jì)算機(jī)硬件和軟件,利用PC機(jī)鍵盤和時(shí)間中斷字符顯示實(shí)現(xiàn)打字練習(xí)程序,完成理論到實(shí)踐的推進(jìn)過程。培養(yǎng)學(xué)生理論聯(lián)系實(shí)際的設(shè)計(jì)思想,提高學(xué)生綜合應(yīng)用匯編語言課程的理論知識(shí)去分析問題、解決問題的能力。1.4 設(shè)備環(huán)境IBMPC微型計(jì)算機(jī)1臺(tái)第二章 設(shè)計(jì)的相關(guān)知識(shí)2.1 匯編語言的程序設(shè)計(jì)1程序設(shè)計(jì)的基本步驟

5、(1) 分析實(shí)際問題,弄清已知條件、未知條件和求解對(duì)象;(2) 分析得到需要解決的數(shù)據(jù)組織;(3) 確定算法;(4) 根據(jù)算法,繪制程序流程框圖;(5) 按照程序流程框圖編寫程序代碼;(6) 調(diào)試運(yùn)行程序;(7) 重復(fù)(1)(5)步,直到基本無問題。2.三種順序結(jié)構(gòu)(1) 順序程序設(shè)計(jì)順序是最常見的,也是最基本的程序設(shè)計(jì)方法。這種程序在計(jì)算機(jī)內(nèi)存中執(zhí)行時(shí),按照先后順序,逐句順序執(zhí)行。他沒有分支也沒有循環(huán),因此也稱為線性程序。(2) 分支程序設(shè)計(jì)在程序中,除了最基本的順序結(jié)構(gòu)以外,通常還有各種分支,以滿足不同情況做不同處理的需要。分支結(jié)構(gòu)有兩種形式:一種是引出兩個(gè)分支的;另一種是引出多個(gè)分支的。

6、前者類似于高級(jí)語言中的IFTHENELSE語句,后者類似于高級(jí)語言中的CASE語句。程序在某種條件下運(yùn)行時(shí),執(zhí)行其中一個(gè)分支。(3) 循環(huán)程序設(shè)計(jì) 循環(huán)程序也是一種基本結(jié)構(gòu)。程序中,往往有的程序段需要重復(fù)執(zhí)行多次,以實(shí)現(xiàn)某種功能,這樣,可以大大簡化程序設(shè)計(jì)。循環(huán)程序通常有以下三部分組成:a.循環(huán)初始狀態(tài) 循環(huán)過程中的工作單元,在循環(huán)開始前,往往要給他們賦初值,以保證循環(huán)能正常的進(jìn)行工作。b.循環(huán)體 這是循環(huán)程序重復(fù)執(zhí)行的部分,是循環(huán)的主體。c.循環(huán)控制 循環(huán)能正常進(jìn)行和結(jié)束,循環(huán)控制是關(guān)鍵。循環(huán)控制條件不合理,循環(huán)就無法按正常的預(yù)定進(jìn)行,甚至導(dǎo)致死循環(huán)。2.2 BIOS中斷介紹1.什么是BIO

7、S BIOS的全稱是ROMBIOSROM Basic I/O System(只讀存儲(chǔ)器基本輸入輸出系統(tǒng))。它是一組固化到微機(jī)主板上一個(gè)ROM芯片上的子程序,主要功能包括:a.驅(qū)動(dòng)系統(tǒng)中所配置的常用外設(shè)(即驅(qū)動(dòng)程序),如顯示器、鍵盤、打印機(jī)、磁盤驅(qū)動(dòng)器、通信接口等。b.開機(jī)自檢,引導(dǎo)裝入。c.提供時(shí)間、內(nèi)存容量及設(shè)備配置情況等參數(shù)。使用BIOS中斷調(diào)用與DOS系統(tǒng)功能調(diào)用類似,用戶也無需了解相關(guān)設(shè)備的結(jié)構(gòu)與組成細(xì)節(jié),直接調(diào)用即可。2.調(diào)用方法A.鍵盤I/O中斷調(diào)用(INT 16H) 鍵盤I/O中斷調(diào)用有三個(gè)功能,功能號(hào)0,1,2,且必須把功能號(hào)放在AH中。a. 0號(hào)功能調(diào)用 格式:MOV AH,

8、0 INT 16H 功能:從鍵盤讀入字符送AL寄存器。執(zhí)行時(shí),等待鍵盤輸入,一旦輸入,字符的ASCII碼放入AL中。若AL=0,則AH為輸入的擴(kuò)展碼。 b. 1號(hào)功能調(diào)用 格式:MOV AH,01H INT 16H 功能:用來查詢鍵盤緩沖區(qū),對(duì)鍵盤掃描但不等待,并設(shè)置ZF標(biāo)志。若有按鍵操作(即鍵盤緩沖區(qū)不空),則ZF=0,AL中存放的是輸入的ASCII碼,AH中存放輸入字符的擴(kuò)展碼。若無鍵按下,則標(biāo)志位ZF=1。 c. 2號(hào)功能調(diào)用 格式:MOV AH,02H INT 16H 功能:檢查鍵盤上各特殊功能鍵的狀態(tài)。執(zhí)行后,各種特殊功能鍵的狀態(tài)放入AL寄存器器中。3. BIOS屏幕功能調(diào)用。INT

9、 10Ha.清屏作用MOV AX,0600HMOV CX,0000HMOV DX,184FHMOV BH,07HINT 10Hb.移動(dòng)光標(biāo)MOV AH,02HMOV DH,* ;*為目的地行數(shù)(024)MOV DL,* ;*為目的地列數(shù)(079)MOV BH,00HINT 10HC.禁止光標(biāo)顯示 MOV AH,01H MOV CX,2000H INT 10Hd.恢復(fù)光標(biāo)顯示 MOV AH,01H MOV CX,0C0DH INT 10H2.3 DOS中斷介紹 1.什么是DOS系統(tǒng)功能調(diào)用系統(tǒng)功能調(diào)用是DOS為用戶提供的常用子程序(80多個(gè)),可在匯編語言程序中直接調(diào)用這些子程序的。使用DOS提

10、供的程序控制硬件。優(yōu)點(diǎn)是兼容性好,使用方便。 DOS是IBM PC系列微機(jī)的操作系統(tǒng)(現(xiàn)在的微機(jī)仍能運(yùn)行DOS,而且新的操作系統(tǒng)也能繼續(xù)提供幾乎所有的DOS功能調(diào)用)負(fù)責(zé)管理系統(tǒng)的所有資源,協(xié)調(diào)微機(jī)的操作,其中包括大量可供用戶調(diào)用的服務(wù)程序。DOS的功能調(diào)用不依賴于具體的硬件系統(tǒng)。所有的DOS系統(tǒng)功能調(diào)用都是利用軟件中斷指令I(lǐng)NT 21H來實(shí)現(xiàn)的。也就是說,在程序中需要調(diào)用DOS功能的時(shí)候,只要使用一條INT 21H指令即可。INT 21H是一個(gè)具有90多個(gè)子功能的中斷服務(wù)程序,這些子功能大致可以分為四類:設(shè)備管理、目錄管理、文件管理和其他。其功能一覽表可參見附錄。為了方便用戶使用這些子功能,

11、INT 21H對(duì)每一個(gè)子功能都進(jìn)行了編號(hào)稱為功能號(hào)。這樣,用戶就能通過指定功能號(hào)來調(diào)用INT 21H的不同子功能。 2.DOS功能調(diào)用方法a.在AH寄存器中存入所要調(diào)用功能的功能號(hào);b.根據(jù)所調(diào)用功能的規(guī)定設(shè)置入口參數(shù);c.用INT 21H指令轉(zhuǎn)入子程序入口;d.相應(yīng)的子程序運(yùn)行完后,可以按規(guī)定取得出口參數(shù)。3.DOS的基本輸入/輸出功能調(diào)用A.鍵盤輸入 調(diào)用格式:MOV AH,1 INT 21H 功能:等待從鍵盤輸入一個(gè)字符并送入AL。 a.1號(hào)調(diào)用從鍵盤輸入單個(gè)字符b.10號(hào)調(diào)用從鍵盤輸入字符串功能:從鍵盤接收字符串送入內(nèi)存的輸入緩沖區(qū),同時(shí)送顯示器顯示。調(diào)用前要求:先定義一個(gè)緩沖區(qū)調(diào)用格

12、式:LEA DX,MAXLEN(緩沖區(qū)首偏移地址) MOV AH,10 INT 21H注意:調(diào)用時(shí),要求DS:DX指向輸入緩沖區(qū)B.顯示輸出a.2號(hào)調(diào)用在顯示器上顯示輸出單個(gè)字符調(diào)用格式:MOV DL,待顯示字符的ASCII碼MOV AH,2INT 21Hb.9號(hào)調(diào)用在顯示器上顯示輸出字符串調(diào)用格式:LEA DX,字符串首偏移地址 MOV AH,9 INT 21H功能:將當(dāng)前數(shù)據(jù)區(qū)中DS:DX所指向的以結(jié)尾的字符串送顯示器顯示。2.4 子程序設(shè)計(jì)1.子程序的結(jié)構(gòu)子程序一般以文件形式編寫,并常以過程形式存放在代碼段中。子程序文件通常由程序說明和子程序主體組成。子程序說明通常包括子程序功能描述(名

13、稱,性能,執(zhí)行時(shí)間等),所有寄存器名和存儲(chǔ)單元、子程序入口和出口參數(shù)及是否又調(diào)用其他子程序。子程序的結(jié)構(gòu)一般包括保存現(xiàn)場(chǎng)、依入口參數(shù)從指定位置取加工信息、加工處理、依出口參數(shù)指定位置送出處理結(jié)果、恢復(fù)現(xiàn)場(chǎng)和返回調(diào)用程序等部分。子程序的結(jié)構(gòu)形式: 子程序名 PROC RET 子程序名 ENDS2子程序的調(diào)用和返回主程序調(diào)用子程序使用CALL指令。根據(jù)CALL指令獲得目標(biāo)地址的方法,有4種調(diào)用方式:段內(nèi)直接調(diào)用方式、段內(nèi)間接調(diào)用方式、段間直接調(diào)用方式和段間間接調(diào)用方式。為了能正確返回,不管哪一種調(diào)用方式,都需要把斷點(diǎn)(即CALL指令的下一條指令的地址)入棧保護(hù)。同時(shí),CALL指令的類型必須與RET

14、指令類型相匹配。3.主程序和子程序間的信息交換子程序中允許改變的數(shù)據(jù)稱為參數(shù)。參數(shù)包括入口參數(shù)和出口參數(shù)兩種。主程序調(diào)用子程序之前必須向子程序提供一些參數(shù),而子程序執(zhí)行完畢后又要將執(zhí)行結(jié)果提供給主程序使用。參數(shù)傳遞的方式一般有三種,即用寄存器傳遞參數(shù)、用參數(shù)表傳遞參數(shù)和用堆棧傳遞參數(shù)。不論采用哪種方式,調(diào)用程序和子程序都必須互相呼應(yīng)。子程序需要在哪里取參數(shù),主程序就應(yīng)將參數(shù)送到哪里,并且要注意參數(shù)的先后順序。a. 用寄存器傳遞參數(shù) 寄存器傳遞參數(shù)適用于參數(shù)個(gè)數(shù)較少時(shí)。方法是,主程序?qū)⒆映绦驁?zhí)行時(shí)所需要的參數(shù)放在指定的寄存器中,子程序的執(zhí)行結(jié)果也放在規(guī)定的寄存器中。b. 用參數(shù)表傳遞參數(shù) 參數(shù)表

15、方式適用于參數(shù)較多的情況。方法是,在存儲(chǔ)器中專門規(guī)定某些單元存放入口參數(shù)和出口參數(shù),即在內(nèi)存中建立一個(gè)參數(shù)表。c. 用堆棧傳遞參數(shù) 用堆棧傳送適用于參數(shù)多并且子程序多有嵌套或遞歸調(diào)用的情況。方法是,主程序?qū)?shù)壓入堆棧,子程序?qū)?shù)從堆棧中彈出。第三章 設(shè)計(jì)方案3.1 設(shè)計(jì)思想分析 在鍵盤上練習(xí)的打字例句及其地址表,計(jì)時(shí)單元等預(yù)先放在DATA數(shù)據(jù)段中,鍵盤處理子程序kbget讀入按鍵時(shí)產(chǎn)生的鍵值,并把按鍵的掃描碼轉(zhuǎn)換為ASCII碼存入緩存區(qū)buffer。在顯示鍵入的字符時(shí),還應(yīng)判斷字符是否為回車符(0DH)、退格鍵(08H)和ESC鍵。如為回車符,說明一個(gè)句子輸入完畢,此時(shí)調(diào)用顯示時(shí)間的子程序

16、顯示出打字時(shí)間,統(tǒng)計(jì)和顯示正確數(shù)和錯(cuò)誤數(shù)。然后順序顯示下一個(gè)例句。如果所存放的例句都已顯示完,則又從第一個(gè)例句開始顯示,直至鍵入功能鍵ESC鍵退出程序,結(jié)束打字練習(xí)。如為退格鍵,應(yīng)做相應(yīng)的處理。打字時(shí)間的統(tǒng)計(jì)是利用自編的定時(shí)器中斷處理程序elint來完成。每輸完一例句,計(jì)時(shí)一次。定時(shí)器每秒鐘中斷18.2次,在此中斷例行程序中,中斷的次數(shù)記錄在計(jì)數(shù)單元count 中,當(dāng)count計(jì)數(shù)值為18時(shí),see計(jì)數(shù)單元加1,當(dāng)see計(jì)數(shù)值達(dá)到60時(shí),min計(jì)數(shù)單元加1。因?yàn)檩斎胪暌粋€(gè)句子無論如何也不會(huì)達(dá)到小時(shí)級(jí),所以對(duì)hours計(jì)數(shù)值的調(diào)整判斷,實(shí)際上只起到退出定時(shí)器中斷的作用。在主程序的末尾,利用DOS

17、功能回復(fù)原1CH類型的中斷向量,然后返回DOS。 顯示時(shí)間的子程序disptime分別將各計(jì)時(shí)單元的二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù),并以min:sec:msec的形式顯示出來。其中msec是由count計(jì)數(shù)值轉(zhuǎn)換成的:Count×1秒/18.2count×55ms3.2 設(shè)計(jì)方案實(shí)現(xiàn)要求用匯編語言進(jìn)行編程,下面是編寫過程中主要涉及的知識(shí)點(diǎn):1. 在PC機(jī)中,對(duì)鍵盤的管理是通過中斷機(jī)構(gòu)和8255芯片來實(shí)現(xiàn)的,在8255中有兩個(gè)端口PA和PB,在這個(gè)硬件接口的基礎(chǔ)上,系統(tǒng)在BIOS中配備了鍵盤服務(wù)功能,可以調(diào)用鍵盤的DOS和BIOS功能編程,也可以直接在硬件接口的基礎(chǔ)上編程。2. 視屏

18、顯示程序設(shè)計(jì):一般由DOS或BIOS調(diào)用來完成。有關(guān)顯示輸出的DOS功能調(diào)用不多,而BIOS調(diào)用的功能很強(qiáng),主要包括設(shè)置顯示方式、光標(biāo)大小和位置、設(shè)置調(diào)色板號(hào)、顯示字符、顯示圖形等。用INT 10H即可建立某種顯示方式。用DOS功能調(diào)用顯示技術(shù),把系統(tǒng)功能調(diào)用號(hào)送至AH,把程序段規(guī)定的入口參數(shù),送至指定的寄存器,然后由中斷指令I(lǐng)NT 21H來實(shí)現(xiàn)調(diào)用,例:要輸出多于一個(gè)字符時(shí),利用DOS功能調(diào)用9.3. 鍵盤掃描程序設(shè)計(jì):檢測(cè)鍵盤狀態(tài),有無輸入,并檢測(cè)輸入各值。例:利用DOS功能調(diào)用的01號(hào)功能,接受從鍵盤輸入的字符到AL寄存器。4. 打字計(jì)時(shí)統(tǒng)計(jì):每輸完一句例句,計(jì)時(shí)一次。此中斷處理程序中,

19、計(jì)數(shù)器中斷的次數(shù)記錄在計(jì)數(shù)單元count中,由于定時(shí)中斷的引發(fā)速率是每秒18.2次,即計(jì)數(shù)一次為55ms,當(dāng)count計(jì)數(shù)值為18時(shí),sec計(jì)數(shù)單元加一(為一秒)。5. 顯示時(shí)間子程序:將計(jì)時(shí)單元的二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)加以顯示。3.3程序流程圖開始 Kbflag=08h?保存原中斷09H到自設(shè)的單元中 N結(jié)束程序設(shè)置自編處理程序的中斷向量1CH YCall dispchar(顯示該字符)保存原中斷向量1CH到自設(shè)單元輸入字符為回車符0DH設(shè)置自編處理程序的中斷向量1CH N Y設(shè)置允許鍵盤和定時(shí)器中斷AL換行符(0AH)(顯示回車換行符)Call dispchar(顯示回車換行符)設(shè)置顯示方

20、式為80*25Call disptime(顯示打字時(shí)間)顯示提示信息 Call dispTF(顯示正確數(shù)和錯(cuò)誤數(shù))在屏幕上顯示例句 下一例句初始化變量count、sec、min、hours5個(gè)例句都練習(xí)完了嗎?開中斷 Y Call kbget N 圖1 程序流程總圖開始Count中有效值送入bx中初始化計(jì)數(shù)與18做比較? 將DS壓出堆棧 N Y計(jì)算毫秒與12做比較將DS壓出堆棧 N Y減12結(jié)束圖2 時(shí)間計(jì)時(shí)子程序流程圖開始找到例句有效值得到例句字符數(shù)CX壓入堆棧將BX置零AL與DI比較BX加1 Y N轉(zhuǎn)到DTF1SI,DI自加1 循環(huán)顯示正確數(shù)和錯(cuò)誤數(shù)結(jié)束 圖3 顯示正確數(shù)和錯(cuò)誤數(shù)子程序流程

21、圖開始Disptime 顯示時(shí)間主段把分移動(dòng)到AX寄存器中顯示數(shù)字把“:”移動(dòng)到AL寄存器中把秒移動(dòng)到AX寄存器中顯示數(shù)字把“:”移動(dòng)到AL寄存器中把毫秒移動(dòng)到AX寄存器中顯示數(shù)字結(jié)束圖4 時(shí)間顯示子程序流程圖開始將0送入到kbflog中Esc健0ffh送入kbflagY NEnter鍵 轉(zhuǎn)到kbexitY N 轉(zhuǎn)移Backspace鍵Kb3轉(zhuǎn)到kb2 Y NBx0? N02送入AH中 YKb1 轉(zhuǎn)到結(jié)束程序 圖 5 鍵盤處理子程序流程圖3.4 源程序stack segment para stack 'stack'db 256 dup(0)top label wordstack

22、 endsdata segment para public 'data'輸入緩沖區(qū)buffer db 80 dup(0)kbflag db 0prompt db ' *please practise typing*',0dh,0ah,'$'例句str1 db 'abcd efgh ijkl mnop qrst uvwx yz.'db 0dh,0ah,'$'str2 db 'There are some newspapers on the table.'db 0dh,0ah,'$'st

23、r3 db 'There are some clouds in the sky.'db 0dh,0ah,'$'str4 db 'She always eats her lunch at noon.'db 0dh,0ah,'$'str5 db 'I do not like autumn and winter.'crlf db 0dh,0ah,'$'colon db ':','$'Correct db ' Correct:$'Error db '

24、Error:$'例句首址數(shù)組Saddr dw str1,str2,str3,str4,str5;例句字符數(shù)數(shù)組StrLen dw str2-str1-3,str3-str2-3,str4-str3-3dw str5-str4-3,crlf-str5Index dw 0 ;例句索引Chrcount dw 0 ; 輸入字符計(jì)數(shù)count dw 0 ;1/18.2 秒計(jì)數(shù)sec dw 0 ;秒計(jì)數(shù)min dw 0 ;分計(jì)數(shù)hours dw 0save_lc dw 2 dup(?)data endscode segmentassume cs:code,ds:data,es:data,ss:st

25、ackmain proc farstart: mov ax,stack ;初始化堆棧mov ss,axmov sp,offset toppush ds ;現(xiàn)場(chǎng)保護(hù)sub ax,axpush axmov ax,datamov ds,axmov es,ax;將原定時(shí)中斷向量1CH保存在自設(shè)的單元中mov ah,35hmov al,1chint 21hmov save_lc,bxmov save_lc+2,es;設(shè)置自編定時(shí)處理程序的中斷向量push ds;自編定時(shí)中斷類型程序段地址放入DSmov dx,seg elintmov ds,dx; 自編定時(shí)中斷類型程序偏移放入DXMov dx,offse

26、t clintmov al,1chmov ah,25hint 21hpop ds;允許鍵盤和定時(shí)器中斷in al,21hand al,11111100bout 21h,alfirst: mov ah,0 ;設(shè)置顯示方式mov al,3int 10h;顯示提示信息mov dx,offset promptmov ah,9int 21hmov Index,0next: mov bx,Indexshl bx,1mov si,0mov dx,saddrsibx ;顯示例句mov ah,09hint 21h ;在屏幕上顯示例句mov count,0 ;設(shè)置初值mov sec,0mov min,0mov h

27、ours,0mov cx,80mov si,offset buffer ;清緩沖區(qū)ClrBuf: mov byte ptrsi,0loop ClrBufmov chrcount,0sti ;允許更高一級(jí)的中斷forever: call kbgetlea dx,crlfmov ah,09hint 21hcall disptime ;顯示時(shí)間call dispTFlea dx,crlfmov ah,09hint 21h ;顯示例句是否結(jié)束test kbflag,80hjnz mexitinc Indexcmp Index,5jne nextjmp first ;原來的中斷向量mexit: cli;

28、恢復(fù)原定時(shí)中斷向量1CHpush dsmov dx,save_lcmov ax,save_lc+2mov ds,axmov al,1chmov ah,25hint 21hpop dsstiret ;返回Dosmain endp;定時(shí)器中斷處理程序clint proc nearpush dsmov bx,datamov ds,bxlea bx,countinc word ptrbxcmp word ptrbx,18 ;初始化計(jì)數(shù)jne returncall inct ;計(jì)算毫秒adj: cmp hours,12 ;是否滿足12小時(shí)jle returnsub hours,12 ;滿足減12 ret

29、urn: pop dsstiiretclint endp;時(shí)間換算子程序inct proc nearmov word ptrbx,0add bx,2inc word ptrbx;BX內(nèi)容自增1cmp word ptrbx,60;和60比較jne exitcall inct ;計(jì)算秒,分exit: retinct endp;時(shí)間顯示子程序Disptime proc near;顯示時(shí)間主段mov ax,min ;分移動(dòng)到AX寄存器call bindec;顯示數(shù)字mov bx,0mov al,':'mov ah,0eh ;顯示冒號(hào)int 10hmov ax,sec ;秒call bi

30、ndecmov bx,0mov al,':'mov ah,0ehint 10hmov bx,countmov al,55d ;毫秒mul blcall bindecretdisptime endp;二進(jìn)制轉(zhuǎn)化為十進(jìn)制顯示時(shí)間dispTF proc nearmov bx,Indexshl bx,1mov si,offset saddr;得到例句首址mov si,sibxmov di,offset buffer;得到例句字符數(shù)mov cx,offset StrLenadd bx,cxmov cx,bxpush cxxor bx,bxDFT0: mov al,siCmp al,diJ

31、ne DTF1inc bx ;正確加一DTF1: inc siInc diloop DFT0push bxmov dx,offset Correctmov ah,09hint 21hmov ax,bxcall bindec ;顯示正確數(shù)mov dx,offset Errormov ah,09hint 21hpop bxpop cxsub cx,bxmov ax,cxcall bindec ;顯示錯(cuò)誤數(shù)retdispTF endpbindec proc nearmov cx,100d ;百位call decdivmov cx,10d ;十位call decdivmov cx,1 ;個(gè)位call

32、decdivretbindec endp;計(jì)算并顯示正確數(shù),錯(cuò)誤數(shù)字程序decdiv proc nearmov dx,0div cxmov bx,0add al,30h ;轉(zhuǎn)換為ASCIImov ah,0ehint 10h ;在 CTR 上顯示mov ax,dxretdecdiv endp;鍵盤處理子程序Kbgetproc nearMov kbflag,0kb0:mov ah,08hint 21hcmp al,1bh ;ESC 鍵按下je kb4cmp al,0dh ;Enter鍵按下je kbexitcmp al,08h ;BackSpace鍵按下jne kb2mov bx,chrcount

33、cmp bx,0je kb1mov ah,02hmov dl,alint 21hmov dl,0int 21hmov dl,08hint 21hdec chrcountkb1:mov si,offset buffermov bx,chrcountmov bh,0add si,bxmov byte ptrsi,0jmp kb0kb2: mov si,offset StrLenmov bx,Indexshl bx,1add si,bxmov bx,chrcountcmp bx,sijl kb3mov ah,02hmov dl,07hint 21hjmp kb0kb3: mov dl,almov a

34、h,02hint 21hmov si,offset buffermov bx,chrcountmov bh,0add si,bxmov si,alinc chrcountjmp kb0kb4: mov kbflag,0ffhkbexit: retkbget endpcode endsend start第四章 調(diào)試及運(yùn)行結(jié)果 通過設(shè)計(jì)和編寫程序代碼段,運(yùn)行程序后,以下為運(yùn)行的過程,而后進(jìn)入打字訓(xùn)練界面,打完字敲擊回車按鍵就馬上進(jìn)入下一行語句的訓(xùn)練。我們?cè)谶\(yùn)行過程中一開始沒有在DOS環(huán)境下運(yùn)行,出現(xiàn)了只顯示正確錯(cuò)誤字?jǐn)?shù),而不計(jì)時(shí)的情況。后經(jīng)小組的努力協(xié)調(diào),終于解決了問題,可以進(jìn)行計(jì)時(shí)。具體調(diào)試結(jié)果

35、如下所示:1.先進(jìn)入運(yùn)行界面圖4.1 編譯后界面圖4.2 運(yùn)行后界面2敲擊回車鍵進(jìn)入打字練習(xí)界面第五章 課程設(shè)計(jì)心得體會(huì)5.1心得體會(huì)及系統(tǒng)改進(jìn)1.心得體會(huì) 兩周的匯編語言課程設(shè)計(jì)結(jié)束了,我的收獲是很大的。通過課程設(shè)計(jì)的編程和對(duì)編程設(shè)計(jì)過程中遇到的問題的思考,有效的提高了我對(duì)匯編的認(rèn)識(shí)和理解,切實(shí)的提高了我的編程能力,補(bǔ)全了我的不足。通過這次課程設(shè)計(jì),我鞏固了所學(xué)過的知識(shí),能用匯編語言熟練的運(yùn)用順序、選擇、循環(huán)三大結(jié)構(gòu),進(jìn)一步掌握了各個(gè)指令的功能,掌握了子程序的定義及調(diào)用,以及正確的應(yīng)用DEBUG指令,在整個(gè)程序的編寫中,調(diào)試占了很大部分地時(shí)間。要想寫好匯編語言的程序,必須認(rèn)真對(duì)待代碼的每一個(gè)

36、細(xì)節(jié),還必須熟練的掌握debug命令,這對(duì)程序的調(diào)試是非常重要的。通過這次實(shí)際動(dòng)手能力的培養(yǎng),我進(jìn)一步熟悉了匯編語言的結(jié)構(gòu)和使用方法,基本達(dá)到了能獨(dú)立閱讀,編制和調(diào)試一定規(guī)模的匯編語言程序的水平。另外,我覺得學(xué)習(xí)匯編有一個(gè)比較大的好處,就是可以了解到在電腦中每一個(gè)字節(jié)數(shù)據(jù)的來龍去脈。 微機(jī)原理和接口技術(shù)是一門很有趣的課程,任何一個(gè)計(jì)算機(jī)系統(tǒng)都是一個(gè)復(fù)雜的整體,學(xué)習(xí)計(jì)算機(jī)原理是要涉及到整體的每一部分。討論某一部分原理時(shí)又要涉及到其他部分的工作原理。這樣一來,不僅不能在短時(shí)間內(nèi)較深入的理解計(jì)算機(jī)的工作原理,而且也很難孤立的理解某一部分地工作原理。所以,在循序漸進(jìn)的課堂教學(xué)過程中,我總是處于“學(xué)會(huì)了

37、一些新知識(shí),弄清了一些原來保留的問題,又出現(xiàn)了一些新問題”的循環(huán)中,直到課程結(jié)束時(shí),才把保留的問題基本搞清楚。學(xué)習(xí)該門課程知識(shí)時(shí),其思維方法也和其他課程不同,該課程偏重于工程思維,具體的說,在了解了微處理器各種芯片的功能和外部特性以后,剩下是如何將他們用于實(shí)際系統(tǒng)中,其創(chuàng)造性勞動(dòng)在于如何用計(jì)算機(jī)的有關(guān)技術(shù)和廠家提供的各種芯片,設(shè)計(jì)實(shí)用的電路和系統(tǒng),在配上相應(yīng)的應(yīng)用程序,完成各種實(shí)際應(yīng)用項(xiàng)目。這次實(shí)驗(yàn)并不是很難,主要的困難來自對(duì)程序的理解。功夫不負(fù)有心人,經(jīng)過三個(gè)人的合作和努力,我們最后對(duì)實(shí)驗(yàn)的原理有了清晰地認(rèn)識(shí)。雖然實(shí)驗(yàn)臺(tái)上的很多模塊單元沒有用到,但是就系統(tǒng)功能來說,我覺得我們做的還是不錯(cuò)的。

38、這次課程設(shè)計(jì)對(duì)試驗(yàn)臺(tái)有了足夠的了解,讓我們知道了實(shí)驗(yàn)臺(tái)上各個(gè)模塊的用法;而且他還讓我們對(duì)自己動(dòng)手寫程序來控制實(shí)驗(yàn)臺(tái)的運(yùn)作有了一定的基礎(chǔ)。雖然實(shí)驗(yàn)臺(tái)只是一個(gè)小型的模擬平臺(tái),但是通過對(duì)它的學(xué)習(xí)和操作,我們對(duì)有關(guān)接口的知識(shí)將會(huì)有一個(gè)更廣泛地認(rèn)識(shí),而且他對(duì)我們以后的學(xué)習(xí)也會(huì)有幫助的。實(shí)驗(yàn)中個(gè)人的力量是不及群體的力量的,我們?nèi)齻€(gè)人分工合作,做事的效率高了很多。雖然有時(shí)候會(huì)為一些細(xì)節(jié)爭論不休,但最后的出的總是最好的結(jié)論。而且實(shí)驗(yàn)也教會(huì)我們?cè)趫F(tuán)隊(duì)中要善于與人相處,與人共事,不要一個(gè)人解決所有問題。通過這次課程設(shè)計(jì),使我懂得了理論和實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)

39、合起來,從理論中的出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考能力。在設(shè)計(jì)的過程中遇到問題,可以說是困難重重,這畢竟第一次做,難免會(huì)遇到各種各樣的問題,同時(shí)在設(shè)計(jì)的過程中發(fā)現(xiàn)了自己的不足之處,對(duì)以前所學(xué)過的知識(shí)理解的不夠深刻,掌握的不夠牢固。在設(shè)計(jì)中遇到了很多編程問題,但最后經(jīng)過努力完成了這次課程設(shè)計(jì)。這讓我明白了只要有恒心,有耐心,就可以達(dá)到自己的目標(biāo),完成任務(wù)!2.系統(tǒng)改進(jìn)對(duì)于我所設(shè)計(jì)的打字系統(tǒng),其滿足了題目的所有要求,所有功能都可以實(shí)現(xiàn)。但我覺得這個(gè)打字練習(xí)還有許多地方可以改進(jìn),首先是界面,界面還可以設(shè)置的更友好,現(xiàn)在的界面看上去不是那么的友好,只滿足了基本功能,讓用

40、戶知道如何使用這個(gè)系統(tǒng)。改進(jìn)可以讓用戶感覺眼前一亮這種效果最好,當(dāng)然這需要花費(fèi)更多的時(shí)間和精力。再一個(gè)可以改進(jìn)的地方便是系統(tǒng)的功能了,該打字系統(tǒng)的功能比較少,對(duì)于打字練習(xí)來說,其目的在于提高使用者的打字速度,所以程序最好加一個(gè)計(jì)時(shí)功能模塊,這樣用戶就可以知道使用后自己的打字速度有沒有得到提升。還有就是當(dāng)用戶打字出錯(cuò)的時(shí)候,最好在給用戶配備一個(gè)警告功能,這樣可以提醒用戶,讓用戶知道打字出錯(cuò)了。當(dāng)然還有許多地方值得我進(jìn)一步去探討,去完善這個(gè)程序。5.2 課程設(shè)計(jì)遇到的問題和解決方案 1.在分析課程設(shè)計(jì)要求時(shí),將我們的想法加到源程序過程中遇到不少麻煩,沒有順利實(shí)現(xiàn),走了不少彎路。 解決辦法:通過建立

41、數(shù)學(xué)模型,畫程序流程圖,參考相關(guān)程序例子,將源程序中斷和調(diào)用等分模塊搞清楚,從而將問題要求具體化形象化,為程序?qū)崿F(xiàn)打好基礎(chǔ)。2.在對(duì)源程序進(jìn)行了編譯后出現(xiàn)了很多錯(cuò)誤。 解決方法:到圖書館找了一些書與老師發(fā)的資料進(jìn)行了對(duì)照,來找出錯(cuò)誤進(jìn)而改正。發(fā)現(xiàn)大多是自己粗心而寫錯(cuò)了程序。3.在對(duì)程序進(jìn)行運(yùn)行時(shí),運(yùn)行結(jié)果不能進(jìn)行計(jì)時(shí)的功能,只可以顯示正確或錯(cuò)誤的字?jǐn)?shù)。 解決方法:在對(duì)程序進(jìn)行了檢查和修改,改變了運(yùn)行時(shí)的步驟和操作,最終可以計(jì)時(shí)。參考文獻(xiàn)微機(jī)原理與接口技術(shù) 李蘭友編 清華大學(xué)出版社 2009微機(jī)原理與應(yīng)用 潘名蓮編 電子科技大學(xué)出版社 1995新編深入DOS編程 求伯君主編 學(xué)苑出版社 1994

42、附錄表一 DOS功能調(diào)用表AH功能調(diào)用參數(shù)返回參數(shù)00程序終止(同INT 20H)CS=程序段前綴01鍵盤輸入并回顯AL=輸入字符02顯示輸出DL=輸出字符03異步通迅輸入AL=輸入數(shù)據(jù)04異步通迅輸出DL=輸出數(shù)據(jù)05打印機(jī)輸出DL=輸出字符06直接控制臺(tái)I/ODL=FF(輸入)DL=字符(輸出)AL=輸入字符07鍵盤輸入(無回顯)AL=輸入字符08鍵盤輸入(無回顯)檢測(cè)Ctrl-BreakAL=輸入字符09顯示字符串DS:DX=串地址'$'結(jié)束字符串0A鍵盤輸入到緩沖區(qū)DS:DX=緩沖區(qū)首地址(DS:DX)=緩沖區(qū)最大字符數(shù)(DS:DX+1)=實(shí)際輸入的字符數(shù)0B檢驗(yàn)鍵盤狀

43、態(tài)AL=00 有輸入AL=FF 無輸入0C清除輸入緩沖區(qū)并請(qǐng)求指定的輸入功能AL=輸入功能號(hào)(1,6,7,8,A)0D磁盤復(fù)位清除文件緩沖區(qū)0E指定當(dāng)前缺省的磁盤驅(qū)動(dòng)器DL=驅(qū)動(dòng)器號(hào) 0=A,1=B,.AL=驅(qū)動(dòng)器數(shù)0F打開文件DS:DX=FCB首地址AL=00 文件找到AL=FF 文件未找到10關(guān)閉文件DS:DX=FCB首地址AL=00 目錄修改成功AL=FF 目錄中未找到文件11查找第一個(gè)目錄項(xiàng)DS:DX=FCB首地址AL=00 找到AL=FF 未找到12查找下一個(gè)目錄項(xiàng)DS:DX=FCB首地址(文件中帶有*或?)AL=00 找到AL=FF 未找到13刪除文件DS:DX=FCB首地址AL=

44、00 刪除成功AL=FF 未找到14順序讀DS:DX=FCB首地址AL=00 讀成功  =01 文件結(jié)束,記錄中無數(shù)據(jù)  =02 DTA空間不夠  =03 文件結(jié)束,記錄不完整15順序?qū)慏S:DX=FCB首地址AL=00 寫成功  =01 盤滿  =02 DTA空間不夠16建文件DS:DX=FCB首地址AL=00 建立成功  =FF 無磁盤空間17文件改名DS:DX=FCB首地址(DS:DX+1)=舊文件名(DS:DX+17)=新文件名AL=00 成功AL=FF 未成功19取當(dāng)前缺省磁盤驅(qū)動(dòng)器AL=缺省的驅(qū)動(dòng)器號(hào) 0=A,1=B,2=

45、C,.1A置DTA地址DS:DX=DTA地址1B取缺省驅(qū)動(dòng)器FAT信息AL=每簇的扇區(qū)數(shù)DS:BX=FAT標(biāo)識(shí)字節(jié)CX=物理扇區(qū)大小DX=缺省驅(qū)動(dòng)器的簇?cái)?shù)1C取任一驅(qū)動(dòng)器FAT信息DL=驅(qū)動(dòng)器號(hào)同上21隨機(jī)讀DS:DX=FCB首地址AL=00 讀成功  =01 文件結(jié)束  =02 緩沖區(qū)溢出  =03 緩沖區(qū)不滿22隨機(jī)寫DS:DX=FCB首地址AL=00 寫成功  =01 盤滿  =02 緩沖區(qū)溢出23測(cè)定文件大小DS:DX=FCB首地址AL=00 成功(文件長度填入FCB)AL=FF 未找到24設(shè)置隨機(jī)記錄號(hào)DS:DX=FCB首地址25設(shè)置中斷向量DS:DX=中斷向量AL=中斷類型號(hào)26建立程序段前綴DX=新的程序段前綴27隨機(jī)分塊讀D

溫馨提示

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

評(píng)論

0/150

提交評(píng)論