




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、打字練習(xí)程序1設(shè)計目的這次課設(shè)的任務(wù)是寫一個程序,運行可執(zhí)行程序后,出現(xiàn)主界面,按回車鍵出現(xiàn)由26個字母組成的亂序行,這時其中任一字母落下,在鍵盤上敲入該字母,如果輸入正確,字母消失;按回車鍵進入打字練習(xí);按esc鍵返回主界面;按空格鍵暫停;按q退出。通過課程設(shè)計,主要達到以下目的:(1)增進對匯編語言的認識,加強用匯編語言編程的能力;(2)掌握匯編語言的中斷調(diào)用功能的應(yīng)用,可以用匯編語言調(diào)用各種中斷調(diào)用功能,并由此實現(xiàn)對硬件的控制等;(3)了解和掌握匯編語言程序設(shè)計過程、方法及實現(xiàn),為以后微機原理課程的學(xué)習(xí)打下良好基礎(chǔ);(4)通過課程設(shè)計可以使我們更加了解書上的知識,了解書上的語句并且能夠應(yīng)
2、用自己的程序中;(5)掌握屏幕輸出顯示的設(shè)計方法。2概要設(shè)計圖2-1 主程序流程圖2.1 系統(tǒng)總體分析根據(jù)題目要求可以看到有以下幾部分來實現(xiàn)打字練習(xí):(1)由26字母亂序組成一行顯示行;(2)字母自動落下;(3)從鍵盤輸入的字母與落下字母相同則該字母消失,并且下一個字母自動接著落下;(4)按下“esc”鍵則程序返回到主界面;(5)按空格鍵游戲暫停;(6)在主界面按“q”則程序退出。 打字練習(xí)的主要功能由以上六部分組成,每一部分之間的聯(lián)系都是比較緊密的。對于以上幾個部分,最主要的部分就是第二三兩個部分,這是打字練習(xí)的重點,需要詳細設(shè)計其所需要的功能。2.2主模塊框圖及說明程序的核心模塊是打字,各
3、個模塊功能的實現(xiàn)主要是通過鍵盤輸入指令來融合的,主要流程是先到主界面,然后選擇你想要進行的指令:enter進入打字界面開始打字,“q”退出程序,空格在打字練習(xí)時執(zhí)行暫停的功能,esc是從打字界面返回到主界面。核心模塊的程序流程大體如下面的流程圖圖2-1。3詳細設(shè)計3.1 主模塊及子模塊說明主界面是程序的初始入口,也是其他功能模塊的接入點。主模塊是打字模塊,也是核心模塊,主要通過各個鍵盤符來控制各個子模塊之間的協(xié)調(diào)。子模塊分為判斷輸入字符判斷模塊(這當中包含兩個小的子模塊:主界面輸入字符判斷和打字模塊輸入字符判斷)、暫停模塊、退出模塊(這當中包含兩個小的子模塊:打字界面返回主界面模塊和主界面退出
4、程序模塊)。3.2 各模塊詳細設(shè)計3.2.1主界面模塊 當程序運行后,我們首先要進行選擇,是要繼續(xù)進行即進入打字練習(xí)程序還是終止練習(xí)退出程序。所以,在這里我們需要設(shè)置一個程序,該程序要判斷鍵盤鍵入的字符,我們不妨規(guī)定esc鍵和enter鍵分別為終止程序的控制鍵和進入打字練習(xí)程序的控制鍵,即當檢驗到鍵盤輸入esc后,退出程序;當鍵盤輸入為enter時進入打字練習(xí)程序。單元程序如下:zk db welcome to play this game!$ no db date:2010/01/11$meg db press enter key to continue.$meg1 db when a le
5、tter is dropping,please hit it!$meg2 db press space key to pause!$meg3 db press esc key to return main interface!$meg4 db press letter q to exit!$;設(shè)置主界面的顯示內(nèi)容.clear_screen 00d,00d,24d,79d ;清屏宏定義 init_game 00d,00d,0ah,dl,80d,nextsign1 init_game 24d,00d,0ah,dl,80d,nextsign2 init_game 00d,00d,0ah,dh,25d
6、,nextsign3 init_game 00d,79d,0ah,dh,25d,nextsign4 menu 05d,15d,zk ;菜單信息的宏調(diào)用 menu 07h,15d,no menu 09d,15d,meg menu 11d,15d,meg1 menu 13d,15d,meg2 menu 15d,15d,meg3 menu 17d,15d,meg4 put: mov ah,02h ;設(shè)置光標位置 mov bh,00h mov dh,22d mov dl,33d int 10h mov ah,01h ;從鍵盤輸入任意字符 int 21h cmp al,0dh je speed3 ;輸入
7、為entry進入打字練習(xí) cmp al,51h jne put ;輸入為“q”退出程序 mov ah,4ch int 21h以上代碼是清屏,并調(diào)用宏實現(xiàn)主界面的顯示,并在主界面中設(shè)置了菜單顯示后的光標位置,以方便使用者的操作。 in_cycle: add cx,01h cmp cx,1000 jne in_cycle push dx mov ah,06h ;從鍵盤輸入字符 mov dl,0ffh int 21h pop dx jz pass cmp al,1bh ;如果鍵入esc,則返回主菜單 je to_start1 cmp al, ;如果鍵入space,則游戲暫停 je pause cmp
8、 al,di ;輸入字母正確!則字母消失 je disappearto_start1: ;返回主菜單 jmp start上述程序段中用到了中斷int21,利用中斷的有關(guān)規(guī)定,先將01h存入到ah當中,則al中即為由鍵盤鍵入的字符。在此,先通過cmp指令來判斷輸入的字符是否是enter鍵(enter鍵的ascii碼為十六進制的0dh),如果是的話,程序?qū)⑻D(zhuǎn)到程序disappear,disappear是定義的又一個程序,該程序即為打字練習(xí)程序的核心部分。如果不是enter的話,將執(zhí)行下一條指令,即判斷鍵盤鍵入的是否為q鍵,此功能由cmpal,51h來實現(xiàn),其中51h是q鍵的acsii碼的十六進制
9、的表示。如果是q鍵的話,程序?qū)⑼顺龃蜃志毩?xí)程序。如果鍵盤鍵入的既不是enter也不是q鍵的話,程序?qū)⒗^續(xù)等待鍵盤的輸入,直到輸入的按鍵為enter和q當中的一個為止。3.2.2隨機字母產(chǎn)生模塊當用戶選擇繼續(xù)運行程序且進入打字練習(xí)界面時,則程序需要首先為用戶輸出一列隨機的字符序列,這時程序就需要自動的調(diào)用產(chǎn)生隨機字符序列的程序。程序段如下:letters db jwmilzoeucgpravskntxhdyqfb db iytpkwnxlsvxrmofzhgaebudjq db nwimzoexrphysfqtvdcgljukdaletters_bak db jwmilzoeucgpravskn
10、txhdyqfb db iytpkwnxlsvxrmofzhgaebudjq db nwimzoexrphysfqtvdcgljukda ;定義待“下落”的字符letter_counter db 0 begin: clear_screen 01d,01d,23d,78d ;清屏宏調(diào)用 clear_screen 01d,01d,23d,78d init_game 23d,01d,01h,dl,78d,nextsign5 mov ah,02h mov bh,00h mov dh,01h mov dl,01h int 10h mov cx,00h lea si,letters上述的程序段中,begi
11、n實現(xiàn)了輸出的字符的隨機顯示,這個隨機是我們要事先通過自己隨機定義一段由26個字母組成的序列,然后由begin來調(diào)用,從而間接來實現(xiàn)隨即字母的產(chǎn)生。begin段利用了int10,其功能是設(shè)置屏幕顯示方式,靈活的利用int10豐富的指令功能,可以巧妙的設(shè)計出想要的程序來。int10中斷規(guī)定,dh和dl共同控制著字符輸出的位置,其中dh為字符輸出的行標,dl為字符輸出的列標,通過改變dh和dl的值,可以改變字符在命令符輸出屏幕上的位置;如果ah=09h時,則al=字符,bl則是控制著輸出的字符屬性或顏色;計數(shù)器cx中存放的則是重復(fù)輸出字符的個數(shù)。3.2.3字母落下模塊程序進入打字功能,自動落下字母
12、,等待鍵盤輸入字符,以此來判斷輸入者想什么,如果鍵盤輸入與預(yù)期的相符合則程序自動執(zhí)行相關(guān)功能。如果輸入字符與落下字符相同,程序執(zhí)行當前字母消失和產(chǎn)生下一落下字母的功能,字母落下功能的實現(xiàn)是通過逐行替換的方法實現(xiàn)的,字母在當前行出現(xiàn)會有一個延遲時間,當過了這個延遲時間時,程序執(zhí)行當前位置清空操作,并在下一行顯示上一行的字母。代碼如下:hit: mov ah,02h ; 在光標位置顯示字符和屬性 mov bh,00h mov dh,01h mov dl,present_position int 10h mov al,di ; 出現(xiàn)下一個新字母的數(shù)法 add al,7 cmp al,7ah ja c
13、onvey_letter mov ah,0ah mov bh,00h mov cx,01h int 10h mov di,al add letter_counter,01h jmp nextcycle convey_letter: sub al,7ah add al,61h mov ah,0ah mov bh,00h mov cx,01h int 10h mov di,al add letter_counter,01h jmp nextcycle clear_screen 01,01,23,78 mov ah,02h mov bh,00h mov dh,11d mov dl,20d int 1
14、0h inc dh inc dh mov ah,02h mov bh,00h int 10hdisappear: ;擊中字母后輸出空格 pop cx pop cx mov ah,0ah mov al, mov bh,00h mov cx,01h int 10h jmp hit 3.2.4暫停模塊如果輸入空格,則程序執(zhí)行暫停功能,暫停功能的實現(xiàn)是通過以下方法實現(xiàn)的:當從鍵盤輸入空格時,程序收到暫停信號,執(zhí)行跳轉(zhuǎn),跳轉(zhuǎn)到一個死循環(huán)模塊,就是無限顯示當前屏幕,不做其他任何操作,直到鍵盤再次輸入空格時,程序收到暫停結(jié)束指令,跳轉(zhuǎn)回到主程序模塊,繼續(xù)執(zhí)行主模塊的功能。代碼如下:pass: pop cx
15、inc cx cmp cx,speed je print jmp out_cyclepause: push dx ;宏定義暫停處理 mov ah,06h mov dl,0ffh int 21h pop dx cmp al, jne pause jmp pass3.2.5返回主界面模塊如果鍵盤輸入esc,程序結(jié)束當前運行,返回到程序的主界面,然后等待主界面中鍵盤的輸入,這又跳回到主界面模塊。相關(guān)代碼包含在3.2.1主界面功能代碼段當中。4程序調(diào)試4.1 運行界面分析程序運行后的主界面如圖4-1,主界面第一行是歡迎語,第二行為程序制作的日期。接下來是操作說明。圖4-1 程序主界面當用戶按下ente
16、r鍵時,程序自動跳入到圖4-2的界面,字母隨機落下,用戶便可以開始打字練習(xí)了。練習(xí)只要按照說明來做就可以了。圖4-2 打字界面當用戶按下“q”鍵時,程序回到主界面如圖圖4-1,當用戶按下的既不是entry,也不是“q”鍵時,程序仍然保留在主界面,如圖圖4-3。圖4-3 按下非entry、非“q”界面 當鍵盤輸入字母與屏幕落下字母相同時,字母消失;不相同時,字母沒有消失,直到碰到下面“地面”。 打字過程按下空格鍵,則打字練習(xí)暫停,對其他鍵無反應(yīng),再次按下空格鍵,又恢復(fù)打字練習(xí)。4.2 調(diào)試過程及分析 開始在網(wǎng)上找到的源程序代碼能夠滿足題目的大多數(shù)要求,但是在主界面按下除entry以外的任何鍵時,
17、程序都會退出來,在源程序中找到對應(yīng)的退出語句時,發(fā)現(xiàn)判斷退出的分支語句沒起到作用,后來根據(jù)流程圖,合理地調(diào)整了一下退出語句中的分支結(jié)構(gòu),調(diào)試后,程序能夠?qū)崿F(xiàn)在主界面按下“q”鍵退出打字練習(xí)程序的功能。 當程序正在運行時,如果之前已按下空格鍵暫停,則此時按下esc退不出去,必須再次按下空格讓程序開始運行才能退出。這是因為按下空格鍵時,程序跳轉(zhuǎn)到一個死循環(huán)模塊,無限顯示當前屏幕,直到鍵盤再次輸入空格。5心得體會5.1 設(shè)計體會課程設(shè)計對我們多數(shù)初學(xué)匯編的學(xué)生來說,確實是一座高峰。翻越他是需付出努力的。我也是在探索了好久才弄明白一點點皮毛,在此做個小總結(jié),也許對自己今后的學(xué)習(xí)有些借鑒作用。在整個程序
18、的編寫中,調(diào)試占了很大部分的時間,要想寫好匯編程序,必須認真對待代碼的每一個細節(jié)。通過這次實際動手能力的培養(yǎng),我進一步熟悉了匯編的結(jié)構(gòu)和使用法,基本達到了借助工具資料,能獨立閱讀較長的程序代碼。我覺得學(xué)習(xí)匯編的一個較大好處就是可以了解電腦中每一個字節(jié)數(shù)據(jù)的來龍去脈,我覺得學(xué)習(xí)匯編可以發(fā)揮一下自己的空間想象力。通過這次課程設(shè)計,我也掌握了不少在互聯(lián)網(wǎng)上搜索程序源代碼的方法。5.2 系統(tǒng)改進這次課程設(shè)計,其主題內(nèi)容都以滿足課程實際的要求,各功能都能相應(yīng)的完成,即寫一個程序,運行可執(zhí)行程序后,出現(xiàn)主界面,按回車鍵出現(xiàn)由26個字母組成的亂序行,這時其中任一字母落下,在鍵盤上敲入該字母,如果輸入正確,字
19、母消失;按回車鍵進入打字練習(xí);按esc鍵返回主界面;按空格鍵暫停;按q退出,但是感覺整個程序界面不夠細致,不夠人性化,如果自己時間充裕,相信可以將界面做得更好一些。參考文獻1彭虎.微機原理與接口技術(shù).北京:電子工業(yè)出版社,20082王爽.匯編語言.清華大學(xué)出版社,20083沈美明.ibmpc匯編語言程序設(shè)計.清華大學(xué)出版社,20084任向民.匯編語言程序設(shè)計實用教程.清華大學(xué)出版社,20095朱耀庭.匯編語言程序設(shè)計.清華大學(xué)出版社,2009附錄程序清單:init_game macro op1,op2,op3,op4,op5,op6 mov cx,00h mov dh,op1 mov dl,o
20、p2op6:mov ah,02h ;定義操作數(shù)op6 mov bh,00h int 10h push cx mov ah,0ah mov al,op3 mov bh,00h mov cx,01h int 10h pop cx inc cx inc op4 cmp cx,op5 jne op6 endmclear_screen macro op1,op2,op3,op4 ;清屏宏定義 mov ah,06h mov al,00h mov bh,07h mov ch,op1 mov cl,op2 mov dh,op3 mov dl,op4 int 10h mov ah,02h mov bh,00h
21、mov dh,00h mov dl,00h int 10hendmmenu macro op1,op2,op3 ;菜單顯示宏定義 mov ah,02h mov bh,00h mov dh,op1 mov dl,op2 int 10h mov ah,09h lea dx,op3 int 21hendmdata segment ;使用數(shù)據(jù)段存儲字符zk db welcome to play this game!$ no db date:2010/01/10$meg db press enter key to continue.$meg1 db when a letter is dropping,p
22、lease hit it!$meg2 db press space key to pause!$meg3 db press esc key to return main interface!$meg4 db press letter q to exit!$speed dw 600d letters db dyqfbjwmilzoeucgpravskntxh db nxlsvxrmofzhgaebudjqiytpkw db oexrphysfqtvdcgljukdanwimzletters_bak db dyqfbjwmilzoeucgpravskntxh db nxlsvxrmofzhgaeb
23、udjqiytpkw db oexrphysfqtvdcgljukdanwimz ;定義待“下落”的字符letter_counter db 0 life_flag db 78 dup(0)position_flag db 78 dup(0) present_position db 1 data endsstack segment para stack stack db 64 dup(0)stack endscode segment main proc far assume cs:code,ds:data,ss:stack start: mov ax,data ;字符移動段 mov ds,ax
24、mov letter_counter,00h mov present_position,1 lea si,position_flag mov ah,00h mov cx,00hinit_postion_flag: ;字符位置 mov si,ah inc si inc cx cmp cx,78d jne init_postion_flag ;跳轉(zhuǎn)字符位置 lea di,letters lea si,letters_bak mov cx,00hinit_letters: ;更換字符 mov ah,si mov di,ah inc si inc di inc cx cmp cx,78d jne in
25、it_letters mov ah,00h lea si,life_flag mov cx,00hinit_life_flag: mov si,ah inc si inc cx cmp cx,78d jne init_life_flag mov cx,00h mov ah,01h or ch,00010000b int 10hclear_screen 00d,00d,24d,79d ;清屏宏定義 init_game 00d,00d,0ah,dl,80d,nextsign1 init_game 24d,00d,0ah,dl,80d,nextsign2 init_game 00d,00d,0ah,
26、dh,25d,nextsign3 init_game 00d,79d,0ah,dh,25d,nextsign4 menu 05d,15d,zk ;菜單信息的宏調(diào)用 menu 07h,15d,no menu 09d,15d,meg menu 11d,15d,meg1 menu 13d,15d,meg2 menu 15d,15d,meg3 menu 17d,15d,meg4 put: mov ah,02h ;設(shè)置光標位置 mov bh,00h mov dh,22d mov dl,33d int 10h mov ah,01h ;從鍵盤輸入任意字符 int 21h cmp al,0dh je spee
27、d3 ;輸入為entry進入打字練習(xí) cmp al,51h jne put ;輸入為“q”退出程序 mov ah,4ch int 21h mov speed,ax jmp begin begin: clear_screen 01d,01d,23d,78d ;清屏宏調(diào)用 clear_screen 01d,01d,23d,78d init_game 23d,01d,01h,dl,78d,nextsign5 mov ah,02h mov bh,00h mov dh,01h mov dl,01h int 10h mov cx,00h lea si,lettersnextletter: mov ah,0
28、2h ;顯示字母 mov dl,si int 21h inc si inc cx cmp cx,78d je nextcycle jmp nextletterfrom_front: sub present_position,78d jmp gobackto_sifind_zero: cmp letter_counter,78d je recycle cmp present_position,78d je from_one mov ah,00h nextsi: add present_position,01h inc si cmp si,ah je gobackto_di cmp present
29、_position,78d je from_one jmp nextsifrom_one:mov present_position,01h jmp gobackto_si recycle:mov letter_counter,00h ;字符循環(huán) mov present_position,01d lea si,position_flag mov cx,00h mov ah,00hclearsi: mov si,ah inc cx cmp cx,78d je nextcycle inc si jmp clearsinextcycle: lea di,letters lea si,position_
30、flag add present_position,31d cmp present_position,78 ja from_frontgobackto_si: add si,word ptr present_position dec si mov ah,si cmp ah,01h je find_zerogobackto_di: mov ah,01h mov si,ah add di,word ptr present_position dec di mov dl,present_position mov ah,02h mov bh,00h mov dh,01h int 10h mov cx,0
31、0hnextrow: push cx mov cx,00hout_cycle: ; 延遲 push cx mov cx,00hin_cycle: add cx,01h cmp cx,1000 jne in_cycle push dx mov ah,06h ;從鍵盤輸入字符 mov dl,0ffh int 21h pop dx jz pass cmp al,1bh ;如果鍵入esc,則返回主菜單 je to_start1 cmp al, ;如果鍵入space,則游戲暫停 je pause cmp al,di ;輸入字母正確,則字母消失 je disappearpass: pop cx inc c
32、x cmp cx,speed je print jmp out_cyclepause: push dx ;宏定義暫停處理 mov ah,06h mov dl,0ffh int 21h pop dx cmp al, jne pause jmp passto_start1: ;返回主菜單 jmp startprint: ;顯示字符 mov ah,0ah ;在當前光標位置寫空格 mov al, mov bh,00h mov cx,01h int 10h inc dh mov ah,02h ;改變光標位置 mov bh,00h int 10h mov ah,0ah ;在當前光標位置寫字母 mov al,di mov bh,00h mov cx,01h int 10h pop cx inc cx cmp cx,21d je print_next_letter jmp nextrow ;下一行disappear: ;擊中字母后輸出空格 pop cx pop cx mov ah,0ah mov al, mov bh,00h mov cx,01h int 10h jmp hit
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房地產(chǎn)開發(fā)合作協(xié)議合同
- 三農(nóng)田改造方案設(shè)計指南
- 建筑木工分包合同
- 上海聲屏障施工方案
- 防水安全生產(chǎn)施工方案
- pvc地板膠施工方案
- 燜渣坑施工方案
- 余姚耐磨地坪施工方案
- 自建房水泥欄桿施工方案
- 青島市eps線條施工方案
- 煙草專賣法知識考試題庫500題(含答案)
- 旅游政策法規(guī)教案
- 《動物王國開大會》預(yù)學(xué)單
- 鋼結(jié)構(gòu)安全交底
- 中國移動《下一代全光骨干傳送網(wǎng)白皮書》
- 川教版六年級《生命.生態(tài).安全》下冊第1課《我們的閑暇時光》課件
- 2024年社區(qū)工作者考試必背1000題題庫含必背答案
- 心理危機干預(yù)指導(dǎo)手冊
- 抖音:短視頻與直播運營全套教學(xué)課件
- 部編小學(xué)語文單元作業(yè)設(shè)計二年級下冊第七單元
- 2024成人肥胖食養(yǎng)指南(完整版)
評論
0/150
提交評論