版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 匯編語言課程實習報告實習題目 打字游戲學生姓名 班級 計科1093班 院系 信息學院 指導老師 提交時間 成績目 錄1 課程實習任務 12 基本知識.1 2.1 匯編語言程序結構2 2.2 關鍵指令分析2 2.3 匯編語言上機過程33 總體分析.3 3.1 程序功能分析3 3.2 主程序流程圖44 詳細設計.5 4.1 菜單模塊5 4.2 輸入模塊5 4.3 游戲模塊6 4.4 游戲結束模塊6 4.5 速度設置模塊.65 代碼實現(xiàn).75.1 主程序代碼.75.25. 11部分子程序代碼.85.12 延時子程序代碼.145.13 字母下降子程序.155.14產生新字母子程序代碼.165.17游
2、戲邏輯子程序代碼.175.18其他各子程序模塊.186 調試過程.197 使用說明.208 總結.209 參考文獻 .201. 課程實習任務設計題目:打字游戲基本功能:1.在屏幕上顯示菜單界面;2.按回車鍵出現(xiàn)由26個字母組成的亂序行;3.其中任一字母落下,在鍵盤上敲入該字母,如果輸入正確,字母消失;4.按空格鍵停止,按esc鍵返回主菜單,按q鍵退出程序。用匯編語言編寫,完成設計報告。2. 基本知識本次設計用的匯編語言基本知識如下:2.1匯編語言程序結構主體程序結構框架data segment data endscode segment assume cs:code, ds:data, es:
3、extrastart: mov ax, data mov ds, ax call * mov ax, 4c00h int 21h code ends end start子程序結構框架name proc farname endp宏定義結構框架name macro <參數(shù)> endm2.2. 關鍵指令的分析本次設計主要用到算術指令,邏輯指令,控制轉移指令等如loop指令,用于循環(huán)執(zhí)行某條或者某塊指令集直到默認的參數(shù)(cx)為零,退出循環(huán),執(zhí)行l(wèi)oop循環(huán)下的下一條指令。jmp無條件跳轉指令,跳轉到一個指定的標號位置。條件轉移指令jz / jnz 、 je / jne等等,用于判斷相應的
4、標志位是否滿足條件,若滿足則跳轉,不滿足就繼續(xù)往下一條指令執(zhí)行。 cmp比較指令,用于比較兩個數(shù)的大小,設置標志位,通常和條件跳轉指令關聯(lián)用。 call 調用指令,用于調用子程序int中斷指令,用于中斷操作此外,還有其他的一些指令,比如說加法add指令,減法指令等,本次設計用到了大量的指令。2.3匯編語言上機過程a:建立匯編源程序b:編譯目標文件(即:編譯為.obj .lst .crf文件)c:編譯不通過,重新修改d:連接為可執(zhí)行文件e:運行編譯好的可執(zhí)行文件f:用調試工具調試3. 總體分析3.1程序功能分析本次設計的是打字游戲,因此,在屏幕落下字母,輸入字母,并且判斷輸入字母和落下來的字母是
5、否相同,如果相同,則字母消失,否則字母下落到屏幕底部消失。其具體功能如下:1.按回車鍵進入游戲,esc鍵退出2.進入速度選擇界面,h鍵高速,l鍵低速,s鍵重新設置速度,其他鍵默認為普通速度其他鍵(包括回車鍵)3.若進入速度設置界面,輸入1-999的數(shù),表示速度為普通速度的百分之幾4.游戲中按esc退出,同時顯示游戲總共出現(xiàn)字符數(shù),所得分數(shù),同時提示游戲是否重新開始,y返回主界面,n退出5.游戲過程中按space鍵暫停,再次按space鍵繼續(xù)進行游戲3.2 主程序流程圖調用子程序init初始化主界面開始調用playgame子程序進入游戲調用setiterface設置游戲界面調用speedchoo
6、se子程序選擇速度調用isrestart子程序是否回到主界面ax=0?al=0?退出是否否是4. 詳細設計4.1菜單模塊打開軟件,進入的是菜單界面模塊,如上圖,有兩種選擇,按enter鍵進入游戲,按esc鍵退出進入程序。 4.2 速度選擇模塊選擇enter進入游戲,那么首先選擇設置游戲的速度,有三種可供選擇,還可以設置適合自己的速度。 4.3 游戲模塊進入游戲,可以開始游戲,一次落下一個字母,當鍵入一個字母正確時,字母消失,不然待字母落到底端,顯示字母。字母的不同的位置有不同的顯示顏色,在前1/3為綠色,在中間的1/3為紅色,在最后1/3為紅色。在游戲過程中,可以按esc鍵退出游戲,按spac
7、e鍵暫停游戲,再次按space的時候繼續(xù)游戲。4.4游戲結束模塊要退出游戲時,會顯示一共落下的字母數(shù),和玩家擊中的字母數(shù),還提示信息,是否返回主界面,如果鍵入y,則返回,n則直接退出程序4.5設置游戲速度模塊在這里,你可以設置適合自己的速度,如圖輸入了789,則以普通速度的8倍進行游戲。5. 代碼實現(xiàn)5.1 主程序代碼mov ax, data mov ds, ax mov es, axrestart: call init cmp ax,0 je lexit ;如果退出 call speedchoose call setinterface lgettime: call playgames cmp
8、 al,0;是否有結束標志 jne lgettime lendgame: call gameover call isrestart cmp al,0 je lexit ;如果退出 mov bx,restart jmp bx;重新開始開始dxßalx加上30h調用21h中斷輸出返回lexit: mov ax, 4c00h int 21h 5.2輸出單個數(shù)字子程序代碼outnum proc near ;入口參數(shù):ax,傳遞ax的值給dx的低八位dl以便輸出 mov dx,ax or dl,30h mov ah,02h int 21h retoutnum endp5.3;計算數(shù)字位數(shù)子程序
9、countnum proc near ;入口參數(shù):ax,傳遞要輸出的分數(shù) mov cx,1;計算輸出位數(shù) cmp ax,10 jl lendcount inc cx cmp ax,100 jl lendcount inc cx cmp ax,1000 jl lendcount inc cx cmp ax,10000 jl lendcount inc cx ;保存在cxlendcount: ret countnum endp ;出口參數(shù):cx,保存數(shù)字位數(shù)5.4輸出數(shù)字子程序coutnum proc near ;入口參數(shù):cx,call countnum后傳遞數(shù)字位數(shù) push ax call
10、countnum ;計算數(shù)字位數(shù) pop ax cmp cx,5 ;5位數(shù)字 jl lsmlth1 mov bx,10000 xor dx,dx div bx push dx call outnum;顯示萬位數(shù)字 pop ax lsmlth1:;千位數(shù)字 cmp cx,4 ;4位數(shù)字 jl lsmallhun1 xor dx,dx mov bx,1000 div bx push dx ;余數(shù) call outnum ;顯示千位數(shù)字 pop ax lsmallhun1: ;顯示百位數(shù)字 ; cmp ax,100 cmp cx,3 ;3位數(shù)字 jl lsmallten1 mov bl,100 di
11、v bl push ax call outnum ;顯示百位 pop ax mov al,ah xor ah,ah ;al和ax中放的數(shù)一樣大小 lsmallten1: ;顯示十位數(shù)字 cmp cx,2 ;3位數(shù)字 jl lsmallone1 mov bl,10 div bl push ax call outnum ;顯示十位 pop ax mov al,ah xor ah,ah ;al和ax中放的數(shù)一樣大小 lsmallone1:;顯示個位數(shù)字 call outnum retcoutnum endp 5.5游戲結束模塊gameover proc near ; ;游戲結束界面設置和分數(shù)顯示 c
12、lear_screen 0,0,24,79,10011111b ;藍色背景白色前景界面 ;-總共字符數(shù),total menu 07,20,score_msg1 mov ax,total call countnum ;計算數(shù)字位數(shù),出口參數(shù)在cx中 mov bl,52 ; add bl,cl ;計算數(shù)字輸出的列坐標后面緊跟chars輸出 push bx clear_screen 07,52,07,bl,10011100b ;分數(shù)處顏色為紅色 curse 07,52 mov ax,total call coutnum ;輸出數(shù)字 pop bx inc bl menu 07,bl,score_msg
13、2 ;用到上面的bl ;-score ;擊中的字符數(shù) menu 09,20,score_msg3 mov ax,score call countnum ;計算數(shù)字位數(shù),返回值在cx中 mov bl,33 add bl,cl ;列坐標后面緊跟分數(shù)score的輸出 push bx clear_screen 09,33,09,bl,10011100b ;分數(shù)處顏色為紅色 curse 09,33 mov ax,score call coutnum ;輸出數(shù)字 pop bx inc bl menu 09,bl,score_msg2 ;- call countnum ;計算數(shù)字位數(shù),返回值在cx中 mov
14、 bl,53 add bl,cl ;列坐標 push bx clear_screen 11,53,11,bl,10011100b ;分數(shù)處顏色為紅色 pop bx inc bl menu 12,20,restart_msg ;顯示是否重新開始 menu 14,20,restart_msg1 curse 14,48legame: ret gameover endp ;開始調用光標設置宏輸入值清除cx=輸入個數(shù)輸入并判斷是否合法al=al*10返回cx=0 ?ax= 0 ?否是是否否是speednum=ax56返回主菜單模塊isrestart proc near;判斷程序是否繼續(xù)recin: ;重
15、新輸入curse 14,51 mov ah,02h mov dl,' ' int 21h curse 14,47 lea dx,char_yn mov ah,0ah int 21h mov al,char_yn2 or al,20h cmp al,'y' jne isno mov al,1 jmp endre isno: cmp al,'n' jne recin xor al,alendre: ret isrestart endp ;出口參數(shù):al,傳遞值在主程序是否退出,0為退出5.7輸入速度模塊cinnum proc near lrecin:
16、 curse 13,27 ;清除輸入垃圾值 mov cx,3 mov ah,02h lcout: mov dl,' ' 輸入速度設子程序- int 21h loop lcout ;輸入字符串 curse 13,27 lea dx,numchar mov ah,0ah int 21h xor cx,cx mov cl,numchar1 ;輸入數(shù)字個數(shù) lea si,numchar2 ;輸入的最高位數(shù)字的偏移地址 xor ax,ax ;輸入數(shù)字大小 mov bl,10 ;乘10再加數(shù) l11: ;判斷輸入是否合法 mov dl,si cmp dl,'0' jl lr
17、ecin cmp dl,'9' jg lrecin ;乘10再加數(shù) mul bl sub dl,'0' xor dh,dh add ax,dx ;加上新數(shù) inc si loop l11 cmp ax,0 je lrecin mov speednum,ax;速度值 ret cinnum endp 5.8設置速度與其界面模塊setspeed proc near clear_screen 0,0,24,79,10011111b ;藍色背景白色前景界面 menu 9,20,set_msg1 menu 11,20,set_msg2 menu 13,20,set_msg3
18、 menu 13,30,set_msg4 call cinnum ;輸入數(shù)字 ret setspeed endp 5.9設置游戲界面模塊setinterface proc near clear_screen 0,0,0,79,11111101b;分數(shù)為暗紅色 clear_screen 1,0,8,79,11111010b ;上1/3為綠色 clear_screen 9,0,16,79,11111001b ;上1/3為黃色 clear_screen 17,0,24,79,11111100b ;下1/3為紅色 menu 0,65,goal_msg ;顯示分數(shù)字符 retsetinterface e
19、ndp 5.10選擇速度界面speedchoose proc nearclear_screen 0d,00d,24d,79d,10011111b menu 07,18,speed_msg1 menu 09,24,speed_msg2 menu 11,24,speed_msg3 menu 13,24,speed_msg4 menu 15,24,speed_msg5 curse 07,46 mov ispeed,1 ;默認普通速度 mov bset,0 ;默認沒有設置速度 mov ah,01h int 21h or al,20h ;轉為小寫 cmp al,'s' jne lnext
20、s mov bset,1 call setspeed ;設置速度 jmp lendchoose lnexts: cmp al,'h' jne lisslow mov ispeed,2 jmp lendchoose lisslow:cmp al,'l' jne lendchoose mov ispeed,0 lendchoose: ret speedchoose endp5.11初始化界面模塊init proc near mov letter_y,1 ;初始化y坐標 mov letter_x,0 ;初始化x坐標 mov score,0 ;初始化分數(shù),總字符數(shù) mo
21、v total,0 ;,總字符數(shù) mov bset,0 ;默認沒有設置速度 mov blife,0 ;生命置空 mov ispeed,1 ;速度置為普通 clear_screen 0d,00d,24d,79d,10011111b;主菜單界面為藍色背景,白色前景 menu 05,18,menu0 ;菜單信息的宏調用 menu 08,25,menu1 menu 10,25,menu3 menu 13,18,menu40 menu 23,48,designers curse 12,42 choose: ;輸入是否進入游戲 mov bx,0; mov ah,07h int 21h cmp al,0dh
22、 ;是否進入游戲 jne sec_judge inc bx cmp bx,1 ;如果進入游戲不用判斷是否退出 jz lendi sec_judge: cmp al,27;不進入游戲,是否退出 je lendi jmp choose;不允許非法輸入 lendi: push bx;將bx的值給ax,便于主程序判斷是否進入游戲 pop ax retinit endp 5.12延時子程序模塊delay proc near ;延時子程序 pushreg ;速度比例越高,延時越?。ㄑ訒r=普通延時/比例) cmp bset,0 je lnotset ;沒有設置速度 xor dx,dx mov ax,1600
23、0 ; mov bx,speednum ;除以比例 div bx ;乘100系數(shù)放內層循環(huán),防止ax越界 mov cx,ax ;->(16000/比例)*10*1000,16000為普通速度值 jmp l1lnotset: mov cx,6000 ;快速 cmp ispeed,2 ;選擇快速 6000*10*1000 je l1 add cx,10000 ;普通 (10000+6000)*10)*1000 cmp ispeed,1 je l1 add cx,20000 ;慢速 (20000+6000)*10*1000l1: ;-第一層- mov ax,cx ;用ax先存放cx的值,第一層
24、 ;= mov cx,10 ;第二層 cmp bset,0 je l12 ;沒有設置速度的情況下 add cx,990 ;相當于從10 *100到了1000 l12: push cx ;先把第二層的cx壓棧 ;* mov cx,1000 ;第三層,不設置速度的情況下循環(huán)一萬次, ldelay: nop loop ldelay ;第三層循環(huán)結束 ;* pop cx ;第二層循環(huán)繼續(xù)loop l12 ;= mov cx,ax ;恢復第一層循環(huán)的cx loop l1 ;第一層循 ;- popreg ret delay endp5.13字母下降模塊letterdown proc near mov ch
25、,letter_y mov cl,letter_x mov dl,' ' call lettershow inc letter_y ;下降一格 mov al,0 cmp blife,0 ;生命值為0 jne lnext1 inc allnext1: cmp letter_y,24 ;到達游戲界面底部 jl lnext2 inc allnext2: cmp al,0 ;是否該顯示新字母 jne lnewletter mov ch,letter_y ;字母下一行顯示 mov cl,letter_x mov dl,char call lettershow jmp lendown ln
26、ewletter: mov blife,1 inc total ;總字符數(shù)加1 call gennewpos mov ch,letter_y mov cl,letter_x mov dl,char call lettershow lendown: ret letterdown endp5.14產生新字母模塊gennewpos proc near mov letter_y,1 inc ch_index ;新字母的偏移量 cmp ch_index,ch_count ;是否到了字母數(shù)組邊界 jl lx mov ch_index,0 lx: inc x_index ;新x坐標 cmp x_index,
27、x_count ;是否到了xpos數(shù)組邊界 jl lngreater mov x_index,0 lngreater: mov bx,ch_index mov al,lettersbx ;新字母 mov char,al mov bx,x_index mov al,xposbx ;新位置 mov letter_x,al ret gennewpos endp5.15字母顯示模塊lettershow proc near pushreg mov dh,25 ;光標行 mov bh,0 ;光標頁 curse ch,cl mov ah,02h ;顯示字符 int 21h mov ah,02h mov dl
28、,80 ;光標列 int 10h curse 25,80 ;顯示完字母,馬上重置光標位置 popreg retlettershow endp5.16顯示四位數(shù)字模塊printscore proc near ;萬位數(shù)字 mov ax,score cmp ax,10000 jl lsmlth mov bx,10000 xor dx,dx div bx mov ax,dx ;萬位數(shù)字暫不顯示 lsmlth:;千位數(shù)字 cmp score,1000 jl lsmallhun xor dx,dx mov bx,1000 div bx push dx ;余數(shù) call outnum ;顯示千位數(shù)字 pop
29、 ax lsmallhun: ;顯示百位數(shù)字 mov bl,100 div bl push ax ;余數(shù) call outnum ;顯示百位數(shù)字 pop ax mov al,ah ;顯示個位和十位數(shù)字 call p ret printscore endp 5.17游戲模塊playgames proc near menu 00,00,tips cmp score,1000 jl lrightshow curse 0,76 ;顯示分數(shù) jmp lendsetpos lrightshow: curse 0,77 ;顯示分數(shù) lendsetpos: call printscore ;輸出分數(shù) mov
30、ah,0bh ;是否有字符輸入 int 21h inc al jne lnochar ;沒有字符 mov ah,07h int 21h cmp al,char ;是否和當前字符相同 jne lnothit mov blife,0 ;擊中當前字符 inc score jmp lnochar lnothit: cmp al,' ' jnz next mov cx,2stop:inc cx curse 0,64 mov ah,07h int 21h cmp al,' ' jz next cmp al,27 jz next loop stopnext: cmp al,2
31、7;esc 鍵退出 jne lnochar xor ax,ax jmp lendplay lnochar: call letterdown call delay mov ax,1lendplay: ret playgames endp5.18計算2位整數(shù)并輸出模塊p proc near mov ah,00h ;將al補充為ax mov bl,10 div bl mov bh,ah ;余數(shù)存入ah mov dl,al ;商存入al or dl,30h mov ah,02h int 21h mov dl,bh or dl,30h int 21h retp endp5.19各宏定義模塊pushreg
32、 macro;寄存器入棧push axpush bxpush cxpush dxendm popreg macro;寄存器出棧pop dx pop cx pop bx pop axendm curse macro cury,curx;設置光標宏pushreg mov ah,02h mov bh,00hmov dh,curymov dl,curxint 10hpopregendm clear_screen macro op1,op2,op3,op4,color ;清屏宏定義 pushreg mov ax,0600h mov bh,color mov ch,op1 mov cl,op2 mov dh,op3 mov d
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 職場溝通中的情緒管理技巧
- 食品企業(yè)安全生產事故綜合應急預案
- 工業(yè)環(huán)境下的安全教育及應急措施
- 兩人合作研發(fā)合同范本
- 事業(yè)單位臨時工勞動合同相關規(guī)定
- 二手車交易合同官方范本
- 個人業(yè)務合作合同版
- 二手房買賣合同模板全新版
- 專業(yè)育兒嫂勞動合同協(xié)議書范例
- 個人車輛抵押借款合同標準版
- 2024年高考真題-化學(重慶卷) 含解析
- 三甲醫(yī)院臨床試驗機構-31 V00 專業(yè)組備案及考核SOP
- 胞嘧啶化學合成
- 職業(yè)衛(wèi)生培訓課件
- 柴油墊資合同模板
- GB/T 44489-2024高級輔助駕駛地圖審查要求
- 2024-2030年中國體外除顫器行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 2024-2030年中國人力資源行業(yè)市場發(fā)展前瞻及投資戰(zhàn)略研究報告
- 2024-2030年中國樺樹汁行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 全冊(教案)外研版(一起)英語四年級下冊
- 偏差行為、卓越一生3.0版
評論
0/150
提交評論