资源描述
data segment ;定义数据段
buff1 db 0 ;
buff2 db 0 ;用来判断笑脸模式的输出方式
buff3 db 0 ;
line1 db 2,2,1,1,1,1,'$'
line2 db 1,1,2,2,1,1,'$' ;
line3 db 1,1,1,1,2,2,'$' ;笑脸内容3
line4 db 3,3,6,6,6,6,'$' ;黑红桃1
line5 db 6,6,3,3,6,6,'$' ;黑红桃2
line6 db 6,6,6,6,3,3,'$' ;黑红桃3
str1 db 'Today is:<' ;输出日期前的提示字符串
str2 db 2 dup(0),'/' ;存放月份
str3 db 2 dup(0),'/' ;存放日期
str4 db 4 dup(0),'>$' ;存放年份
str5 db 2 dup(0),':' ;存放小时
str6 db 2 dup(0),':' ;存放分钟
str7 db 2 dup(0),'$' ;存放秒钟
str8 db 'Now the time is:$' ;输出时间前的提示字符串
month db 0 ;当前月的缓存区域
day db 0 ;当前日的缓存区域
year dw 0 ;当前年的缓存区域
hour db 0 ;当前小时的缓存区域
hour2 db 0 ;刚开始计时时所提取的小时信息(固定)
hour3 db 0 ;缓存当前小时与固定小时之间的差值,即缓存hour-hour2的值
minute db 0 ;当前分钟的缓存区域
minute2 db 0 ;刚开始计时时所提取的分钟信息(固定)
minute3 db 0 ;缓存当前分钟与固定分钟之间的差值,即缓存minute-minute2的值
second db 0 ;当前秒钟的缓存区域
second2 db 0 ;刚开始计时时所提取的秒钟信息(固定)
second3 db 0 ;缓存当前秒钟与固定秒钟之间的差值,即缓存second-second2的值
time db '00:00:00$' ;计时信息的ASCII格式的字符串存放空间
sen1 db 'Press S to Start $' ;需要输出的提示信息
sen2 db 'Press R to Restart$' ;需要输出的提示信息
sen3 db 'Press C to Close $' ;需要输出的提示信息
sen4 db '07503$' ;需要输出的提示信息
sen5 db '071508$' ;需要输出的提示信息
sen6 db 'ShenXun$' ;需要输出的提示信息
sen7 db 'Press E to Exit $' ;需要输出的提示信息
sen9 db '********Enjoy Every Minute*****From Zero To Hero********$' ;需要输出的提示信息
tank db ' |',0ah,0dh
db ' __\--__|_',0ah,0dh
db ' [/ ',04,04,'02 ___|',0ah,0dh
db ' _____\______|/-----.',0ah,0dh
db ' /____________________| ',0ah,0dh
db ' / ',0ah,0dh
db ' ~~~~~~~~~~~~~~~~~ ',0ah,0dh
db ' -<-<-<@',0ah,0dh
db ' -<-<@--<-<-<@--<-<-<@',0ah,0dh,0ah,0dh
db ' Power of Tank VS Beauty of Flower!!!','$'
;待输出的坦克及一些其他信息
frame1 db 14,26 dup(0),14,'$' ;
frame2 db 14,26 dup(0),14,'$' ;
frame3 db 14,26 dup(0),14,'$' ;待
data ends
stack segment
stap1 db 100h dup(0)
stack ends
code segment public
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax ;将data的段基址赋给ds
mov ax,stack
mov ss,ax ;将code的段基址赋给ss
jmp begin ;跳转到begin
clear macro x,y,z,w,t,s ;清屏宏:向上滚屏
mov al,t ;t为滚动行数
mov ch,x ;x左上角行坐标
mov cl,y ;y左上角列坐标
mov dh,z ;z右下角行坐标
mov dl,w ;w右下角列坐标
mov bh,s ;s为颜色设置
mov ah,6h
int 10h
endm
gettime macro ;定义取时间的宏
mov ah,2ch
int 21h
endm
getdate macro ;定义取日期的宏
mov ah,2ah
int 21h
endm
disp macro x ;显示字符串的宏
mov dx,offset x
mov ah,09h
int 21h
endm
point macro x,y ;光标位置置于x行,y列的宏
mov dh,x
mov dl,y
mov bh,0
mov ah,02h
int 10h
endm
num2asc proc ;asc码转换
cmp ax,10 ;
jl next1
mov di,10
next: xor dx,dx
div di
add dx,'0'
dec bx
mov [bx],dl
or ax,ax
jnz next
jmp exit
next1: add al,30h
dec bx
mov [bx],al
mov al,'0'
dec bx
mov [bx],al
exit: ret
num2asc endp
transf macro x,y ;定义一个把提取到的月,日,时分秒都转换成asc数字并且赋给各自数组的宏
mov bx,offset x ;得到末尾地址,是指针指向最后一个数字区域的后面位置
xor ax,ax ;将ax清零
mov al,byte ptr y ;将y型数据(提取到的数据)放到al当中
call num2asc ;应用num2asc过程来进行数据转换
endm
begin: clear 0,0,24,79,0,09h ;全屏清屏,背黑,前蓝高亮
clear 5,26,9,54,5,0ah ;部分屏幕清屏,背黑,前绿高亮
point 6,26 ;调用光标宏,把光标位置设置在6,26(上一步清掉的屏幕内)
disp frame1 ;调用显示功能显示frame1
point 7,26 ; .
disp frame2 ; .
point 8,26 ; .
disp frame3 ;到此显示完框架
point 3,25 ;把光标位置设置在3,25
disp str8 ;
point 1,12 ;把光标位置设置在1,12
disp sen9 ;
point 2,30 ;把光标位置设置在2,30
getdate
mov byte ptr month,dh ;把月份存入month变量
mov byte ptr day,dl ;把日期存入day变量
mov word ptr year,cx ;把年份存入year变量
mov bx,offset str2+2 ;bx指向str2最后
xor ax,ax ;ax清零
mov al,byte ptr month ;把month中的数据读入al中
call num2asc ;调用num2sac子程序
mov bx,offset str3+2 ;bx指向str3最后
xor ax,ax ;ax清零
mov al,byte ptr day ;把day中的数据读入al中
call num2asc ;调用num2sac子程序
mov bx,offset str4+4 ;bx指向str4最后
mov ax,word ptr year ;把year中的数据读入al中
call num2asc ;调用num2sac子程序
disp str1 ;显示从str1开始的字符,即显示日期
point 6,30 ;把光标位置设置在6,30
disp sen1 ;显示提示字符
point 7,30 ;把光标位置设置在7,30
disp sen7 ;显示提示字符
begin1: gettime ;取时间
mov byte ptr hour,ch ;把小时存入hour变量
mov byte ptr minute,cl ;把分钟存入minute变量
mov byte ptr second,dh ;把秒钟存入second变量
mov bx,offset str5+2 ;bx指向str5最后
xor ax,ax ;ax清零
mov al,byte ptr hour ;把hour中的数据读入al中
call num2asc ;调用num2sac子程序
mov bx,offset str6+2 ;bx指向str6最后
xor ax,ax ;ax清零
mov al,byte ptr minute ;把minute中的数据读入al中
call num2asc ;调用num2sac子程序
mov bx,offset str7+2 ;bx指向str7最后
mov al,byte ptr second ;把second中的数据读入al中
call num2asc ;调用num2sac子程序
point 3,43 ;把光标位置设置在3,43
disp str5 ;把str5的内容显示出来
point 11,35 ;把光标位置设置在11,35
mov si,offset buff3 ;把buff3的偏移量给si
cmp byte ptr [si],01h ;判断当前buff3里面的值是否为1
je color ;是就跳转color
cmp byte ptr [si],02h ;判断当前buff3里面的值是否为2
je color1 ;是就跳转color1
cmp byte ptr [si],03h ;判断当前buff3里面的值是否为3
je color20 ;是就跳转color20
cmp byte ptr [si],04h ;判断当前buff3里面的值是否为4
je color30 ;是就跳转color30
clear 11,0,24,79,14,0ch ;清屏,从11行起的下面全部屏幕,背黑前红
disp sen4 ;显示班级
point 12,0 ;把光标位置设置在12,0
disp tank ;显示tank图案
inc buff3 ;buff3自增1
jmp continue
color: clear 11,0,24,79,14,0dh ;清屏,从11行起的下面全部屏幕,背黑前绛
disp sen5 ;显示学号
point 12,0 ;把光标位置设置在12,0
disp tank ;显示tank图案
inc buff3 ;buff3自增1
jmp continue
color20:jmp color2 ;跳转长度有限,专门设置的中转跳转站
color30:jmp color3 ;跳转长度有限,专门设置的中转跳转站
color1: clear 11,0,24,79,14,0ah ;清屏,从11行起的下面全部屏幕,背黑前绿
disp sen6 ;显示姓名
point 12,0 ;把光标位置设置在12,0
disp tank ;显示tank图案
inc buff3 ;buff3自增1
jmp continue
color2: clear 11,0,24,79,14,0fh ;清屏,从11行起的下面全部屏幕,背黑前灰
disp sen6 ;显示姓名
point 12,0 ;把光标位置设置在12,0
disp tank ;显示tank图案
inc buff3 ;buff3自增1
jmp continue
color3: clear 11,0,24,79,14,0eh ;清屏,从11行起的下面全部屏幕,背黑前褐
disp sen6 ;显示姓名
point 12,0 ;把光标位置设置在12,0
disp tank ;显示tank图案
mov byte ptr buff3,0h ;buff3清零
continue:mov si,offset buff1 ;把buff1的偏移量给si
cmp byte ptr [si],01 ;判断[si],也就是Buff1里面的数据是否为1
je timing2 ;为1的话继续计时
mov ah,1 ;判断是否有键盘输入的程序
int 16h
jnz timing1 ;如果有的话跳转到timing1
mov si,offset buff2
cmp byte ptr [si],0 ;判断buff2的值是否为0
je l3
cmp byte ptr [si],1 ;判断buff2的值是否为1
je l4
point 4,37
disp line6
mov byte ptr [si],0h ;buff2中数据清零
jmp g2
l3: point 4,37
disp line4
inc byte ptr [si] ;buff2自增1
jmp g2
l4: point 4,37
disp line5
inc byte ptr [si] ;buff2自增1
g2:
jug1: gettime ;取时间
mov al,byte ptr second ;
cmp al,dh ;判断秒有没有变化
je jug1 ;不变化一直循环,直至变化
jmp begin1 ;返回begin1,继续取时间显示
timing1:mov ah,8 ;读取键盘输入的ASCII值到al里面
int 21h
cmp al,'e' ;输入的是e,则退出程序
je endi
cmp al,'E' ;E也退出程序
je endi
cmp al,'s' ;输入的是s,则开始计时程序
je zero0
cmp al,'S' ;S开始计时
je zero0
jmp begin1 ;如果输入不满足要求程序继续循环
timing2:point 6,30 ;计时程序开始,定光标位置
disp sen2 ;显示提示字符
point 8,30 ;
disp sen3 ;显示提示字符
mov si,offset buff2 ;从这一句到l2结束,即273行,意在输出变化的黑红桃
cmp byte ptr [si],0 ;判断buff2的值是否为0
je l1
cmp byte ptr [si],1 ;判断buff2的值是否为1
je l2
point 4,37
disp line3
mov byte ptr [si],0h
jmp g3
l1: point 4,37
disp line1
inc byte ptr [si]
jmp g3
endi: jmp ending
l2: point 4,37
disp line2
inc byte ptr [si] ;以上输出不在赘述,算法与前面输出变化的笑脸一样
jmp g3
zero0: jmp zero ;中转
g3: mov ah,1 ;判断有没有字符从键盘输入
int 16h
jnz g ;有的话跳转到g进行判断
jmp g1 ;没有的话掠过到g1
g: mov ah,8 ;读取键盘输入的ASCII值到al里面
int 21h
cmp al,'e'
je endin
cmp al,'E'
je endin
cmp al,'r'
je zero0
cmp al,'R'
je zero0
cmp al,'c'
je cancel1
cmp al,'C'
je cancel1
g1: gettime
mov byte ptr hour,ch ;把小时存入hour变量
mov byte ptr minute,cl ;把分钟存入minute变量
mov byte ptr second,dh ;把秒钟存入second变量
mov ah,byte ptr second ;
sub ah,byte ptr second2 ;求新提取的秒与之前“固定”的值做差值,并将差值赋给ah中
jge c1 ;差值大于等于0则跳转到c1
dec byte ptr minute ;提取的分钟减一,实际为被借了一位
add ah,60 ;调整负数秒为正
jmp c1
endin: jmp ending ;中转
cancel1:jmp cancel ;中转
c1: mov byte ptr second3,ah ;将差值保存起来
mov ah,byte ptr minute
sub ah,byte ptr minute2 ;求分钟的差值
jge c2
dec byte ptr hour ;若为负,向hour借位
add ah,60 ;负数修正
c2: mov minute3,ah
mov ah,byte ptr hour
sub ah,byte ptr hour2
jge c3
add ah,24
c3: mov hour3,ah
transf time+2,hour3 ;asc码转换,并放到指定位置
transf time+5,minute3 ;asc码转换,并放到指定位置
transf time+8,second3 ;asc码转换,并放到指定位置
point 9,36 ;指定光标位置
disp time ;输出显示计时
mov byte ptr buff1,01h
jug: gettime ;判断秒有无变化的延时,与jug1一样
mov al,byte ptr second
cmp al,dh
je jug
jmp begin1
mov ah,01 ;等待键盘输入,使屏幕等待
int 21h
jmp ending
cancel: mov si,offset buff1 ;下面的语句键入c后的清屏并显示需要的提示符
mov byte ptr [si],00h
clear 9,35,9,45,1,09h
point 6,30
disp sen1
point 7,30
disp sen7
clear 8,28,8,50,1,0ah
jmp begin
zero: gettime
mov byte ptr hour2,ch ;把采集好的小时数赋给hour2的字节储存空间
mov byte ptr minute2,cl ;同理把分钟数据给minute2
mov byte ptr second2,dh ;把秒数据给second2
mov byte ptr buff1,01h
jmp begin1
ending: mov ah,4ch
int 21h
code ends
end start
展开阅读全文