WEB开发网      婵犵數濮烽弫鍛婄箾閳ь剚绻涙担鍐叉搐绾剧懓鈹戦悩瀹犲闁汇倗鍋撻妵鍕箛閸洘顎嶉梺绋款儑閸犳劙濡甸崟顖氬唨闁靛ě浣插亾閹烘鈷掗柛鏇ㄥ亜椤忣參鏌″畝瀣暠閾伙絽銆掑鐓庣仭缁楁垿姊绘担绛嬪殭婵﹫绠撻、姘愁樄婵犫偓娴g硶鏀介柣妯款嚋瀹搞儱螖閻樺弶鍟炵紒鍌氱Ч瀹曟粏顦寸痪鎯с偢瀵爼宕煎☉妯侯瀳缂備焦顨嗗畝鎼佸蓟閻旈鏆嬮柣妤€鐗嗗▓妤呮⒑鐠団€虫灀闁哄懐濮撮悾鐤亹閹烘繃鏅濋梺闈涚墕濡瑩顢欒箛鏃傜瘈闁汇垽娼ф禒锕傛煕閵娿儳鍩f鐐村姍楠炴﹢顢欓懖鈺嬬幢闂備浇顫夊畷妯肩矓椤旇¥浜归柟鐑樻尭娴滃綊姊虹紒妯虹仸闁挎洍鏅涜灋闁告洦鍨遍埛鎴︽煙閼测晛浠滃┑鈥炽偢閹鈽夐幒鎾寸彇缂備緡鍠栭鍛搭敇閸忕厧绶炴俊顖滅帛濞呭洭姊绘担鐟邦嚋缂佽鍊垮缁樼節閸ャ劍娅囬梺绋挎湰缁嬫捇宕㈤悽鍛婄厽閹兼番鍨婚埊鏇㈡煥濮樿埖鐓熼煫鍥ュ劤缁嬭崵绱掔紒妯肩畺缂佺粯绻堝畷姗€濡歌缁辨繈姊绘担绛嬪殐闁搞劋鍗冲畷顖炲级閹寸姵娈鹃梺缁樻⒒閳峰牓寮崒鐐寸厱闁抽敮鍋撻柡鍛懅濡叉劕螣鐞涒剝鏂€闂佺粯鍔曞Ο濠囧吹閻斿皝鏀芥い鏃囨閸斻倝鎽堕悙鐑樼厱闁哄洢鍔屾晶顖炴煕濞嗗繒绠婚柡灞界Ч瀹曨偊宕熼鈧▍锝囩磽娴f彃浜炬繝銏f硾椤戝洨绮绘ィ鍐╃厵閻庢稒岣跨粻姗€鏌ㄥ☉妯夹fい銊e劦閹瑩顢旈崟顓濈礄闂備浇顕栭崰鏍礊婵犲倻鏆﹂柟顖炲亰濡茶鈹戦埄鍐ㄧ祷妞ゎ厾鍏樺璇测槈閵忕姈鈺呮煏婢跺牆鍔撮柛鏂款槺缁辨挻鎷呯粙搴撳亾閸濄儳鐭撶憸鐗堝笒閺嬩線鏌熼崜褏甯涢柡鍛倐閺屻劑鎮ら崒娑橆伓 ---闂傚倸鍊搁崐鐑芥倿閿旈敮鍋撶粭娑樺幘濞差亜鐓涢柛娑卞幘椤斿棝姊虹捄銊ユ珢闁瑰嚖鎷�
开发学院软件开发汇编语言 汇编源代码之一个有趣的打字游戏 阅读

汇编源代码之一个有趣的打字游戏

 2009-01-28 09:37:05 来源:WEB开发网 闂傚倸鍊搁崐椋庢濮橆兗缂氱憸宥堢亱闂佸湱铏庨崰鏍不椤栫偞鐓ラ柣鏇炲€圭€氾拷闂傚倸鍊搁崐椋庣矆娓氣偓楠炲鏁撻悩鎻掔€梺姹囧灩閻忔艾鐣烽弻銉︾厵闁规鍠栭。濂告煕鎼达紕校闁靛洤瀚伴獮鎺楀箣濠靛啫浜鹃柣銏⑶圭壕濠氭煙閻愵剚鐏辨俊鎻掔墛缁绘盯宕卞Δ鍐冣剝绻涘畝濠佺敖缂佽鲸鎹囧畷鎺戭潩閹典焦鐎搁梻浣烘嚀閸ゆ牠骞忛敓锟�婵犵數濮烽弫鍛婃叏椤撱垹绠柛鎰靛枛瀹告繃銇勯幘瀵哥畼闁硅娲熷缁樼瑹閳ь剙岣胯鐓ら柕鍫濇偪濞差亜惟闁宠桨鑳堕崝锕€顪冮妶鍡楃瑐闁煎啿鐖奸崺濠囧即閵忥紕鍘梺鎼炲劗閺呮稒绂掕缁辨帗娼忛埡浣锋闂佽桨鐒﹂幑鍥极閹剧粯鏅搁柨鐕傛嫹闂傚倸鍊搁崐椋庢濮橆兗缂氱憸宥堢亱闂佸湱铏庨崰鏍不椤栫偞鐓ラ柣鏇炲€圭€氾拷  闂傚倸鍊搁崐鐑芥嚄閼哥數浠氱紓鍌欒兌缁垶銆冮崨鏉戠厺鐎广儱顦崡鎶芥煏韫囨洖校闁诲寒鍓熷铏圭磼濡搫顫岄梺璇茬箲濮樸劑鍩€椤掍礁鍤柛鎾跺枎椤繐煤椤忓嫬鐎銈嗘礀閹冲酣宕滄导瀛樷拺闂侇偆鍋涢懟顖涙櫠椤斿墽纾煎璺猴功缁夎櫣鈧鍠栭…閿嬩繆濮濆矈妲烽梺绋款儐閹瑰洤螞閸愩劉妲堟繛鍡楃箲濞堟﹢姊绘担椋庝覆缂傚秮鍋撴繛瀛樼矤閸撶喖宕洪埀顒併亜閹烘垵鈧綊寮抽鍕厱閻庯綆浜烽煬顒傗偓瑙勬磻閸楀啿顕i崐鐕佹Ь闂佸搫妫寸粻鎾诲蓟閵娾晜鍋嗛柛灞剧☉椤忥拷
核心提示:;;此模板是纯DOS程序代码,需要MASM5.0,编译时请使用"编译 -> DOS"方式,;Init_game macro op1,op2,op3,op4,op5,op6mov cx,00hmov dh,op1mov dl,op2op6:mov ah,02hmov bh,00hint 10hp
;--------------------------------------------------------------------------------
;此模板是纯DOS程序代码,需要MASM5.0,编译时请使用"编译 -> DOS"方式。
;--------------------------------------------------------------------------------
Init_game macro op1,op2,op3,op4,op5,op6
  mov cx,00h
mov dh,op1
mov dl,op2
op6:
mov ah,02h
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
  endm
  clear_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
mov dh,00h
mov dl,00h
int 10h
endm
menu 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 21h
endm
data segment
  linjiang db "Made by lin jiang$"
no db "NO.:021411$"
meg db "Let us have a game!!Come on!!$"
meg1 db "**Select Menu**$"
meg2 db "Please select the game speed,ESC to quit.$"
meg3 db "1.Very slow Too easy,speed up!$"
meg4 db "2.Slow Everybody can deal.$"
meg5 db "3.Nomal I think you can deal!$"
meg6 db "4.Fast A challenge.Pay attention!$"
meg7 db "5.Very Fast Too hard,Have a try?$"
meg8 db "6.Fastest Are you crazy??$"
meg9 db "*Select the number among 1-6 and press ENTER to start!*$"
meg10 db "Game Speed Select:$"
  hotkey db "When you are playing games:$"
hotkey1 db "ESC to return to menu$"
hotkey2 db "SPACE to pause the game$"
hotkey3 db "Press any key to play games......$"
hotkey4 db "Are you ready??$"
  failmeg db "The letter is arrive the bottom, You are lost ! :($"
failmeg0 db "Press ENTER to go on......$"
failmeg1 db "Game is over!$"
failmeg2 db "Press ENTER to return menu and press ESC to exit!$"
failmeg3 db "Bye-Bye!Thank for your playing!!$"
failmeg4 db "Press any key to quit......$"
  speed dw 00d,1200d,800d,600d,400d,200d,100d
letters db "jwmilzoeucgpravskntxhdyqfb"
db "iytpkwnxlsvxrmofzhgaebudjq"
db "nwimzoexrphysfqtvdcgljukda"
  letters_bak db "jwmilzoeucgpravskntxhdyqfb"
db "iytpkwnxlsvxrmofzhgaebudjq"
db "nwimzoexrphysfqtvdcgljukda"
  letter_counter db 0
life_flag db 78 dup(0)
  position_flag db 78 dup(0)
present_position db 1
  data ends
  stack segment para stack 'stack'
db 64 dup(0)
stack ends
  code segment
main proc far
assume cs:code,ds:data,ss:stack
start:
  mov ax,data
mov ds,ax
  mov letter_counter,00h
mov present_position,1
  lea si,position_flag
  mov ah,00h
mov cx,00h
  init_postion_flag:
mov [si],ah
inc si
inc cx
cmp cx,78d
jne init_postion_flag
  lea di,letters
lea si,letters_bak
mov cx,00h
init_letters:
mov ah,[si]
mov [di],ah
inc si
inc di
inc cx
cmp cx,78d
jne init_letters
mov ah,00h
lea si,life_flag
mov cx,00h
init_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 10h
  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,nextsign3
  Init_game 00d,79d,0ah,dh,25d,nextsign4
menu 01d,15d,meg ;菜单信息的宏展开
menu 01h,61d,linjiang
menu 03d,20d,meg1
menu 03d,68d,no
menu 05d,15d,meg2
menu 07d,15d,meg3
menu 09d,15d,meg4
menu 11d,15d,meg5
menu 13d,15d,meg6
menu 15d,15d,meg7
menu 17d,15d,meg8
menu 19d,15d,meg9
menu 22d,15d,meg10
  input: mov ah,02h
mov bh,00h
mov dh,22d
mov dl,33d
int 10h
  mov ah,0ah
mov al," "
mov bh,00h
mov cx,01h
int 10h
  mov ah,01h
int 21h
retry: cmp al,"1"
je speed1
cmp al,"2"
je speed2
cmp al,"3"
je speed3
cmp al,"4"
je speed4
cmp al,"5"
je speed5
cmp al,"6"
je speed6
cmp al,1bh
je to_over0
jmp input
  to_over0:jmp over
speed1: mov ah,01h
int 21h
cmp al,0dh
jne otherkey
mov ax,speed+2
mov speed,ax
jmp begin
  speed2: mov ah,01h
int 21h
cmp al,0dh
jne otherkey
mov ax,speed+4
mov speed,ax
jmp begin
  speed3: mov ah,01h
int 21h
cmp al,0dh
jne otherkey
mov ax,speed+6
mov speed,ax
jmp begin
  speed4: mov ah,01h
int 21h
cmp al,0dh
jne otherkey
mov ax,speed+8
mov speed,ax
jmp begin
  speed5: mov ah,01h
int 21h
cmp al,0dh
jne otherkey
mov ax,speed+10
mov speed,ax
jmp begin
  speed6: mov ah,01h
int 21h
cmp al,0dh
jne otherkey
mov ax,speed+12
mov speed,ax
jmp begin
  otherkey: ; 处理重复输入的代码段
  push ax
mov ah,02h
mov bh,00h
mov dh,22d
mov dl,34d
int 10h
  mov ah,0ah
mov al," "
mov bh,00h
mov cx,01h
int 10h
  mov ah,02h
mov bh,00h
mov dh,22d
mov dl,33d
int 10h
pop ax
  mov dx,ax
mov ah,02h
int 21h
  jmp retry
  begin:
  clear_screen 01d,01d,23d,78d
  menu 08d,20d,hotkey
menu 10d,20d,hotkey1
menu 12d,20d,hotkey2
menu 14d,20d,hotkey4
menu 16d,20d,hotkey3
  mov ah,07h
int 21h
  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
nextletter: ; 初始化屏幕上方的字母
mov ah,02h
mov dl,[si]
int 21h
  inc si
inc cx
cmp cx,78d
je nextcycle
jmp nextletter
from_front: ; 相关循环的算法
sub present_position,78d
jmp gobackto_si
  find_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_position,78d
je from_one
  jmp nextsi
  from_one:mov present_position,01h
  jmp gobackto_si
  recycle:mov letter_counter,00h
mov present_position,01d
lea si,position_flag
mov cx,00h
  mov ah,00h
clearsi: mov [si],ah
inc cx
cmp cx,78d
je nextcycle
inc si
jmp clearsi
  nextcycle:
lea di,letters
lea si,position_flag
add present_position,31d
cmp present_position,78
ja from_front
gobackto_si:
add si,word ptr present_position
dec si
mov ah,[si]
cmp ah,01h
je find_zero
gobackto_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,00h
nextrow:push cx ; 新的一行
mov cx,00h
out_cycle: ; 延迟
push cx
mov cx,00h
in_cycle:
add cx,01h
cmp cx,50000d
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 disappear
  pass:
pop cx
inc cx
cmp cx,speed
je print
jmp out_cycle
pause: push dx ;暂停处理
mov ah,06h
mov dl,0ffh
int 21h
pop dx
cmp al," "
jne pause
  jmp pass
to_start1: ;返回主菜单
jmp start
  print:
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
print_next_letter: ; 处理原位置的空缺
lea si,life_flag
add si,word ptr present_position
dec si
  mov ah,[si]
cmp ah,1
je fail
  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," "
mov bh,00h
mov cx,01h
int 10h
mov ah,1
mov [si],ah
hit: mov ah,02h
mov bh,00h
mov dh,01h
mov dl,present_position
int 10h
  mov al,[di] ; 出现下一个新字母的数法
add al,7
cmp al,7ah
ja convey_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
  fail: mov ah,0ah ;游戏失败后的相关处理
mov al," "
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
  mov ah,02h
mov bh,00h
mov dh,12d
mov dl,17d
int 10h
  push dx
mov ah,09h
lea dx,failmeg
int 21h
pop dx
  add dh,2
mov ah,02h
mov bh,00h
int 10h
  mov ah,09h
lea dx,failmeg0
int 21h
  re: mov ah,07h
int 21h
cmp al,0dh
jne re
clear_screen 01,01,23,78
mov ah,02h
mov bh,00h
mov dh,11d
mov dl,20d
int 10h
  push dx
mov ah,09h
lea dx,failmeg1
int 21h
pop dx
  inc dh
inc dh
mov ah,02h
mov bh,00h
int 10h
  mov ah,09h
lea dx,failmeg2
int 21h
  notkey:
mov ah,07h
int 21h
cmp al,0dh
je to_start
cmp al,1bh
je over
jmp notkey
to_start:
clear_screen 00,00,24,79
jmp start
  over: clear_screen 01,01,23,78
mov ah,02h
mov bh,00h
mov dh,11d
mov dl,15h
int 10h
  mov ah,09h
lea dx,failmeg3
int 21h
  mov ah,02h
mov bh,00h
mov dh,13d
mov dl,15h
int 10h
  mov ah,09h
lea dx,failmeg4
int 21h
  mov ah,07h
int 21h
  mov ah,07h
int 21h
  clear_screen 00,00,24,79
  mov ax,4c00h
int 21h
main endp
code ends
end start

Tags:汇编 源代码 一个

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接