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 cmp byte ptr [si],0 je l1
cmp byte ptr [si],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 jmp g1 g: mov ah,8 int 21h cmp al,'e' je endin cmp al,'E'
;如果输入不满足要求程序继续循环 ;计时程序开始,定光标位置 ;显示提示字符 ;
;显示提示字符
;从这一句到l2结束,即273行,意在输出变化的黑红桃;判断buff2的值是否为0 ;判断buff2的值是否为1 ;以上输出不在赘述,算法与前面输出变化的笑脸一样 ;中转
;判断有没有字符从键盘输入 ;有的话跳转到g进行判断 ;没有的话掠过到g1
;读取键盘输入的ASCII值到al里面 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
因篇幅问题不能全部显示,请点此查看更多更全内容