打字游戲-匯編語言課程設(shè)計_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  匯編語言課程實習(xí)報告</p><p>  實習(xí)題目 打字游戲</p><p>  學(xué)生姓名 </p><p>  班級 計科1093班 </p><p>  院系 信息學(xué)院</p><p>  指導(dǎo)

2、老師 </p><p>  提交時間 </p><p><b>  成績</b></p><p><b>  目 錄</b></p><p>  1 課程實習(xí)任務(wù)……………………………………………………………………… 1</p><p

3、>  2 基本知識…………………………………………………………………………….1</p><p>  2.1 匯編語言程序結(jié)構(gòu)……………………………………………………………2</p><p>  2.2 關(guān)鍵指令分析…………………………………………………………………2</p><p>  2.3 匯編語言上機(jī)過程……………………………………………………

4、………3</p><p>  3 總體分析…………………………………………………………………………….3</p><p>  3.1 程序功能分析…………………………………………………………………3</p><p>  3.2 主程序流程圖…………………………………………………………………4</p><p>  4 詳細(xì)設(shè)計……………

5、……………………………………………………………….5</p><p>  4.1 菜單模塊………………………………………………………………………5</p><p>  4.2 輸入模塊………………………………………………………………………5</p><p>  4.3 游戲模塊………………………………………………………………………6</p>&l

6、t;p>  4.4 游戲結(jié)束模塊…………………………………………………………………6</p><p>  4.5 速度設(shè)置模塊………………………………………………………………....6</p><p>  5 代碼實現(xiàn)…………………………………………………………………………….7</p><p>  5.1 主程序代碼………………………………………………

7、……………………..7</p><p>  5.2~5. 11部分子程序代碼…………………………………………………………..8</p><p>  5.12 延時子程序代碼……………………………………………………………....14</p><p>  5.13 字母下降子程序……………………………………………………………....15</p><p

8、>  5.14產(chǎn)生新字母子程序代碼……………………………………………………….16</p><p>  5.17游戲邏輯子程序代碼………………………………………………………….17</p><p>  5.18其他各子程序模塊…………………………………………………………….18</p><p>  6 調(diào)試過程……………………………………………………………

9、……………...19</p><p>  7 使用說明…………………………………………………………………………...20</p><p>  8 總結(jié)………………………………………………………………………………...20</p><p>  9 參考文獻(xiàn)………………………………………………………………………… ..20</p><p&

10、gt;<b>  課程實習(xí)任務(wù)</b></p><p><b>  設(shè)計題目:打字游戲</b></p><p><b>  基本功能:</b></p><p>  1.在屏幕上顯示菜單界面;</p><p>  2.按回車鍵出現(xiàn)由26個字母組成的亂序行;</p>

11、<p>  3.其中任一字母落下,在鍵盤上敲入該字母,如果輸入正確,字母消失;</p><p>  4.按空格鍵停止,按ESC鍵返回主菜單,按q鍵退出程序。</p><p>  用匯編語言編寫,完成設(shè)計報告。</p><p><b>  基本知識</b></p><p>  本次設(shè)計用的匯編語言基本知識如下:&

12、lt;/p><p>  2.1匯編語言程序結(jié)構(gòu)</p><p><b>  主體程序結(jié)構(gòu)框架</b></p><p>  data segment ……</p><p>  data ends</p><p>  code segment </p><

13、p>  assume cs:code, ds:data, es:extra</p><p><b>  start: </b></p><p>  mov ax, data</p><p>  mov ds, ax ……</p><p><b>  call ****</

14、b></p><p><b>  ……</b></p><p>  mov ax, 4c00h</p><p>  int 21h </p><p>  code ends</p><p>  end start</p><p><b

15、>  子程序結(jié)構(gòu)框架</b></p><p>  Name proc far</p><p><b>  ……</b></p><p><b>  Name endp</b></p><p><b>  宏定義結(jié)構(gòu)框架</b></p><p

16、>  Name macro <參數(shù)> </p><p><b>  ……</b></p><p><b>  Endm</b></p><p><b>  關(guān)鍵指令的分析</b></p><p>  本次設(shè)計主要用到算術(shù)指令,邏輯指令,控制轉(zhuǎn)移指令等</

17、p><p>  如loop指令,用于循環(huán)執(zhí)行某條或者某塊指令集直到默認(rèn)的參數(shù)(CX)為零,</p><p>  退出循環(huán),執(zhí)行l(wèi)oop循環(huán)下的下一條指令。</p><p>  Jmp無條件跳轉(zhuǎn)指令,跳轉(zhuǎn)到一個指定的標(biāo)號位置。</p><p>  條件轉(zhuǎn)移指令JZ / JNZ 、 JE / JNE等等,用于判斷相應(yīng)的標(biāo)志位是否滿足條件,若滿足則跳轉(zhuǎn)

18、,不滿足就繼續(xù)往下一條指令執(zhí)行。 </p><p>  CMP比較指令,用于比較兩個數(shù)的大小,設(shè)置標(biāo)志位,通常和條件跳轉(zhuǎn)指令關(guān)聯(lián)用。 </p><p>  CALL 調(diào)用指令,用于調(diào)用子程序</p><p>  Int中斷指令,用于中斷操作</p><p>  此外,還有其他的一些指令,比如說加法add指令,減法指令等,本次設(shè)計用到了大量的

19、指令。</p><p>  2.3匯編語言上機(jī)過程</p><p><b>  a:建立匯編源程序</b></p><p>  b:編譯目標(biāo)文件(即:編譯為.obj .lst .crf文件)</p><p>  c:編譯不通過,重新修改</p><p>  d:連接為可執(zhí)行文件</p>

20、<p>  e:運(yùn)行編譯好的可執(zhí)行文件</p><p><b>  f:用調(diào)試工具調(diào)試</b></p><p><b>  總體分析</b></p><p><b>  3.1程序功能分析</b></p><p>  本次設(shè)計的是打字游戲,因此,在屏幕落下字母,輸

21、入字母,并且判斷輸入字母和落下來的字母是否相同,如果相同,則字母消失,否則字母下落到屏幕底部消失。</p><p><b>  其具體功能如下:</b></p><p>  1.按回車鍵進(jìn)入游戲,ESC鍵退出</p><p>  2.進(jìn)入速度選擇界面,h鍵高速,l鍵低速,s鍵重新設(shè)置速度,其他鍵默認(rèn)為普通速度其他鍵(包括回車鍵)</p&g

22、t;<p>  3.若進(jìn)入速度設(shè)置界面,輸入1-999的數(shù),表示速度為普通速度的百分之幾</p><p>  4.游戲中按esc退出,同時顯示游戲總共出現(xiàn)字符數(shù),所得分?jǐn)?shù),同時提示游戲是否重新開始,y返回主界面,n退出</p><p>  5.游戲過程中按space鍵暫停,再次按space鍵繼續(xù)進(jìn)行游戲</p><p>  3.2 主程序流程圖<

23、;/p><p><b>  詳細(xì)設(shè)計</b></p><p><b>  4.1菜單模塊</b></p><p>  打開軟件,進(jìn)入的是菜單界面模塊,如上圖,有兩種選擇,按enter鍵進(jìn)入游戲,按ESC鍵退出進(jìn)入程序。</p><p>  4.2 速度選擇模塊</p><p>

24、  選擇enter進(jìn)入游戲,那么首先選擇設(shè)置游戲的速度,有三種可供選擇,還可以設(shè)置適合自己的速度。</p><p><b>  4.3 游戲模塊</b></p><p>  進(jìn)入游戲,可以開始游戲,一次落下一個字母,當(dāng)鍵入一個字母正確時,字母消失,不然待字母落到底端,顯示字母。字母的不同的位置有不同的顯示顏色,在前1/3為綠色,在中間的1/3為紅色,在最后1/3為紅色

25、。在游戲過程中,可以按esc鍵退出游戲,按space鍵暫停游戲,再次按space的時候繼續(xù)游戲。</p><p><b>  4.4游戲結(jié)束模塊</b></p><p>  要退出游戲時,會顯示一共落下的字母數(shù),和玩家擊中的字母數(shù),還提示信息,是否返回主界面,如果鍵入y,則返回,n則直接退出程序</p><p>  4.5設(shè)置游戲速度模塊<

26、;/p><p>  在這里,你可以設(shè)置適合自己的速度,如圖輸入了789,則以普通速度的8倍進(jìn)行游戲。</p><p><b>  代碼實現(xiàn)</b></p><p>  5.1 主程序代碼</p><p>  mov ax, data</p><p>  mov ds, ax</p>

27、<p>  mov es, ax</p><p>  RESTART: </p><p>  call Init </p><p>  cmp ax,0 </p><p>  je Lexit ;如果退出</p><p>  call SpeedChoose </p>&l

28、t;p>  call SetInterface </p><p><b>  LgetTime:</b></p><p>  call PlayGames</p><p>  cmp al,0;是否有結(jié)束標(biāo)志</p><p>  jne LgetTime </p><p>  L

29、endGame: </p><p>  call GameOver </p><p>  CALL IsRestart</p><p>  cmp al,0 </p><p>  je Lexit ;如果退出</p><p>  mov bx,RESTART</p><p>  jmp b

30、x;重新開始</p><p><b>  Lexit: </b></p><p>  mov ax, 4c00h </p><p>  int 21h </p><p>  5.2輸出單個數(shù)字子程序代碼</p><p>  outnum proc near ;入口參數(shù):ax,傳遞ax

31、的值給dx的低八位dl以便輸出</p><p><b>  mov dx,ax</b></p><p><b>  or dl,30h</b></p><p>  mov ah,02h</p><p><b>  int 21h</b></p><p>

32、<b>  ret</b></p><p>  outnum endp</p><p>  5.3;計算數(shù)字位數(shù)子程序</p><p>  CountNum proc near ;入口參數(shù):ax,傳遞要輸出的分?jǐn)?shù)</p><p>  mov cx,1;計算輸出位數(shù)</p><p><

33、b>  cmp ax,10</b></p><p>  jl LendCount</p><p><b>  inc cx</b></p><p>  cmp ax,100</p><p>  jl LendCount</p><p><b>  inc cx<

34、;/b></p><p>  cmp ax,1000</p><p>  jl LendCount</p><p><b>  inc cx </b></p><p>  cmp ax,10000</p><p>  jl LendCount</p><p>  

35、inc cx ;保存在cx</p><p>  Lendcount:</p><p><b>  ret </b></p><p>  CountNum endp ;出口參數(shù):cx,保存數(shù)字位數(shù)</p><p>  5.4輸出數(shù)字子程序</p><p>  CoutNum pro

36、c near ;入口參數(shù):cx,call CountNum后傳遞數(shù)字位數(shù)</p><p><b>  push ax</b></p><p>  call CountNum ;計算數(shù)字位數(shù)</p><p>  pop ax </p><p>  cmp cx,5 ;5位數(shù)字</p><

37、;p>  jl Lsmlth1 </p><p>  mov bx,10000</p><p><b>  xor dx,dx</b></p><p><b>  div bx</b></p><p><b>  push dx</b></p><p&

38、gt;  call outnum;顯示萬位數(shù)字</p><p><b>  pop ax</b></p><p>  Lsmlth1:;千位數(shù)字</p><p>  cmp cx,4 ;4位數(shù)字</p><p>  jl Lsmallhun1</p><p><b>  xor dx,d

39、x</b></p><p>  mov bx,1000</p><p><b>  div bx</b></p><p>  push dx ;余數(shù)</p><p>  call outnum ;顯示千位數(shù)字</p><p><b>  pop ax</b><

40、;/p><p>  Lsmallhun1: ;顯示百位數(shù)字</p><p>  ; cmp ax,100 </p><p>  cmp cx,3 ;3位數(shù)字</p><p>  jl Lsmallten1</p><p>  mov bl,100</p><p><b>  div

41、bl</b></p><p><b>  push ax</b></p><p>  call outnum ;顯示百位</p><p><b>  pop ax</b></p><p><b>  mov al,ah</b></p><p>

42、;  xor ah,ah ;al和ax中放的數(shù)一樣大小</p><p>  Lsmallten1: ;顯示十位數(shù)字</p><p>  cmp cx,2 ;3位數(shù)字</p><p>  jl Lsmallone1</p><p><b>  mov bl,10</b></p><p><

43、b>  div bl</b></p><p><b>  push ax</b></p><p>  call outnum ;顯示十位</p><p><b>  pop ax</b></p><p><b>  mov al,ah</b></p>

44、;<p>  xor ah,ah ;al和ax中放的數(shù)一樣大小 </p><p>  Lsmallone1:;顯示個位數(shù)字</p><p>  call outnum </p><p><b>  ret</b></p><p>  CoutNum endp </p><p>

45、;<b>  5.5游戲結(jié)束模塊</b></p><p>  GameOver proc near ; ;游戲結(jié)束界面設(shè)置和分?jǐn)?shù)顯示</p><p>  clear_screen 0,0,24,79,10011111b ;藍(lán)色背景白色前景界面 </p><p>  ;--------------------------總共字符數(shù),tota

46、l</p><p>  menu 07,20,score_msg1 </p><p>  mov ax,total</p><p>  call CountNum ;計算數(shù)字位數(shù),出口參數(shù)在cx中</p><p>  mov bl,52 ;</p><p>  add bl,cl ;計算數(shù)字輸出的列坐標(biāo)后面緊

47、跟chars輸出</p><p><b>  push bx</b></p><p>  clear_screen 07,52,07,bl,10011100b ;分?jǐn)?shù)處顏色為紅色</p><p>  curse 07,52</p><p>  mov ax,total </p><p>  cal

48、l CoutNum ;輸出數(shù)字</p><p><b>  pop bx</b></p><p>  inc bl </p><p>  menu 07,bl,score_msg2 ;用到上面的bl </p><p>  ;------------------score ;擊中的字符數(shù)<

49、;/p><p>  menu 09,20,score_msg3 </p><p>  mov ax,score</p><p>  call CountNum ;計算數(shù)字位數(shù),返回值在cx中 </p><p><b>  mov bl,33</b></p><p>  add bl,cl ;列坐標(biāo)后面

50、緊跟分?jǐn)?shù)score的輸出</p><p><b>  push bx</b></p><p>  clear_screen 09,33,09,bl,10011100b ;分?jǐn)?shù)處顏色為紅色</p><p>  curse 09,33</p><p>  mov ax,score</p><p>  

51、call CoutNum ;輸出數(shù)字</p><p><b>  pop bx </b></p><p><b>  inc bl </b></p><p>  menu 09,bl,score_msg2 </p><p>  ;------------------</p>

52、<p>  call CountNum ;計算數(shù)字位數(shù),返回值在cx中 </p><p><b>  mov bl,53</b></p><p>  add bl,cl ;列坐標(biāo)</p><p><b>  push bx</b></p><p>  clear_screen 11,53,

53、11,bl,10011100b ;分?jǐn)?shù)處顏色為紅色</p><p><b>  pop bx </b></p><p><b>  inc bl </b></p><p>  menu 12,20,restart_msg ;顯示是否重新開始</p><p>  menu 14,20,restar

54、t_msg1</p><p>  curse 14,48</p><p>  Legame: </p><p>  ret </p><p>  GameOver endp ;</p><p>  5.6返回主菜單模塊</p><p>  IsRestart proc nea

55、r;判斷程序是否繼續(xù)</p><p>  recin: ;重新輸入</p><p>  curse 14,51 </p><p>  mov ah,02h</p><p>  mov dl,' '</p><p><b>  int 21h </b></p><

56、p>  curse 14,47</p><p>  lea dx,char_yn</p><p>  mov ah,0ah</p><p>  int 21h </p><p>  mov al,char_yn[2]</p><p>  or al,20h</p><p>  cm

57、p al,'y'</p><p><b>  jne isno</b></p><p><b>  mov al,1</b></p><p>  jmp endre </p><p><b>  isno: </b></p><

58、p>  cmp al,'n' </p><p><b>  jne recin</b></p><p><b>  xor al,al</b></p><p><b>  endre:</b></p><p><b>  ret </b

59、></p><p>  isrestart endp ;出口參數(shù):al,傳遞值在主程序是否退出,0為退出</p><p><b>  5.7輸入速度模塊</b></p><p>  CinNum proc near </p><p><b>  LreCin:</b></p>

60、<p>  curse 13,27 </p><p><b>  ;清除輸入垃圾值</b></p><p><b>  mov cx,3</b></p><p>  mov ah,02h</p><p>  Lcout: mov dl,' '

61、 輸入速度設(shè)子程序-》</p><p><b>  int 21h</b></p><p>  loop Lcout </p><p><b>  ;輸入字符串</b></p><p>  curse 13,27 </p><p>  lea dx,numch

62、ar</p><p>  mov ah,0ah</p><p>  int 21h </p><p>  xor cx,cx </p><p>  mov cl,numchar[1] ;輸入數(shù)字個數(shù)</p><p>  lea si,numchar[2] ;輸入的最高位數(shù)字的偏移地址</p><

63、p>  xor ax,ax ;輸入數(shù)字大小</p><p>  mov bl,10 ;乘10再加數(shù)</p><p>  L11: ;判斷輸入是否合法</p><p>  mov dl,[si] </p><p>  cmp dl,'0'</p><p>  jl LreCin&l

64、t;/p><p>  cmp dl,'9'</p><p>  jg LreCin </p><p><b>  ;乘10再加數(shù)</b></p><p><b>  mul bl </b></p><p>  sub dl,'0'</p

65、><p>  xor dh,dh </p><p>  add ax,dx ;加上新數(shù)</p><p><b>  inc si</b></p><p><b>  loop L11</b></p><p><b>  cmp ax,0</b><

66、;/p><p><b>  je LreCin</b></p><p>  mov speednum,ax;速度值 </p><p><b>  ret </b></p><p>  Cinnum endp </p><p>  5.8設(shè)置速度與其界面模塊</p>

67、<p>  SetSpeed proc near</p><p>  clear_screen 0,0,24,79,10011111B ;藍(lán)色背景白色前景界面</p><p>  menu 9,20,set_msg1</p><p>  menu 11,20,set_msg2</p><p>  menu 13,20,set_m

68、sg3</p><p>  menu 13,30,set_msg4</p><p>  call CinNum ;輸入數(shù)字</p><p><b>  ret </b></p><p>  SetSpeed endp </p><p>  5.9設(shè)置游戲界面模塊</p>

69、<p>  SetInterface proc near </p><p>  clear_screen 0,0,0,79,11111101b;分?jǐn)?shù)為暗紅色</p><p>  clear_screen 1,0,8,79,11111010b ;上1/3為綠色</p><p>  clear_screen 9,0,16,79,11111001b ;上1/3

70、為黃色</p><p>  clear_screen 17,0,24,79,11111100b ;下1/3為紅色 </p><p>  menu 0,65,goal_msg ;顯示分?jǐn)?shù)字符</p><p><b>  ret</b></p><p>  SetInterface endp </p><

71、p>  5.10選擇速度界面</p><p>  SpeedChoose proc near</p><p>  clear_screen 0d,00d,24d,79d,10011111b </p><p>  menu 07,18,speed_msg1</p><p>  menu 09,24,speed_msg2</p>

72、;<p>  menu 11,24,speed_msg3</p><p>  menu 13,24,speed_msg4</p><p>  menu 15,24,speed_msg5</p><p>  curse 07,46 </p><p>  mov ispeed,1 ;默認(rèn)普通速度 </p><p&

73、gt;  mov bset,0 ;默認(rèn)沒有設(shè)置速度</p><p>  mov ah,01h</p><p><b>  int 21h </b></p><p>  or al,20h ;轉(zhuǎn)為小寫 </p><p>  cmp al,'s'</p><p>  jne L

74、nexts</p><p>  mov bset,1</p><p>  call Setspeed ;設(shè)置速度</p><p>  jmp LendChoose</p><p>  Lnexts: cmp al,'h'</p><p>  jne LisSlow</p><p&g

75、t;  mov ispeed,2</p><p>  jmp LendChoose </p><p>  LisSlow:cmp al,'l' </p><p>  jne LendChoose </p><p>  mov ispeed,0 </p><p>  LendChoose: re

76、t </p><p>  SpeedChoose endp</p><p>  5.11初始化界面模塊</p><p>  Init proc near</p><p>  mov letter_y,1 ;初始化y坐標(biāo)</p><p>  mov letter_x,0 ;初始化x坐標(biāo) </p>

77、<p>  mov score,0 ;初始化分?jǐn)?shù),總字符數(shù) </p><p>  mov total,0 ;,總字符數(shù)</p><p>  mov bset,0 ;默認(rèn)沒有設(shè)置速度</p><p>  mov blife,0 ;生命置空</p><p>  mov ispeed,1 ;速度置為普通 </p>

78、<p>  clear_screen 0d,00d,24d,79d,10011111b;主菜單界面為藍(lán)色背景,白色前景 </p><p>  menu 05,18,menu0 ;菜單信息的宏調(diào)用 </p><p>  menu 08,25,menu1 </p><p>  menu 10,25,menu3 </p><p>

79、  menu 13,18,menu40</p><p>  menu 23,48,designers</p><p>  curse 12,42 </p><p>  choose: ;輸入是否進(jìn)入游戲</p><p>  mov bx,0; </p><p>  mov ah,07h</p>

80、<p><b>  int 21h</b></p><p>  cmp al,0dh ;是否進(jìn)入游戲 </p><p>  jne sec_judge</p><p><b>  inc bx</b></p><p>  cmp bx,1 ;如果進(jìn)入游戲不用判斷是否退出</p

81、><p><b>  jz lendi</b></p><p>  sec_judge: </p><p>  cmp al,27;不進(jìn)入游戲,是否退出</p><p><b>  je lendi</b></p><p>  jmp choose;不允許非法輸入</p&g

82、t;<p><b>  Lendi:</b></p><p>  push bx;將bx的值給ax,便于主程序判斷是否進(jìn)入游戲 </p><p>  pop ax </p><p><b>  ret</b></p><p>  Init endp </p&g

83、t;<p>  5.12延時子程序模塊</p><p>  Delay proc near ;延時子程序 </p><p>  pushReg ;速度比例越高,延時越小(延時=普通延時/比例)</p><p>  cmp bset,0 </p><p>  je Lnotset ;沒有設(shè)置速度</p><

84、p><b>  xor dx,dx</b></p><p>  mov ax,16000 ;</p><p>  mov bx,speednum ;除以比例</p><p><b>  div bx </b></p><p>  ;乘100系數(shù)放內(nèi)層循環(huán),防止ax越界</p>

85、<p>  mov cx,ax ;-------------------------->(16000/比例)*10*1000,16000為普通速度值</p><p><b>  jmp L1</b></p><p>  Lnotset: </p><p>  mov cx,6000 ;快速

86、 </p><p>  cmp ispeed,2 ;選擇快速 6000*10*1000 </p><p><b>  je L1 </b></p><p>  add cx,10000 ;普通 (10000+6000)*10)*1000</p><p>  cmp

87、ispeed,1</p><p><b>  je L1 </b></p><p>  add cx,20000 ;慢速 (20000+6000)*10*1000</p><p><b>  L1: </b></p><p>  ;--------------第一層------------

88、---- </p><p>  mov ax,cx ;用ax先存放cx的值,第一層</p><p>  ;===========================================</p><p>  mov cx,10 ;第二層</p><p>  cmp bset,0</p><p>  je L

89、12 ;沒有設(shè)置速度的情況下</p><p>  add cx,990 ;相當(dāng)于從10 *100到了1000</p><p>  L12: push cx ;先把第二層的cx壓棧 </p><p>  ;*****************************************************</p><p> 

90、 mov cx,1000 ;第三層,不設(shè)置速度的情況下循環(huán)一萬次,</p><p>  Ldelay: nop </p><p>  loop Ldelay ;第三層循環(huán)結(jié)束</p><p>  ;****************************************************</p><p>  pop cx ;

91、第二層循環(huán)繼續(xù)</p><p><b>  loop L12 </b></p><p>  ;============================================ </p><p>  mov cx,ax ;恢復(fù)第一層循環(huán)的cx </p><p>  loop L1 ;第

92、一層循</p><p>  ;-------------------------------------- </p><p><b>  popReg</b></p><p><b>  ret </b></p><p>  Delay endp</p><p>  5.1

93、3字母下降模塊</p><p>  LetterDown proc near </p><p>  mov ch,letter_y</p><p>  mov cl,letter_x</p><p>  mov dl,' '</p><p>  call LetterShow</p>

94、<p>  inc letter_y ;下降一格</p><p><b>  mov al,0</b></p><p>  cmp blife,0 ;生命值為0</p><p>  jne Lnext1</p><p><b>  inc al</b></p><

95、p>  Lnext1: cmp letter_y,24 ;到達(dá)游戲界面底部</p><p><b>  jl Lnext2</b></p><p><b>  inc al</b></p><p><b>  Lnext2: </b></p><p>  cmp al,

96、0 ;是否該顯示新字母</p><p>  jne Lnewletter</p><p>  mov ch,letter_y ;字母下一行顯示</p><p>  mov cl,letter_x</p><p>  mov dl,char</p><p>  call LetterShow</p>&l

97、t;p>  jmp Lendown </p><p>  Lnewletter: </p><p>  mov blife,1</p><p>  inc total ;總字符數(shù)加1</p><p>  call GenNewPos</p><p>  mov ch,letter_y</p><

98、;p>  mov cl,letter_x</p><p>  mov dl,char</p><p>  call LetterShow </p><p>  Lendown: </p><p><b>  ret </b></p><p>  LetterDown

99、 endp</p><p>  5.14產(chǎn)生新字母模塊</p><p>  GenNewPos proc near </p><p>  mov letter_y,1 </p><p>  inc ch_index ;新字母的偏移量 </p><p>  cmp ch_index,ch_count ;是否到了

100、字母數(shù)組邊界</p><p><b>  jl Lx </b></p><p>  mov ch_index,0 </p><p>  Lx: inc x_index ;新x坐標(biāo) </p><p>  cmp x_index,x_count ;是否到了xpos數(shù)組邊界</p><p>

101、  jl Lngreater </p><p>  mov x_index,0</p><p>  Lngreater: </p><p>  mov bx,ch_index </p><p>  mov al,letters[bx] ;新字母</p><p>  mov char,al </p>

102、<p>  mov bx,x_index</p><p>  mov al,xpos[bx] ;新位置</p><p>  mov letter_x,al</p><p><b>  ret </b></p><p>  GenNewPos endp</p><p>  5.15字母

103、顯示模塊</p><p>  LetterShow proc near</p><p>  pushReg </p><p>  mov dh,25 ;光標(biāo)行</p><p>  mov bh,0 ;光標(biāo)頁 </p><p>  curse ch,cl </p><p>  mo

104、v ah,02h ;顯示字符</p><p>  int 21h </p><p>  mov ah,02h</p><p>  mov dl,80 ;光標(biāo)列</p><p><b>  int 10h</b></p><p>  curse 25,80 ;顯示完字母,馬上重置光標(biāo)位

105、置</p><p><b>  popReg</b></p><p><b>  ret</b></p><p>  LetterShow endp</p><p>  5.16顯示四位數(shù)字模塊</p><p>  PrintScore proc near </p&g

106、t;<p><b>  ;萬位數(shù)字 </b></p><p>  mov ax,score</p><p>  cmp ax,10000</p><p>  jl Lsmlth </p><p>  mov bx,10000</p><p><b>  xor dx,

107、dx</b></p><p><b>  div bx</b></p><p>  mov ax,dx </p><p><b>  ;萬位數(shù)字暫不顯示</b></p><p>  Lsmlth:;千位數(shù)字 </p><p>  cmp score,1000<

108、;/p><p>  jl Lsmallhun</p><p><b>  xor dx,dx</b></p><p>  mov bx,1000</p><p><b>  div bx</b></p><p>  push dx ;余數(shù)</p><p>

109、  call outnum ;顯示千位數(shù)字</p><p>  pop ax </p><p>  Lsmallhun: ;顯示百位數(shù)字</p><p>  mov bl,100</p><p><b>  div bl</b></p><p>  push ax ;余數(shù)</p&

110、gt;<p>  call outnum ;顯示百位數(shù)字</p><p><b>  pop ax</b></p><p><b>  mov al,ah</b></p><p>  ;顯示個位和十位數(shù)字</p><p><b>  call p </b>&l

111、t;/p><p><b>  ret </b></p><p>  PrintScore endp </p><p><b>  5.17游戲模塊</b></p><p>  PlayGames Proc near</p><p>  menu 00,00,tips&l

112、t;/p><p>  cmp score,1000</p><p>  jl Lrightshow </p><p>  curse 0,76 ;顯示分?jǐn)?shù) </p><p>  jmp Lendsetpos</p><p>  Lrightshow:</p><p>  curse 0,77 ;顯

113、示分?jǐn)?shù)</p><p>  Lendsetpos: </p><p>  call PrintScore ;輸出分?jǐn)?shù) </p><p>  mov ah,0bh ;是否有字符輸入</p><p><b>  int 21h</b></p><p>  inc al </p>

114、<p>  jne Lnochar ;沒有字符</p><p>  mov ah,07h</p><p>  int 21h </p><p>  cmp al,char ;是否和當(dāng)前字符相同</p><p>  jne LnotHit</p><p>  mov blife,0 ;擊中當(dāng)前字符 &

115、lt;/p><p><b>  inc score</b></p><p>  jmp Lnochar</p><p><b>  LnotHit:</b></p><p>  cmp al,' '</p><p><b>  jnz next</

116、b></p><p><b>  mov cx,2</b></p><p>  stop:inc cx</p><p>  curse 0,64</p><p>  mov ah,07h</p><p><b>  int 21h</b></p><

117、p>  cmp al,' '</p><p><b>  jz next</b></p><p><b>  cmp al,27</b></p><p><b>  jz next</b></p><p><b>  loop stop</

118、b></p><p><b>  next: </b></p><p>  cmp al,27;esc 鍵退出</p><p>  jne Lnochar</p><p><b>  xor ax,ax</b></p><p>  jmp Lendplay

119、</p><p><b>  Lnochar:</b></p><p>  call LetterDown </p><p>  call Delay</p><p><b>  mov ax,1</b></p><p><b>  Lendplay:</b&

120、gt;</p><p><b>  ret </b></p><p>  PlayGames endp</p><p>  5.18計算2位整數(shù)并輸出模塊</p><p>  p proc near </p><p>  mov ah,00h ;將al補(bǔ)充為ax</p>

121、<p><b>  mov bl,10</b></p><p><b>  div bl</b></p><p>  mov bh,ah ;余數(shù)存入ah</p><p>  mov dl,al ;商存入al</p><p><b>  or dl

122、,30h</b></p><p>  mov ah,02h</p><p><b>  int 21h</b></p><p>  mov dl,bh </p><p><b>  or dl,30h</b></p><p>&l

123、t;b>  int 21h</b></p><p><b>  ret</b></p><p><b>  p endp</b></p><p>  5.19各宏定義模塊</p><p>  pushReg macro;寄存器入棧</p><p><b

124、>  push ax</b></p><p><b>  push bx</b></p><p><b>  push cx</b></p><p><b>  push dx</b></p><p><b>  endm </b><

125、;/p><p>  popReg macro;寄存器出棧</p><p><b>  pop dx </b></p><p><b>  pop cx </b></p><p><b>  pop bx </b></p><p><b>  pop

126、 ax</b></p><p><b>  endm </b></p><p>  curse macro cury,curx;設(shè)置光標(biāo)宏</p><p><b>  pushReg </b></p><p>  mov ah,02h </p><p>  m

127、ov bh,00h</p><p>  mov dh,cury</p><p>  mov dl,curx</p><p><b>  int 10h</b></p><p><b>  popReg</b></p><p><b>  endm </b&g

128、t;</p><p>  clear_screen macro op1,op2,op3,op4,color ;清屏宏定義 </p><p><b>  pushReg</b></p><p>  mov ax,0600h </p><p>  mov bh,color </p>&

129、lt;p>  mov ch,op1 </p><p>  mov cl,op2 </p><p>  mov dh,op3 </p><p>  mov dl,op4 </p><p><b>  int 10h </b></p><p><b>  curse 0,0</b

130、></p><p><b>  popReg </b></p><p><b>  endm </b></p><p>  menu macro cury,curx,op3 ;菜單顯示宏定義 </p><p>  mov ah,02h </p><p>

131、  mov bh,00h</p><p>  mov dh,cury</p><p>  mov dl,curx </p><p><b>  int 10h </b></p><p>  ;mov ah,02h</p><p>  mov ah,09h </p><p>

132、;  lea dx,op3 </p><p><b>  int 21h </b></p><p><b>  endm</b></p><p><b>  6.調(diào)試過程</b></p><p>  調(diào)試時我是按一下步驟進(jìn)行的: </p><p>  A

133、調(diào)用DEBUG,裝入程序</p><p>  B反匯編程序,記錄代碼段與數(shù)據(jù)段首地址</p><p>  C觀察寄存器初始狀態(tài) </p><p>  D以單步工作方式T開始運(yùn)行程序 </p><p>  E觀察用戶程序數(shù)據(jù)段初始內(nèi)容</p><p>  F繼續(xù)以單步工作方式運(yùn)行程序,G連續(xù)工作方式運(yùn)行程序</p&

134、gt;<p>  G不能達(dá)到預(yù)想效果時,修改程序,再調(diào)試</p><p>  由于,一開始沒下意識要記住整個調(diào)試過程,所以對于調(diào)試部分,沒有記錄下來。但是每次按照思路寫下來的子程序都經(jīng)過調(diào)試運(yùn)行達(dá)到自己預(yù)想的效果。設(shè)計從一布置下來就開始做,所以,寫的代碼的時間比較長,程序基本可以達(dá)到預(yù)想的效果,沒有遇到什么問題。</p><p><b>  7.使用說明</b

135、></p><p>  1.本游戲在win32系統(tǒng)運(yùn)行</p><p>  2.按回車鍵進(jìn)入游戲,ESC鍵退出</p><p>  3.進(jìn)入速度選擇界面,h鍵高速,l鍵低速,s鍵重新設(shè)置速度,其他鍵默認(rèn)為普通速度其他鍵(包括回車鍵)</p><p>  4.若進(jìn)入速度設(shè)置界面,輸入1-999的數(shù),表示速度為普通速度的百分之幾</p

136、><p>  5.游戲中按esc退出,同時顯示游戲總共出現(xiàn)字符數(shù),所得分?jǐn)?shù),同時提示游戲是否重新開始,y返回主界面,n退出</p><p>  6.游戲過程中按space鍵暫停,再次按space鍵繼續(xù)進(jìn)行游戲</p><p><b>  8.總結(jié)</b></p><p>  通過這次課程設(shè)計是我收獲不少,設(shè)計剛開始我們的手頭

137、資料少得可憐,通過網(wǎng)絡(luò)我知道了找到打字游戲的原理,形成了自己設(shè)計的方案,按照自己的思路一步步地做下去,不懂的時候,不斷查閱資料。本來不懂在圖書館書架上找書的我,這次學(xué)會了查找書本。由于老師有穿插了一些動態(tài)顯示的內(nèi)容,安排設(shè)計的時間比較長,本次的設(shè)計很順利就完成了,基本上沒遇到什么問題,只是覺得有點不耐煩,有時要設(shè)置光標(biāo)的位置。同時,也認(rèn)識到了自己的不足,很多指令都只能在用的時候翻書,而沒有把常用的都記住。對于自己了解的算法思想還少之甚少

138、,以后要更多地看程序,領(lǐng)悟別人的思想,自己多動手,增強(qiáng)自己編程的能力。</p><p><b>  9.參考文獻(xiàn)</b></p><p>  [1]《匯編語言》李珍香 劉紅梅 趙潤林主編 中國水利水電出版社</p><p>  [2]《匯編語言程序設(shè)計—從DOS到Windows》 張雪蘭等主編 清華大學(xué)出版社</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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論