汇编语言程序设计项目完整代码及详解解释
建议先自己思考问题的答案,不懂则返回看书
程序设计项目一
data segment
dw ?
data ends
end
要求:
只在定义的数据段’?‘中加入相关的内容,使得上面的程序可以在屏幕中间显示一个绿色的字符’A’。
完整代码
assume cs:data
data segment
db 'A'
start:
mov ax,data
mov ds,ax
mov ax,0b854h
mov es,ax
mov al,ds:[0]
mov ah,2
mov es:[0],ax
mov ax,4c00h
int 21h
data ends
end start
程序设计项目二
对加密的字符串进行解密。
要求:
(1)加密的字符串放在Cryptography段。
(2)解密方法:将Cryptography段的每个字符的ASCII值减去1。
(3)用汇编语言实现程序,将Cryptography段的数据按照解密方法进行解密,将解密后的数据放在PlainText段,然后再把解密之后的字符串以白底蓝字方式显示到屏幕中间。
(4)密文和明文的数据段定义如下:
Cryptography segment
db 'tqsfbe!zpvs!xjoht'
db '!!cf!zpvs!nbtufs!'
Cryptography ends
PlainText segment
db 2*17 dup (' ')
PlainText ends
完整代码:
assume cs:code
Cryptography segment
db 'tqsfbe!zpvs!xjoht'
db '!!cf!zpvs!nbtufs!'
Cryptography ends
PlainText segment
db 2*17 dup(' ')
PlainText ends
code segment
start:
mov ax,Cryptography
mov ds,ax
mov ax,PlainText
mov es,ax
mov bx,0
mov cx,34
;解密循环
s:
mov al,ds:[bx]
sub al,1
mov es:[bx],al
add bx,1
loop s
mov ax,0b850h
mov ds,ax
mov bx,0
mov di,0
mov ah,01110001B
mov cx,34
s1:
mov al,es:[bx]
mov ds:[di],ax
inc bx
add di,2
loop s1
mov ax,4c00h
int 21h
code ends
end start
程序设计项目三
加、减、除三则运算。
(1)读取字符串的内容,判断第四个字符是’+’、’-‘或’/’,然后按照相应的符号进行运算,并把运算结果转换为字符串存放在等号后面,最后把算式显示到屏幕中间,白底蓝字。
(2)注意数字字符的ASCII与数字的对应关系,数字的数值加30H为这个数字的字符所对应的ASCII。
(3)数据段定义如下:
Calculate segment
db '1. 3/1= '
db '2. 5+3= '
db '3. 9-3= '
db '4. 4+5= '
Calculate ends
(看起来比较难,但其实稍加思考便觉得挺简单的)
完整代码:
assume cs:code
Calculate segment
db '1. 3/1= '
db '2. 5+3= '
db '3. 9-3= '
db '4. 4+5= '
Calculate ends
stack segment
dw 8 dup (0)
stack ends
code segment
start:
mov ax,Calculate
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
mov si,3
mov cx,4
s:
push cx
mov ch,0
mov cl,ds:[si+1]
call judgechu
jcxz chu
mov ch,0
mov cl,ds:[si+1]
call judgejian
jcxz jian
mov ch,0
mov cl,ds:[si+1]
call judgejia
jcxz jia
s0:
add si,16
pop cx
loop s
jmp display ;计算完毕,跳转到显示结果函数
judgechu:
mov dl,47
sub cl,dl
ret
;题目除数数据均可用8位表示,则被除数为16位,ax中存放AL为商,AH为余数
chu:
mov ax,0
mov al,ds:[si]
sub al,30h
mov dx,0
mov dl,ds:[si+2]
sub dl,30h
div dl
add al,30h
mov ds:[si+4],al
jmp s0
judgejian:
mov dx,45
sub cl,dl
ret
jian:
mov ax,0
mov al,ds:[si]
sub al,30h
mov dx,0
mov dl,ds:[si+2]
sub dl,30h
sub al,dl
add al,30h
mov ds:[si+4],al
jmp s0
judgejia:
mov dx,43
sub cl,dl
ret
jia:
mov ax,0
mov al,ds:[si]
sub al,30h
mov dx,0
mov dl,ds:[si+2]
sub dl,30h
add al,dl
add al,30h
mov ds:[si+4],al
jmp s0
;显示计算完的结果
display:
mov ax,Calculate
mov ds,ax
mov di,0
mov ax,0b85eh
mov es,ax
mov si,0
mov ah,00001100b
mov cx,4
s1:
push cx
mov cx,16
s2:
mov al,ds:[di]
mov es:[si],ax
inc di
inc si
inc si
loop s2
add si,128
pop cx
loop s1
mov ax,4c00h
int 21h
code ends
end start
程序设计项目四
编程计算x(x>2)的y(y>2)次方。使用add指令实现。
另,若学到第10章,使用两种方式实现:
(1)只使用add指令实现;
(2)只使用mul指令实现;
并将计算式显示在屏幕中央。
例如:
计算4的3次方。在屏幕中央显示格式如下:
4
^
3
-----
64
注意:结果不能超过16位寄存器可存储的最大值。
add完整代码:
多少个X相加,确定循环次数,得到用add实现乘法运算的算法
assume cs:code,ss:stack
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
;修改cx,dx的值来代表y,x的值,用栈保存
push cx
push dx
mov ax,dx
mov bx,ax
;外层循环y-1次
;内层循环x-1次,ax初值算一次
sub cx,1
sub dx,1
s:
push cx
mov cx,dx
s0:
add ax,bx
loop s0
mov bx,ax
pop cx
loop s
;按要求显示结果
mov bx,0b850h
mov ds,bx
mov bx,0
;显示x
pop cx
add cx,30h
mov ch,11000010b
mov ds:[bx],cx
;显示^
mov cl,94
mov ch,11000010b
mov ds:[bx+160],cx
;显示y
pop cx
add cx,30h
mov ch,11000010b
mov ds:[bx+160+160],cx
;显示-
mov di,0
mov cx,5
mov dx,45
mov dh,11000010b
s1:
mov ds:[bx+160+160+160+di],dx
inc di
inc di
loop s1
;显示结果,ax中存放着结果,也就是在AL中,8位div余数在ah中,商在AL中
mov ah,0
mov cl,10
div cl
mov dx,0
mov dl,ah
;保存个位数于栈中
push dx
mov ah,0
mov dx,ax
;保存十位数于栈中
push dx
pop dx ;弹出十位数于dx中,并显示输出
add dx,30h
mov dh,11000010b
mov ds:[bx+160+160+160+160],dx
pop dx
add dx,30h
mov dh,11000010b
mov ds:[bx+160+160+160+160+2],dx
mov ax,4c00h
int 21h
code ends
end start
mul完整代码:
assume cs:code,ss:stack
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment ;只计算8位乘法
start:
mov ax,stack
mov ss,ax
mov sp,16
;执行时修改cx,ax的值来代表y,x的值,用栈保存
push cx
push ax
mov bx,ax
dec cx ;第一次在ax中,循环y-1次
s:
mul bl
loop s
;计算完毕,结果存在ax中
;按要求显示结果
mov bx,0b850h
mov ds,bx
mov bx,0
;显示x
pop cx
add cx,30h
mov ch,11000010b
mov ds:[bx],cx
;显示^
mov cl,94
mov ch,11000010b
mov ds:[bx+160],cx
;显示y
pop cx
add cx,30h
mov ch,11000010b
mov ds:[bx+160+160],cx
;显示-
mov di,0
mov cx,5
mov dx,45
mov dh,11000010b
s1:
mov ds:[bx+160+160+160+di],dx
inc di
inc di
loop s1
;显示结果,ax中存放着结果,也就是在AL中,8位div余数在ah中,商在AL中
mov ah,0
mov cl,10
div cl
mov dx,0
mov dl,ah
;保存个位数于栈中
push dx
mov ah,0
mov dx,ax
;保存十位数于栈中
push dx
pop dx ;弹出十位数于dx中,并显示输出
add dx,30h
mov dh,11000010b
mov ds:[bx+160+160+160+160],dx
pop dx
add dx,30h
mov dh,11000010b
mov ds:[bx+160+160+160+160+2],dx
mov ax,4c00h
int 21h
code ends
end start
程序设计项目五
定义一个数据段如下:
data segment
db 'h12E332l@L#O*&^!88nI@cE$% %$T1O m33E44E55t y77O88u!()'
db '?'
data ends
注意:第一行字符串为待处理的数据,’?‘为字符串结束符号。
设计程序完成如下操作:
(1)去掉除字母、空格、’!‘之外的字符;
(2) 通过内存间的数据交换,将数据段中的字符串修改为’Hello!Nice to meet you!’;
(3)在屏幕正中打印处理好后的数据。
完整可运行代码如下:
反向理解题意:只留下字母、空格、感叹号。首字母和感叹号后的字母大写
assume cs:code,ds:data,ss:stack
data segment
db 'h2E332l@L#O*&^!88nI@cE$% %$T1O m33E44E55t y77O88u!()'
db '?'
data ends
stack segment
dw 8 dup (0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov di,0
mov ax,0b850h
mov es,ax
mov si,0
mov ax,stack
mov ss,ax
mov sp,16
mov ax,0
mov bx,0
mov cx,0
mov dx,0
s:
mov al,ds:[di]
mov bl,al ;bl用于存放取出的值,不可用于其他地方
call judgeChar ;call时,存放ip于栈中,即执行了push ip
jcxz displayChar
call judgeExclaim
jcxz displayExclaim
call judgeBlack
jcxz displayBlack
call judgeQuestion
jcxz displayQuestion
s0:
inc di
jmp s
judgeChar:
mov al,bl
or al,00100000b
sub al,60h
mov cx,26
ch0:
dec al
push cx
mov cl,al
jcxz ischar ;若为0,则原始字符为字母
pop cx
loop ch0
jmp isnotchar
ischar:
pop cx ;匹配ch0中的push,将临时变量cx弹出,无用
mov cl,al
add bh,1 ;bh代表是否需要大写的标志,不可用于其他途径
ret
isnotchar:
mov cl,al ;将非0的al的值传给cl,使cx不为0
ret
displayChar:
; mov al,bl
; mov cx,di ;第一个字符则大写
; jcxz daxie
;
; mov cx,0
; mov cx,es:[si-2] ;若前一个字符为感叹号则大写
; sub cl,21h
; jcxz daxie
; jmp xiaoxie
mov al,bl
dec bh
mov cl,bh
jcxz daxie
jmp xiaoxie
daxie:
inc bh
and al,11011111b
jmp display
xiaoxie:
or al,00100000b
jmp display
display:
mov ah,00001100b
mov es:[si],ax
add si,2
jmp s0
judgeBlack:
mov al,bl
mov cl,al
or cl,00100000b ;避免歧义
sub cl,20h
ret
displayBlack:
mov al,bl
mov ah,00001100b
mov es:[si],ax
add si,2
; mov bh,2
jmp s0
judgeExclaim:
mov al,bl
mov cl,al
; or cl,00100000b
sub cl,21h
ret
displayExclaim:
mov al,bl
mov ah,00001100b
mov es:[si],ax
add si,2
mov bh,0
jmp s0
judgeQuestion:
mov al,bl
mov cl,al
; or cl,00100000b
sub cl,3fh
ret
displayQuestion:
jmp ProgramOver
ProgramOver:
mov ax,4c00h
int 21h
code ends
end start
程序设计项目六
在屏幕中间显示:“中华”两个字。参看demo0.png示例。
先存储,再显示。
assume ds:data,ss:stack,cs:code
data segment
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,3,3,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,3,3,0,0,3,3,3,3,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,3,3,3,3,0,0,0,0,0,0,0,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,3,3,0,0,3,3,0,0,0,0,3,3,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,3,3,0,0,0,3,3,0,0,3,3,0,0,0,0,3,3,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,3,3,0,0,0,0,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data ends
stack segment
dw 8 dup (0)
stack ends
code segment
start:
mov ax,0b850h
mov es,ax
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
mov di,0
mov si,0
mov ah,00001100b
mov al,0
mov cx,16
s:
push cx
mov cx,40
s0:
mov al,ds:[si]
mov es:[di],ax
inc si
inc di
inc di
loop s0
mov bx,599
mov cx,40
s1:
mov al,ds:[si+bx]
mov es:[di],ax
inc bx
inc di
inc di
loop s1
pop cx
loop s
mov ax,4c00h
int 21h
code ends
end start
程序设计项目七
在屏幕上显示一个兔子图形。参看demo1.gif示例。
assume cs:code
data segment
db '.....*........*.......' ;22列
db '....*..*.....*.*......'
db '.....*..*....*..*.....'
db '......*..*..*.*.*.....'
db '.....*.........*......'
db '...*.............*....'
db '..*...............*...' ;中间8,上6,下20
db '.*.................*..'
db '*...................*.'
db '*...................*.'
db '*.....*.......*.....*.'
db '*...................*.'
db '*...@.....U.....@...*.'
db '.*.................*..'
db '..**.............**...' ;15行
data ends
code segment
start:
;清屏
clear:
mov ax,0b800h
mov es,ax
mov di,0
mov ax,0
mov cx,80*25
clearc:
mov es:[di],ax
add di,2
loop clearc
;显示字符
mov ax,0b800h
mov es,ax
mov ax,data
mov ds,ax
mov dh,1 ;初始化颜色1
show:
mov si,0
mov bx,160*5+30*2
mov di,0
mov cx,15
show0:
push cx
mov cx,22
show1:
mov dl,ds:[si]
mov es:[bx+di],dx
inc si
add di,2
loop show1
pop cx
add bx,160
mov di,0
loop show0
;等待时间
sleep:
mov cx,9999
sleep0: push cx
mov cx,200
sleep1: mov ax,ax
loop sleep1
pop cx
loop sleep0
inc dh
cmp dh,7
je over
jmp show
over:
mov dh,1
jmp show
mov ax,4c00h
int 21h
code ends
end start
程序设计项目八
实现笑脸阶梯走效果。参看demo2.gif示例。
assume cs:code
code segment
start:
;清屏
mov ax,0b800h
mov es,ax
mov di,0
mov ax,0
mov cx,80*25
clear:
mov es:[di],ax
add di,2
loop clear
;先存储阶梯,阶梯始终不变
mov ax,0b800h
mov es,ax
mov di,18*160
mov dh,2 ;颜色为绿色
mov dl,'.'
mov cx,3
s0:
push cx
mov cx,20
s1:
mov es:[di],dx
add di,2
loop s1
pop cx
sub di,960
loop s0
;笑脸走
smile:
mov di,17*160
mov dl,2 ;笑脸
mov cx,3
s2:
push cx
mov cx,20
s3:
mov es:[di],dx
call sleep
mov word ptr es:[di],0
add di,2
loop s3
pop cx
sub di,960
loop s2
jmp smile
sleep:
push cx
mov cx,5
sleep0:
push cx
mov cx,0ffffh
sleep1:
mov ax,ax
loop sleep1
pop cx
loop sleep0
pop cx
ret
mov ax,4c00h
int 21h
code ends
end start
程序设计项目九
将ASCII码按顺序在屏幕上竖列显示。参看demo3.gif示例。
要求:
(1)逐个显示字符,相邻的两个字符之间显示要有时间间隔。
(2)字符颜色为绿色。
(3)每列显示20个字符,列间距为5个字符。显示完128个ASCII码,共需7列。
assume cs:code
code segment
start:
;清屏
mov ax,0b800h
mov es,ax
mov di,0
mov ax,0
mov cx,80*25
clear:
mov es:[di],ax
add di,2
loop clear
;显示
mov ax,0b800h
mov es,ax
mov bx,3*160+2*60 ;起始显示地址
mov di,0 ;起始显示地址的列偏移地址
mov dl,0
mov dh,00000010b ;颜色
mov cx,7 ;第七列单独处理
s0:
push cx
cmp cx,1
je diqilie
mov cx,20
jmp short s1
diqilie:
mov cx,7
s1:
mov es:[bx+di],dx
call sleep
add di,160
inc dl
loop s1
mov di,0
sub bx,12
pop cx
loop s0
jmp start ;不注释则无限循环
mov ax,4c00h
int 21h
sleep:
push cx
mov cx,7
sleep0:
push cx
mov cx,0ffffh
sleep1:
mov ax,ax
loop sleep1
pop cx
loop sleep0
pop cx
ret
code ends
end start
程序设计项目十
在屏幕上斜着显示三个‘happy spring festival!’,字符串的颜色分别为蓝色、绿色和红色,并且各个字符串的颜色按规律变换。参看demo4.gif示例。
assume cs:code
data segment
db 'happy spring festival!' ;RGB
db 02h,04h,01h,02h,04h ;GRB BGR RBG 三种状态的切换
data ends
code segment
start:
;清屏
mov ax,0b800h
mov es,ax
mov di,0
mov ax,0
mov cx,80*25
clear:
mov es:[di],ax
add di,2
loop clear
;开始显示
begin:
mov ax,data
mov ds,ax
; mov si,0
mov ax,0b800h
mov es,ax
; mov di,400
mov bp,24 ;第23个字符
mov cx,3
s0:
mov si,0
mov di,370 ;每开始一次新的外层循环,需对si,di重置
push cx
mov cx,22 ;显示一次
s1:
mov ah,ds:[bp]
mov al,ds:[si]
mov es:[di],ax
mov ah,ds:[bp+1]
mov es:[di+4],ax
mov ah,ds:[bp+2]
mov es:[di+8],ax ;一行字符显示完毕
add di,162 ;显示新的偏移量
inc si
loop s1
call sleep ;休眠时间
pop cx
dec bp
loop s0
jmp begin ;无限循环
mov ax,4c00h
int 21h
;显示等待时间
sleep:
push cx
mov cx,20
sleep0:
push cx
mov cx,0ffffh
sleep1:
mov ax,ax
loop sleep1
pop cx
loop sleep0
pop cx
ret
code ends
end start
程序设计项目十一
动态画出一个棵七彩圣诞树。参看demo5.gif示例。
assume cs:code
data segment
data ends
code segment
start:
;清屏
mov ax,0b800h
mov es,ax
mov di,0
mov ax,0
mov cx,80*25
clear:
mov es:[di],ax
add di,2
loop clear
;显示背景
mov ax,0b800h
mov es,ax
mov di,0
mov si,24*160 ;3840
mov ah,2 ;颜色
; mov bx,0
mov cx,25
s0:
push cx
mov bx,0
mov cx,13
mov al,'A'
s1: ;左侧字母
mov es:[di+bx],ax
inc al
add bx,4
mov es:[si+bx],ax
inc al
add bx,4
loop s1
mov al,'1'
mov cx,5
s2: ;中间数字
mov es:[di+bx],ax
inc al
add bx,4
cmp cx,1
je s2over
mov es:[si+bx],ax
inc al
add bx,4
s2over:
loop s2
mov al,'A'
mov cx,3
s3: ;右侧字母
mov es:[si+bx],ax
inc al
add bx,4
cmp cx,1
je s3over
mov es:[di+bx],ax
inc al
add bx,4
s3over:
loop s3
pop cx
add di,160
sub si,160
call sleep
loop s0
;背景显示完毕
call sleep
call sleep
;显示圣诞树
mov ax,0b800h
mov es,ax
mov bx,0
mov di,32*2
mov ah,1 ;对颜色产生变化
mov al,2
mov cx,8
tree1:
mov es:[bx+di],ax
add bx,160
sub di,4
inc ah
call sleep
loop tree1
sub bx,160
add di,4
mov ah,1
mov cx,6
tree2:
add di,4
mov es:[bx+di],ax
inc ah
call sleep
loop tree2
mov ah,1
mov cx,10
tree3:
add bx,160
sub di,4
mov es:[bx+di],ax
inc ah
call sleep
loop tree3
mov ah,1
mov cx,10
tree4:
add di,4
mov es:[bx+di],ax
inc ah
call sleep
loop tree4
mov ah,1
mov cx,7
tree5:
add bx,160
mov es:[bx+di],ax
inc ah
call sleep
loop tree5
mov ah,1
mov cx,3
tree6:
add di,4
mov es:[bx+di],ax
inc ah
call sleep
loop tree6
;左半部分显示完毕
mov ah,1
mov cx,7
tree7:
sub bx,160
mov es:[bx+di],ax
inc ah
call sleep
loop tree7
mov ah,1
mov cx,10
tree8:
add di,4
mov es:[bx+di],ax
inc ah
call sleep
loop tree8
mov ah,1
mov cx,10
tree9:
sub bx,160
sub di,4
mov es:[bx+di],ax
inc ah
call sleep
loop tree9
mov ah,1
mov cx,6
tree10:
add di,4
mov es:[bx+di],ax
inc ah
call sleep
loop tree10
mov ah,1
mov cx,8
tree11:
mov es:[bx+di],ax
sub bx,160
sub di,4
inc ah
call sleep
loop tree11
;右半部分显示完毕
jmp start
mov ax,4c00h
int 21h
;显示等待时间
sleep:
push cx
mov cx,1
sleep0:
push cx
mov cx,0ffffh
sleep1:
mov ax,ax
loop sleep1
pop cx
loop sleep0
pop cx
ret
code ends
end start
程序设计项目十二
编写字符雨程序。参看demo6.gif示例。
提示:
(1)每列是一个单独的单元,在数据段中定义的数据要保证各列要显示的字符和开始显示的时机不一样。
(2)每一滴雨完全移出屏幕后,该雨滴所在列生成一个新的雨滴。
assume cs:code
data segment
db 0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0
db 0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,0
db 0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,1,1,0,1,0,0,1,1,0,0,0
db 0,1,0,0,0,0,0,1,0,1,1,1,0,0,0,1,0,0,0,0,1,0,1,1,0,1,0,0,0,1,1,0,1,0,0,1,1,0,0,0
db 0,1,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,0,0,1,1,0,1,0,1,1,1,0,0,0
db 1,1,0,0,1,0,0,1,0,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0,1,0,1,1,1,0,0,0
db 1,1,0,0,1,0,0,1,0,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,1,1,1,0,0,0
db 1,1,0,0,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,1,0,1,0,0,0,1,0,0,1,0,1,1,1,0,0,0
db 1,1,0,0,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,1,0,1,0,0,0,1,0,1,1,0,1,1,1,0,0,0
db 1,1,1,0,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,1,0,1,0,0,0,1,0,1,1,0,1,1,1,0,0,0
db 1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0,1,1,1,0,1,0
db 1,0,1,0,1,0,0,1,0,1,0,0,0,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1,0
db 1,0,1,0,1,0,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,1,1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,1,0
db 1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,1,0,0,1,1,0
db 1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,1,1,0
db 0,0,1,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,1,0,1,0,0,0,1,1,0
db 0,0,1,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,1,0,1,0,0,0,1,1,0
db 0,0,1,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,0,0,1,1,0
db 0,0,1,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,1,1,0
db 0,0,0,1,0,1,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,1,1,0
db 0,0,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0
db 0,0,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0
db 0,0,0,1,0,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0
db 0,0,0,1,0,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0
db 0,0,0,1,0,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov di,0
mov ax,stack
mov ss,ax
mov sp,10h
call clear_screen
call draw_rain
mov cx,5h
again:
push cx
call run_rain
pop cx
loop again
call over
run_rain:
mov di,0
mov cx,25
rrs0:
push cx
push di
mov cx,80
rrs1:
push cx
push di
mov ax,es:[di]
mov cx,24
rrs2:
add di,160
mov bx,es:[di]
mov es:[di],ax
mov ax,bx
loop rrs2
pop di
mov es:[di],ax
add di,2
pop cx
loop rrs1
call sleep_1s
pop di
pop cx
loop rrs0
ret
draw_rain:
mov di,0
mov si,0
mov bx,12h
mov cx,25
drs0:
push cx
push di
mov cx,40
drs1:
mov al,ds:[si]
cmp al,1
jne drpass
mov byte ptr es:[di],bl
mov byte ptr es:[di+1],02h
mov byte ptr es:[di+78],bh
mov byte ptr es:[di+79],02h
add bx,093h
drpass:
inc si
add di,2
loop drs1
pop di
add di,160
pop cx
loop drs0
ret
clear_screen:
push cx
push di
mov di,0
mov cx,25
cses0:
push cx
mov cx,80
cses1:
mov word ptr es:[di],0
add di,2
loop cses1
pop cx
loop cses0
pop di
pop cx
ret
sleep_1s:
push cx
mov cx,05h
sp10:
push cx
mov cx,0ffffh
sp11:
loop sp11
pop cx
loop sp10
pop cx
ret
over:
mov ax,4c00h
int 21h
code ends
end start
程序设计项目十三
编写左手逃生法则演示程序。参看demo7.gif示例。
提示:
(1)地图中只有三种元素:墙、通道、出口。设计地图时,要给不同的元素赋予不同的编码。
(2)什么情况下改变行进的方向。遇到这些情况后根据当前方向决定下一步方向变化的规律是什么。
(3)左手逃生法则简述:在一个有出入口,没有回路的迷宫中,一直保持左手贴着墙壁向前走,总能找到迷宫出口。
思考:
1、每一个点有多少属性?(位置、方向、四周的情况)
2、下一个点怎么得到?(上一个点的方向决定下一个点的位置,下一个点的方向由四周的情况判断)
3、怎么判断到达墙壁了?(用全局参数设置)
assume cs:code
map segment
db 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
db 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
db 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
db 1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1
db 1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1
db 1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1
db 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
db 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
db 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0
db 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,2
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1
db 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0
db 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0
db 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1
db 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0
map ends
data segment
dw 1 ;当前要画的点的方向 左1 上2 右3 下4
dw 0,0,0,0 ;下一个点的可行的方向 分别代表左上右下,0表示不可以,1表示可以
data ends
stack segment
dw 16 dup (0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,20h
call clear_screen
call draw_map
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
call lefthandrule
mov ax,4c00h
int 21h
lefthandrule:
mov di,2398 ;入口地址es:[di]
mov dh,14 ;向上移动14次,到达上墙,没有红色障碍物,但不能继续向上移动。以起点为基础控制上下移动行次数
mov dl,79 ;向左移动79次,到达左墙,没有红色障碍物,但不能继续向左移动。以起点为基础控制左右移动行次数
main:
mov ax,es:[di]
cmp ax,2020h
je findout ;若相等,则找到出口,退出zuoshourule
call draw_now ;画当前点
call get_next_position ;由当前点的方向得到下一个点的位置
call next_position_around ;下一点的位置四周的通行情况
call next_direction ;根据当前方向和around的情况确定下一个点的方向
call sleep
jmp main
findout:
ret
next_direction:
mov ax,ds:[0]
cmp ax,1
je now_direction_left
cmp ax,2
je now_direction_up
cmp ax,3
je now_direction_right
cmp ax,4
je now_direction_down
next_direction_over:
ret
now_direction_left:
mov ax,ds:[8]
cmp ax,1
je next_direction_down
mov ax,ds:[2]
cmp ax,1
je next_direction_left
jmp next_direction_up
now_direction_up:
mov ax,ds:[2]
cmp ax,1
je next_direction_left
mov ax,ds:[4]
cmp ax,1
je next_direction_up
jmp next_direction_right
now_direction_right:
mov ax,ds:[4]
cmp ax,1
je next_direction_up
mov ax,ds:[6]
cmp ax,1
je next_direction_right
jmp next_direction_down
now_direction_down:
mov ax,ds:[6]
cmp ax,1
je next_direction_right
mov ax,ds:[8]
cmp ax,1
je next_direction_down
jmp next_direction_left
next_direction_left:
mov word ptr ds:[0],1
jmp next_direction_over
next_direction_up:
mov word ptr ds:[0],2
jmp next_direction_over
next_direction_right:
mov word ptr ds:[0],3
jmp next_direction_over
next_direction_down:
mov word ptr ds:[0],4
jmp next_direction_over
next_position_around: ;函数返回,data段中下一点的可行的方向确定完毕
call position_left
call position_up
call position_right
call position_down
ret
position_left:
push di
cmp dl,0 ;先将dl的值与零做比,为零则到达左墙,不可向左
je cannot_left
sub di,2
mov ax,es:[di]
cmp ax,0
je can_left ;若零,则为通道,可以向左
cmp ax,2020h
je can_left ;若2020h,则找到出口,可以向左
cannot_left:
mov word ptr ds:[2],0
jmp position_left_over
can_left:
mov word ptr ds:[2],1
position_left_over:
pop di
ret
position_up:
push di
cmp dh,0
je cannot_up
sub di,160
mov ax,es:[di]
cmp ax,0
je can_up
cmp ax,2020h
je can_up
cannot_up:
mov word ptr ds:[4],0
jmp position_up_over
can_up:
mov word ptr ds:[4],1
position_up_over:
pop di
ret
position_right:
push di
cmp dl,79
je cannot_right
add di,2
mov ax,es:[di]
cmp ax,0
je can_right
cmp ax,2020h
je can_right
cannot_right:
mov word ptr ds:[6],0
jmp position_right_over
can_right:
mov word ptr ds:[6],1
position_right_over:
pop di
ret
position_down:
push di
cmp dh,24
je cannot_down
add di,160
mov ax,es:[di]
cmp ax,0
je can_down
cmp ax,2020h
je can_down
cannot_down:
mov word ptr ds:[8],0
jmp position_down_over
can_down:
mov word ptr ds:[8],1
position_down_over:
pop di
ret
get_next_position: ;函数返回,以es:[di]表示为下一点的位置
mov ax,ds:[0]
cmp ax,1
je next_position_left
cmp ax,2
je next_position_up
cmp ax,3
je next_position_right
cmp ax,4
je next_position_down
next_position_over:
ret
next_position_left:
sub di,2
sub dl,1 ;记录向左移动一次,dl减一,dl为零则不可再向左移动
jmp next_position_over
next_position_up:
sub di,160
sub dh,1 ;记录向上移动一次,dh减一,dh为零则不可再向上移动
jmp next_position_over
next_position_right:
add di,2
add dl,1 ;记录向右移动一次,dl加一,dl为79则不可再向右移动
jmp next_position_over
next_position_down:
add di,160
add dh,1 ;记录向下移动一次,dh加一,dh为24则不可再向下移动
jmp next_position_over
draw_now:
mov ax,ds:[0]
cmp ax,1
je draw_now_left
cmp ax,2
je draw_now_up
cmp ax,3
je draw_now_right
cmp ax,4
je draw_now_down
draw_now_over:
mov es:[di],ax
ret
draw_now_left:
mov ax,0611h
jmp draw_now_over
draw_now_up:
mov ax,061eh
jmp draw_now_over
draw_now_right:
mov ax,0610h
jmp draw_now_over
draw_now_down:
mov ax,061fh
jmp draw_now_over
draw_map:
mov ax,map
mov ds,ax
mov si,0
mov ax,0b800h
mov es,ax
mov di,0
mov cx,80*25
drawmap:
mov al,ds:[si]
cmp al,0
je drawmapnext ;0则为通道,不做处理
cmp al,2
je drawmapout ;2则为出口,绿底空格表示
mov word ptr es:[di],4020h ;1则为内墙,红底空格表示
jmp drawmapnext
drawmapout:
mov word ptr es:[di],2020h ;2则为出口,绿底空格表示
drawmapnext:
inc si
add di,2
loop drawmap
ret
clear_screen:
mov ax,0b800h
mov es,ax
mov di,0
mov ax,0
mov cx,80*25
clear:
mov es:[di],ax
add di,2
loop clear
ret
sleep:
push cx
mov cx,1
sleep0:
push cx
mov cx,0ffffh
sleep1:
mov ax,ax
loop sleep1
pop cx
loop sleep0
pop cx
ret
code ends
end start