;simple calculagraph made by fanpei data segment;定义数据段 h2 db 0 h1 db 0 m2 db 0 m1 db 0 s2 db 0 s1 db 0 addition_5 db 0 ;6个为1组 sub_count db 0 ;判断18次 old_seg dw 0 ;存储原1ch的中断地址 old_off dw 0 ;存储原1ch的中断偏移 word_single db 0;判断是否有字符输出 is_go_on db 1 ;暂停用的标志 Tips db 0dh, 0ah ,"welcome to use my program,The different key will get different reflect." ,0dh, 0ah ;,0dh, 0ah 是换行的意思 db "such as that:" ,0dh, 0ah db "enter space to start" ,0dh, 0ah db "enter s to hold on" ,0dh, 0ah db "enter a to continue." ,0dh, 0ah db "enter g to get the system time" ,0dh, 0ah db "enter q to exit the program" ,0dh, 0ah ,'$' ps db 0dh, 0ah ," (^_^)", 62h,79h,20h,66h,61h,6eh,70h,65h,69h,21h,24h;字符串 by fanpei data ends stack_seg segment stack;定义堆栈段 db 250 dup(0) stack_seg ends code segment;代码段 assume cs:code,ds:data,ss:stack_seg main proc far mov ax,data mov ds,ax mov ax,0600h mov bh,3ah ;这里改变颜色 mov cx,0000h ;窗口的左上角坐标 mov dx,184fh ;窗口的右下角坐标 int 10h ;印刷窗口 mov dx,offset Tips ;这里输出文字 mov ah,09h int 21h mov dx,offset ps ;输出BY fanpei mov ah,09h int 21h l1:call enter_key ; 获取键盘字符 cmp word_single,1 ;判断是否有字符输出 je enter_q jmp l1 enter_q: cmp al,'q' ;判断是否获取的是Q je exit enter_space: cmp al,' ' jne enter_g call int_set ;更改1ch中断至我的函数 enter_g: cmp al,'g';获取的字符为G jne enter_s mov is_go_on,0 call get_system_time mov is_go_on,1 enter_s: cmp al,'s' ;判断是否获取的是s jne enter_a mov is_go_on,0 enter_a: cmp al,'a';判断是否获取的是a jne clear_single mov is_go_on,1 clear_single: mov word_single,0 ;清空 判断字符有输出的标志 jmp l1 exit: call int_repair ;修复1CH到原来的位置 mov ah,4ch int 21h main endp enter_key proc near mov ah,1 int 16h ;是否有字符输出 如果有,zf=1 jnz enter_key_1 mov ax,0ffh stc ret ;没有内容自动返回 enter_key_1: mov ah,7 int 21h mov ah,0 cmp al,0 jnz enter_key_2 ;输入的是ASCII码(AL) mov ah,7 int 21h ;取扩展ASCII码(非字符码的功能键) mov ah,1 clc enter_key_2: mov word_single,1 ret enter_key endp get_system_time proc near ;设定系统时间 mov ax,2c00h int 21h ;获取系统时间 mov al,ch;ch中保存的是 时位 cbw mov cl,10 div cl mov h1,ah;取余数 mov h2,al;取商 mov ax,2c00h int 21h ;获取系统时间 mov al,cl;ch中保存的是 分位 cbw mov cl,10 div cl mov m1,ah;取余数 mov m2,al;取商 mov ax,2c00h int 21h ;获取系统时间 mov al,dh;ch中保存的是 秒位 cbw mov cl,10 div cl mov s2,ah;取余数 mov s1,al;取商 ret get_system_time endp change_place proc near ;更改光标的输出位置,用于重新输出 mov ah,02h mov bh,0 mov dh,15 mov dl,25 int 10h ret change_place endp int_set proc near ;更改1ch中断 至 myfunction 函数 cli push ds mov ah,35h mov al,1ch int 21h mov old_seg,es mov old_off,bx mov ax,seg myfunction mov ds,ax mov dx,offset myfunction mov ah,25h mov al,1ch int 21h pop ds sti ret int_set endp int_repair proc near ;还原 1CH中断 cli mov ax,old_seg mov ds,ax mov dx,old_off mov ah,25h mov al,1ch int 21h sti ret int_repair endp add_minutes proc near;进位控制 mov ax,data mov ds,ax inc s1 cmp s1,10 ;如果秒位到10 jne proc_ends s1_equal_10: mov s1,0 inc s2 ;秒2位+1 cmp s2,6 ;如果秒2位为6 jne proc_ends s2_equal_6: mov s2,0 inc m1 ;分1位+1 cmp m1,10 jne proc_ends m1_equal_10: mov m1,0 inc m2 ;分2位+1 cmp m2,10 jne proc_ends m2_equal_6: mov m2,0 inc h1 ;小时1位+1 cmp h2,2 je h2_equal_2 h2_no_equal_2: cmp h1,10 jne proc_ends jmp inc_h2 h2_equal_2: cmp h1,4 jne proc_ends inc_h2: inc h2 ;小时2位+1 cmp h2,3 jne proc_ends mov h2,0 proc_ends: ret add_minutes endp print_minute proc near ;将时间在屏幕中显示出来 mov ax,data mov ds,ax add s1,48 add s2,48 add m1,48 add m2,48 add h1,48 add h2,48 mov ah,02h mov dl,h2 int 21h ;输出时2位 mov dl,h1 int 21h ;输出时1位 mov dl,':' int 21h mov dl,m2 int 21h ;输出分2位 mov dl,m1 int 21h ;输出分1位 mov dl,':' int 21h mov dl,s2 int 21h ;输出秒2位 mov dl,s1 int 21h ;输出秒1位 sub s1,48 sub s2,48 sub m1,48 sub m2,48 sub h1,48 sub h2,48 ret print_minute endp myfunction proc near;1ch号中断替换函数 cli mov ax,data mov ds,ax cmp is_go_on,0 je int_1c_end inc addition_5 cmp addition_5,5 jne no_equal_5 equal_5: mov addition_5,0 jmp equal_5_2 no_equal_5: inc sub_count equal_5_2: cmp sub_count,18 jne int_1c_end mov sub_count,0 call add_minutes;时间进位 call change_place;更改输出位置 call print_minute ;答应时间 int_1c_end: sti iret myfunction endp code ends end main