汇编语言程序设计项目完整代码及详细解析

汇编语言程序设计项目完整代码及详解解释

建议先自己思考问题的答案,不懂则返回看书

程序设计项目一
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
  • 27
    点赞
  • 232
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值