在本节中我们先做一个键盘输入的DEMO,掌握了汇编键盘输入功能后,我们将学习一个汇编的if语句,并将通过键盘输入进行图形控制,实现一个游戏Role移动的Demo
首先我们来看一下如何进行键盘输入
在代码添加处写入如下代码
1 2 | MOV AH,01 INT 21H |
此命令为等待一个字符输入,并带有回显,运行结果如下,键入A
如果不想要回显我们可以用7号功能替换掉1号功能,即MOV AH,07
那么汇编如何判断我们输入的键值呢,首先学习一下如何在汇编中创建一个判断语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | MOV AH,07;等待输入 INT 21H CMP AL,97;判断输入字符的Ascii和97进行对比,7号功能输入的KEY值保存在AL中 JE KEYA;当结果满足时,判断标志位zf==1?跳转到KEYA处,否则继续往下走 JMP N_KEYA;绕过KEYA段直接进入N_KEYA段 KEYA: MOV DL,1 MOV AH,02 INT 21H N_KEYA: MOV AH,4CH INT 21H |
CPU为我们提供的CMP指令,其功能相当于减法指令,即比较大小,不保存结果,但是会对标志寄存器产生影响。JE(jump equanl:即是结果等于则转移 : zf=1)指令是无符号数的比较结果进行转移的条件转移指令,在这里,将CMP和JE指令配合使用,来达到实现高级语言if判断的作用。而JMP意为直接跳转,类似于C中的GOTO语句
运行后当用户输入a时,程序会执行KEYA段的语句,在屏幕上打印一个笑脸图案,而其他输入则直接进入程序结束语句
接下来是项目整合,介于很多内容是前几节已经描述过的,这里就直接上代码吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | DATAS SEGMENT ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX ;此处输入代码段代码 MOV DH,19;y MOV DL,3;x ;绘制角色 CALL DRAW_ROLE ;键盘控制 KEYDOWN: PUSH DX MOV DH,20 MOV DL,00;设置x坐标 ;循环加载地图 MOV CX,80 CREATE_MAP: CALL DRAW_MAP ADD DL,1;x坐标++ LOOP CREATE_MAP POP DX MOV AH,07 INT 21H CMP AL,97;key == a? JE KEYA CMP AL,100;key == d? JE KEYD CMP AL,113;key == q? JE OVER JMP KEYDOWN KEYA: DEC DL;x-- CALL CLRSCR CALL DRAW_ROLE JMP KEYDOWN KEYD: INC DL;x++ CALL CLRSCR CALL DRAW_ROLE JMP KEYDOWN ;绘制角色 DRAW_ROLE PROC NEAR PUSH AX PUSH DX MOV AH,2 INT 10h MOV DL,1 INT 21H POP DX POP AX RET DRAW_ROLE ENDP ;绘制地图 DRAW_MAP PROC NEAR PUSH AX PUSH DX MOV AH,2 INT 10h MOV DL,176 INT 21H POP DX POP AX RET DRAW_MAP ENDP ;清屏 CLRSCR PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX MOV AX,0600h MOV BH,240 MOV CX,00000h MOV DX,184fh INT 10H POP DX POP CX POP BX POP AX RET CLRSCR ENDP OVER: MOV AH,4CH INT 21H CODES ENDS END START |
游戏效果如图,通过键盘上的A和S键可以控制小人的移动,按Q则是退出
这里补充一下,如果遇到bug很多时候先检查一下堆栈的PUSH 和 POP 是否对应顺序了,是否符合后进先出的原则,堆栈这一块由于粗心造成的的错误率还是很高的。
编译好的程序打包上传了,有什么疑问的地方欢迎大家留言交流,我们下节课见。
BeiTown
2012-11-27