王爽汇编程序设计项目
程序设计项目一
data segment
dw ?
data ends
end
要求:
只在定义的数据段'?'中加入相关的内容,使得上面的程序可以在屏幕中间显示一个绿色的字符'A'。
汇编源程序设计如下:
assume cs:data
data segment
dw 61h
start:mov ax,data
mov ds,ax
mov bx,0
mov ax,0b800h
mov es,ax
mov cx,0
mov cl,ds:[bx]
mov ch,00000010b
mov es:[2000],cx
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 ds:cryptography,cs:code
cryptography segment
db 'tqsfbe!zpvs!xjoht'
db '!!cf!zpvs!nbtufs!'
cryptography ends
plainText segment
db 34 dup ('0')
plainText ends
code segment
start:mov ax,cryptography
mov ds,ax
mov bx,0
mov di,34
mov ax,0b800h
mov es,ax
mov cx,0
mov al,0
mov cx,34
s: mov al, ds:[bx]
dec al
mov ds:[di],al
inc bx
inc di
loop s
mov di,34
mov bx,46 //列
mov si,1920 //行
mov cx,34
s1: mov ah,01110001b
mov al,ds:[di]
inc di
mov es:[si+bx],ax
inc si
inc si
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 ds:calculate,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 64 dup (0)
stack ends
code segment
start:mov ax,calculate
mov ds,ax
mov di,3
mov ax,stack
mov ss,ax
mov sp,128
mov ax,0b800h
mov es,ax
mov si,0
mov bx,1504
mov cx,4
s:push cx
mov ah,0
mov al,ds:[di]
call jian0
inc di
mov ch,0
mov cl,ds:[di]
push cx
mov dl,cl
call chufapanduan
mov cl,dl
jcxz chufa
k1:pop cx
push cx
mov dl,cl
call jianfapanduan
mov cl,dl
jcxz jianfa
k3:pop cx
push cx
mov dl,cl
call jiafapanduan
mov cl,dl
jcxz jiafa
k2:pop cx
pop cx
add di,12
loop s
mov cx,0
mov cx,4
g2:push cx
mov cx,16
g1:mov ah,01110001b
mov al,ds:[si]
inc si
mov es:[bx],ax
inc bx
inc bx
loop g1
add bx,128
pop cx
loop g2
mov ax,4c00h
int 21h
chufa:push ax
inc di
mov ch,0
mov cl,ds:[di]
mov al,cl
call jian0
mov cl,al
pop ax
div cl
inc di
inc di
add al,30h
mov ds:[di],al
jmp short k1
jiafa:push ax
inc di
mov ch,0
mov cl,ds:[di]
mov al,cl
call jian0
mov cl,al
pop ax
add al,cl
add al,30h
inc di
inc di
mov ds:[di],al
jmp short k2
jianfa:push ax
inc di
mov ch,0
mov cl,ds:[di]
mov al,cl
call jian0
mov cl,al
pop ax
s5:dec al
loop s5
add al,30h
inc di
inc di
mov ds:[di],al
jmp short k3
jian0:
mov cx,30h
s1:dec al
loop s1
ret
chufapanduan:mov cx,2fh
s2:dec dl
loop s2
ret
jianfapanduan:mov cx,2dh
s3:dec dl
loop s3
ret
jiafapanduan:mov cx,2bh
s4:dec dl
loop s4
ret
code ends
end start
结果:
学会了:
分别设计了三个子程序分别用于除法、减法、加法的判断
通过哪种判断就执行哪种计算方法
从data段的段地址di=3开始扫描
下一行是3+16 、3+16+16以此下去
结果保存等式=后面
最后显示在屏幕中间
程序设计项目四
编程计算x(x>2)的y(y>2)次方。使用add指令实现。
另,若学到第10章,使用两种方式实现:
(1)只使用add指令实现;
(2)只使用mul指令实现;
并将计算式显示在屏幕中央。
例如:
计算4的3次方。在屏幕中央显示格式如下:
4
^
3
-----
64
注意:结果不能超过16位寄存器可存储的最大值。
汇编源程序设计如下:
1、只使用add指令实现
assume cs:code
code segment
start:mov ax,0b800h
mov es,ax
mov si,1504
mov ax,2
mov dx,3
push dx
push ax
mov di,ax
dec dx
mov cx,dx
mov dx,ax
s1:push cx
mov bx,ax
dec ax
mov cx,ax
inc ax
mov ax,dx
mov bx,dx
s2:add ax,bx
loop s2
pop cx
mov dx,ax
mov ax,di
loop s1
mov ax,dx
mov cx,ax
pop ax
pop dx
add ax,30h
mov ah,00000001b
add dx,30h
mov dh,00000001b
mov es:[si],ax
add si,160
mov bh,00000001b
mov bl,5eh
mov word ptr es:[si],bx
add si,160
mov es:[si],dx
add si,158
mov bh,00000001b
mov bl,2dh
mov word ptr es:[si],bx
add si,2
mov word ptr es:[si],bx
add si,2
mov word ptr es:[si],bx
add si,2
mov word ptr es:[si],bx
add si,156
mov di,0
mov ax,cx
mov bx,10
h:mov dx,0
div bx
push dx
inc di
mov cx,ax
jcxz ok1
jmp short h
ok1:mov cx,di
h1: pop dx
add dx,30h
mov dh,00000001b
mov es:[si],dx
add si,2
loop h1
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 tomeet you!';
(3)在屏幕正中打印处理好后的数据。
完成程序后思考:
(1)如何设计程序,程序代码量最少;
(2)如何设计程序,程序执行速度最快;
(3)如何设计程序,使得程序具有通用性。
注意:
(1)'?'、'!'和空格分别假定为字符串的结束符、一句话的最后的标点和单词间的间隔符,都不属于干扰符号。
(2)这里的通用性是指:任意带有其他符号干扰的一组字符串都能够通过程序被处理为具有如下特点的英文段落:段落中只包含字母、空格、'!'三种符号。段落中的每句话都是以开头字母为大写,'!'为结束标点的句子。
汇编源程序设计如下:
assume cs:code
data segment
db 'h12E3321@L#o*&^!88nI@cE$T1o m33E44E55t y77o88u!()'
db '?'
data ends
stack segment
dw 64 dup (0)
stack ends
code segment
start:mov ax,data
mov ds,ax
mov si,0
mov ax,0b800h
mov es,ax
mov di,1440
mov ah,0
mov bh,0
s:mov al,ds:[si]
inc si
mov ah,0
mov dl,al
call zifu
jcxz xianshizifu
zf:mov ah,0
mov al,dl
call gan
jcxz xianshigan
gg:mov ah,0
mov al,dl
call kongge
jcxz xianshikong
kk:mov ah,0
mov al,dl
call wenhao
jcxz j
jmp short s
xianshizifu:
mov al,dl
mov ch,0
add bh,1
dec bh
dec bh
mov cl,bh
jcxz daxie
or al,00100000b
hh1:mov ah,00000001b
mov es:[di],ax
add di,2
jmp short zf
daxie:mov ch,0
mov cl,20h
da:dec al
loop da
mov bh,1
jmp short hh1
xianshigan:mov al,dl
mov ah,00000001b
mov es:[di],ax
add di,2
mov bh,0
jmp short gg
xianshikong:mov al,dl
mov ah,00000001b
mov es:[di],ax
add di,2
jmp short kk
j:mov ax,4c00h
int 21h
zifu:
or al,00100000b
mov ch,0
mov cl,60h
z1:dec al
loop z1
mov cl,26
z2:mov bl,cl
dec al
mov cl,al
jcxz z3
mov cl,bl
loop z2
jmp short z4
z3:add bh,1
z4:mov cl,al
ret
gan:mov ch,0
mov cl,21h
g1:dec al
loop g1
mov cl,al
ret
kongge:mov ch,0
mov cl,20h
kong1:dec al
loop kong1
mov cl,al
ret
wenhao:mov ch,0
mov cl,3fh
w1:dec al
loop w1
mov cl,al
ret
code ends
end start
此程序也是建立在项目三的基础上的,分别建四个子程序判断字符、
空格、感叹号、问号。
难点是:如何使每一句子开头的字母大写,句子与感叹号‘!’为结尾
问号‘?’结束
程序设计项目六
在屏幕中间显示:“中华”两个字。参看demo0.png示例。
提示:
通过字模提取工具,可以提取字的显示信息。assume ds:data,cs:code
data segment
db 0,0,0,0,0,0,0,0,0,0,0,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,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0
db 1,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,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1
db 1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1
db 1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1
db 1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1
db 1,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,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0
db 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,0,0,0,0
db 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0
db 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,1,1,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0
db 0,0,1,1,0,0,0,1,1,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0
db 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0
db 0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 1,1,1,1,1,1,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,0,0,0,0,0,0,0,0,0,0,0,1,1,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,1,1,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,1,1,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,1,1,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
data ends
stack segment
dw 64 dup (0)
stack ends
code segment
start:mov ax,0b800h
mov es,ax
mov dl,160
mov al,16
mul dl
mov di,ax
add di,20
mov ax,stack
mov ss,ax
mov sp,64
mov ax,data
mov ds,ax
mov si,0
call qingp
mov bh,16
mov bl,25
call zhong
mov di,0
mov dl,160
mov al,16
mul dl
mov di,ax
add di,80
mov bh,16
mov bl,30
call hua
jmp short ok
zhong:
mov ch,0
mov cl,bh
s2:push cx
mov ch,0
mov cl,bl
s1:push cx
mov ch,0
mov cl,ds:[si]
inc si
jcxz buxianshi
mov ax, 0403h
mov es:[di],ax
add di,2
fh:pop cx
loop s1
add di,110
pop cx
loop s2
ret
buxianshi:mov ax,0000h
mov es:[di],ax
add di,2
jmp short fh
hua:
mov ch,0
mov cl,bh
s3:push cx
mov ch,0
mov cl,bl
s4:push cx
mov ch,0
mov cl,ds:[si]
inc si
jcxz buxianshi1
mov ax, 0403h
mov es:[di],ax
add di,2
fh1:pop cx
loop s4
add di,100
pop cx
loop s3
ret
buxianshi1:mov ax,0000h
mov es:[di],ax
add di,2
jmp short fh1
qingp:push cx
push di
mov di,0
mov cx,9000
mov ax,0000h
k1: mov es:[di],ax
add di,2
loop k1
pop di
pop cx
ret
ok:mov ax,4c00h
int 21h
code ends
end start
(完)
assume ds:data,cs:code
data segment
db 0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0
db 0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0
db 0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0
db 0,0,0,0,0,0,1,0,0,1,0,0,1,0,1,0,1,0,0,0,0
db 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0
db 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0
db 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0
db 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0
db 1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0
db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0
db 1,0,0,0,2,0,0,0,0,0,3,0,0,0,0,2,0,0,0,1,0
db 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0
db 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0
data ends
stack segment
dw 64 dup (0)
stack ends
code segment
start:mov ax,0b800h
mov es,ax
mov dl,160
mov al,6
mul dl
mov di,ax
add di,60
mov ax,stack
mov ss,ax
mov sp,64
mov ax,data
mov ds,ax
mov si,0
mov bh,15
mov bl,21
call qingp
xun: call xunhuan
xunhuan:
mov ah,02h
call tuxing
call cpudeng
call cpudeng
call cpudeng
mov si,0
mov di,1020
mov ah,01h
call tuxing
call cpudeng
call cpudeng
call cpudeng
mov si,0
mov di,1020
mov ah,03h
call tuxing
call cpudeng
call cpudeng
call cpudeng
mov si,0
mov di,1020
mov ah,04h
call tuxing
call cpudeng
call cpudeng
call cpudeng
mov si,0
mov di,1020
jmp short xun
ret
jmp short ok
cpudeng: push cx
push ax
mov cx,0ffffh
k2:mov ax,0000h
mov es:[0],ax
loop k2
pop ax
pop cx
ret
tuxing:
push cx
mov ch,0
mov cl,bh
s2:push cx
mov ch,0
mov cl,bl
s1:push cx
mov ch,0
mov cl,ds:[si]
inc si
jcxz xianshidian
dec cx
jcxz xianshixing
dec cx
jcxz jiuwo
dec cx
jcxz xianshizui
fh3:
fh2:
fh1:
fh:pop cx
loop s1
add di,118
pop cx
loop s2
pop cx
ret
xianshidian:
mov al,2eh
mov es:[di],ax
add di,2
jmp short fh
xianshixing:mov al,2ah
mov es:[di],ax
add di,2
jmp short fh1
jiuwo: mov al,03h
mov es:[di],ax
add di,2
jmp short fh2
xianshizui:mov al,04h
mov es:[di],ax
add di,2
jmp short fh3
qingp:push cx
push di
mov di,0
mov cx,9000
mov ax,0000h
k1: mov es:[di],ax
add di,2
loop k1
pop di
pop cx
ret
ok:mov ax,4c00h
int 21h
code ends
end start
实现笑脸阶梯走效果。参看demo2.gif示例。
源代码(此代码在DOSBox下不能运行,在真实的DOS下能运行)
assume cs:code
stack segment
dw 64 dup (0)
stack ends
code segment
start:mov ax,0b800h
mov es,ax
mov dl,160
mov al,8
mul dl
mov di,ax
add di,80
mov ax,stack
mov ss,ax
mov sp,64
call qingp
call xianshi
mov dl,160
mov al,19
mul dl
mov di,ax
mov cx,3
k6:push cx
mov cx,20
k5:push cx
mov ax,0204h
mov es:[di],ax
call cpudeng
mov ax,0000h
mov es:[di],ax
add di,2
pop cx
loop k5
call dec1
pop cx
loop k6
dec1: mov cx,960
k7: push cx
dec di
pop cx
loop k7
ret
jmp short ok
cpudeng:push cx
push ax
mov cx,1000
k8:push cx
mov cx,0ffffh
k4:push cx
mov ax,0000h
mov es:[0],ax
pop cx
loop k4
pop cx
loop k8
pop ax
pop cx
ret
xianshi:mov cx,3
k2:push cx
mov cx,20
k3:push cx
mov ax,022eh
mov es:[di],ax
add di,2
pop cx
loop k3
add di,880
pop cx
loop k2
ret
qingp:push cx
push di
mov di,0
mov cx,9000
mov ax,0000h
k1:mov es:[di],ax
add di,2
loop k1
pop di
pop cx
ret
ok:mov ax,4c00h
int 21h
code ends
end start
程序设计项目九
将ASCII码按顺序在屏幕上竖列显示。参看demo3.gif示例。
要求:
(1)逐个显示字符,相邻的两个字符之间显示要有时间间隔。
(2)字符颜色为绿色。
(3)每列显示20个字符,列间距为5个字符。显示完128个ASCII码,共需7列。
assume cs:code
stack segment
dw 64 dup (0)
stack ends
code segment
start:mov ax,0b800h
mov es,ax
mov dl,160
mov al,4
mul dl
mov di,ax
add di,120
mov ax,stack
mov ss,ax
mov sp,64
call qingp
call zifu
ok:
tuichu:
call qingp
mov di,0
mov dl,160
mov al,4
mul dl
mov di,ax
add di,120
call zifu
jmp short ok
zifu:
mov ah,00h
mov al,00h
mov cx,134
k5:
mov bx,cx
mov cx,20
k4:push cx
mov es:[di],ax
call cpudeng
call cpudeng
add di,160
mov ah,02h
dec bx
mov cx,bx
jcxz tuichu
add al,1
pop cx
loop k4
call jdi
mov cx,bx
loop k5
ret
jdi:push cx
mov cx,3210
k7:
dec di
loop k7
pop cx
ret
cpudeng:push cx
push ax
mov cx,1000
k1:push cx
mov cx,0ffffh
k2:push cx
mov ax,0000h
mov es:[0],ax
pop cx
loop k2
pop cx
loop k1
pop ax
pop cx
ret
qingp:push cx
push di
mov di,0
mov cx,9000
mov ax,0000h
k3:mov es:[di],ax
add di,2
loop k3
pop di
pop cx
ret
mov ax,4c00h
int 21h
code ends
end start
程序设计项目十
在屏幕上斜着显示三个‘happy spring festival!’,字符串的颜色分别为蓝色、绿色和红色,并且各个字符串的颜色按规律变换。参看demo4.gif示例。
源代码
assume cs:code
data segment
db 'happy spring festival!',0
data ends
stack segment
dw 64 dup (0)
stack ends
code segment
start:mov ax,0b800h
mov es,ax
mov dl,160
mov al,3
mul dl
mov di,ax
add di,40
mov ax,stack
mov ss,ax
mov sp,64
mov ax,data
mov ds,ax
mov si,0
call qingp
k6:
mov bh,02h
mov bl,03h
mov al,04h
mov cx,3
k5:
push cx
mov ah,bh
mov di,520
mov si,0
call xianshi3
mov ah,bl
mov di,514
mov si,0
call xianshi2
mov ah,al
mov di,508
mov si,0
call xianshi1
push bx
mov bh,bl
mov bl,al
pop cx
mov al,ch
call cpudeng
call cpudeng
pop cx
loop k5
jmp short k6
xianshi1:push ax
push cx
mov cx,0
s1:
mov al,ds:[si]
mov cl,al
jcxz tuichu1
mov es:[di],ax
inc si
add di,164
jmp short s1
tuichu1:
pop cx
pop ax
ret
xianshi2:push ax
push cx
mov cx,0
s2:
mov al,ds:[si]
mov cl,al
jcxz tuichu2
mov es:[di],ax
inc si
add di,164
jmp short s2
tuichu2:
pop cx
pop ax
ret
xianshi3:push ax
push cx
mov cx,0
s3:
mov al,ds:[si]
mov cl,al
jcxz tuichu3
mov es:[di],ax
inc si
add di,164
jmp short s3
tuichu3:
pop cx
pop ax
ret
cpudeng:push cx
push ax
mov cx,1000
k1:push cx
mov cx,0ffffh
k2:push cx
mov ax,0000h
mov es:[0],ax
pop cx
loop k2
pop cx
loop k1
pop ax
pop cx
ret
qingp:push ax
push cx
push di
mov di,0
mov cx,9000
mov ax,0000h
k3:mov es:[di],ax
add di,2
loop k3
pop di
pop cx
pop ax
ret
code ends
end start
程序设计项目十一
动态画出一个棵七彩圣诞树。参看demo5.gif示例。
程序设计项目十二
编写字符雨程序。参看demo6.gif示例。
提示:
(1)每列是一个单独的单元,在数据段中定义的数据要保证各列要显示的字符和开始显示的时机不一样。
(2)每一滴雨完全移出屏幕后,该雨滴所在列生成一个新的雨滴。
源代码
assume cs:code
data segment
db 'ABCDEFGHIJKLNMOPQRSTUVWXYZ123456789ABCDE',0
data ends
stack segment
dw 64 dup (0)
stack ends
code segment
start:mov ax,0b800h
mov es,ax
mov di,0
mov ax,stack
mov ss,ax
mov sp,64
mov ax,data
mov ds,ax
mov si,0
ok:
call qingp
mov cx,1
push cx
call pingmu
mov bl,8
mov ax,80
call sd1
mov ax,1176
mov bl,6
call sd2
mov bl,10
mov ax,1352
call sd1
mov bl,10
mov ax,2760
call sd2
mov bl,8
mov ax,2956
call sd3
mov bl,2
mov ax,4080
call sd2
mov bl,9
mov ax,4088
call sd4
mov bl,10
mov ax,2812
call sd2
mov bl,10
mov ax,2684
call sd5
mov ax,1212
mov bl,6
call sd2
mov bl,8
mov ax,1068
call sd5
pop cx
jmp short ok
mov ax,4c00h
int 21h
sd1:push cx
push ax
mov cx,0
mov di,ax
mov cl,bl
mov ah,17
sh1:push cx
mov al,01h
mov es:[di],ax
add di,156
add ah,17
call cpudeng
call cpudeng
pop cx
loop sh1
pop cx
pop ax
ret
sd2:push cx
push ax
mov cx,0
mov di,ax
mov cl,bl
mov ah,17
sh2:push cx
mov al,01h
mov es:[di],ax
add di,4
add ah,17
call cpudeng
call cpudeng
pop cx
loop sh2
pop cx
pop ax
ret
sd3:push cx
push ax
mov cx,0
mov di,ax
mov cl,bl
mov ah,17
sh3:push cx
mov al,01h
mov es:[di],ax
add di,160
add ah,17
call cpudeng
call cpudeng
pop cx
loop sh3
pop cx
pop ax
ret
sd4:push cx
push ax
mov cx,0
mov di,ax
mov cl,bl
mov ah,17
sh4:push cx
mov al,01h
mov es:[di],ax
call j160
add ah,17
call cpudeng
call cpudeng
pop cx
loop sh4
pop cx
pop ax
ret
sd5:push cx
push ax
mov cx,0
mov di,ax
mov cl,bl
mov ah,17
sh5:push cx
mov al,01h
mov es:[di],ax
call j164
add ah,17
call cpudeng
call cpudeng
pop cx
loop sh5
pop cx
pop ax
ret
j164:push ax
push cx
mov cx,164
x6:dec di
loop x6
pop cx
pop ax
ret
j160:push ax
push cx
mov cx,160
x5:dec di
loop x5
pop cx
pop ax
ret
pingmu:push ax
push cx
push bx
mov bx,0
mov ax,4004
mov cx,26
x3: push cx
mov di,bx
call xianxia
mov bx,di
mov di,ax
call xianshang
call j320
mov ax,di
call cpudeng
call cpudeng
pop cx
loop x3
pop bx
pop cx
pop ax
ret
j320:push ax
push cx
mov cx,320
x4:dec di
loop x4
pop cx
pop ax
ret
xianshang:push ax
push cx
mov si,1
x2:mov ah,02h
mov al,ds:[si]
mov cx,0
mov cl,al
jcxz ling2
mov es:[di],ax
add si,2
add di,8
loop x2
ling2:
pop cx
pop ax
ret
xianxia:push ax
push cx
mov si,0
x1:mov ah,02h
mov al,ds:[si]
mov es:[di],ax
mov cx,0
mov cl,al
jcxz ling1
add si,2
add di,8
loop x1
ling1:
pop cx
pop ax
ret
cpudeng:push bx
push cx
push ax
mov cx,1000
k1:push cx
mov cx,0ffffh
k2:push cx
mov ax,0000h
mov es:[5000],ax
pop cx
loop k2
pop cx
loop k1
pop ax
pop cx
pop bx
ret
qingp:push ax
push cx
push di
mov di,0
mov cx,9000
mov ax,0000h
k3:mov es:[di],ax
add di,2
loop k3
pop di
pop cx
pop ax
ret
code ends
end start
程序设计项目十三
编写左手逃生法则演示程序。参看demo7.gif示例。
提示:
(1)地图中只有三种元素:墙、通道、出口。设计地图时,要给不同的元素赋予不同的编码。
(2)什么情况下改变行进的方向。遇到这些情况后根据当前方向决定下一步方向变化的规律是什么。
(3)左手逃生法则简述:在一个有出入口,没有回路的迷宫中,一直保持左手贴着墙壁向前走,总能找到迷宫出口。