BeiTown汇编入门教程(3)- 让汇编动起来

在本节中我们先做一个键盘输入的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

本文链接:BeiTown汇编入门教程(3)- 让汇编动起来

转载声明:BeiTown原创,转载请注明来源:BeiTown's Coder 编码之源,谢谢


Tags: , , ,

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>