任务:构造一个查询日期、时间的程序
编程序,显示如下菜单:
1. Show time(hh:mm:ss)
2. Show Date(yy-mm-dd)
3. Du ... ...
0. Exit
Choose:
在选择1后显示时间,格式是:时:分:秒
在选择2后显示日期,格式是:年-月-日
在选择3后蜂鸣器响一声
在选择0后退出
直接调用中断完成输入输出,不采用直接写显存的方式。
提倡同学自行设计,构造友好的交互界面
【源程序】
先安装提前设置自编译的中断,源程序:
assume cs:code, ss:stack
stack segment stack
db 16 dup (0)
stack ends
code segment
start:
mov ax, stack
mov ss, ax
mov sp, 16
;(1)将自定义的7ch号中断的中断例程安装到0:200
mov ax,cs
mov ds,ax ;ds=cs
mov ax,0
mov es,ax ;es=0
lea si,int7c ;si ds:si
mov di,200h ;di es:di
mov cx,offset int7c_end - offset int7c ;设置cx
cld
rep movsb
;(2)设置7ch号中断的中断向量表
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ax,4c00h
int 21h
;(3)自定义的7ch号中断的中断例程:蜂鸣器“哔”地一声
int7c:
push ax
push cs
;下面的程序已经完成,照抄应用即可,很快学到端口时将知道其机制
mov al, 08h ;设置声音的频率
out 42h, al
out 42h, al
in al, 61h ;读设备控制器端口原值
mov ah, al ;保存原值
or al, 3 ;打开扬声器和定时器
out 61h, al ;接通扬声器,发声
mov cx, 60000 ;延时
delay:
nop
loop delay
mov al, ah
out 61h, al
pop cx
pop ax
iret
int7c_end:
nop
code ends
end start
然后显示菜单,源程序:
assume cs:code,ds:data,ss:stack
data segment
time db '00:00:00$'
list1 db 9,8,7
list2 db 4,2,0
data ends
stack segment
db 100H dup (?)
stack ends
code segment
start:
jmp beg
sta db 10,13,' 1. Show time(hh:mm:ss)'
db 10,13,' 2. Show Date(yy-mm-dd)'
db 10,13,' 3. Du ... ...'
db 10,13,' 0. Exit'
db 10,13
db 10,13,' Choose:','$'
codetab dw sub1, sub2, sub3
beg:
push cs
pop ds ;设置数据段
disp0:
lea dx,sta ;DS:DX=待输出字符的地址
mov ah,9
int 21h ;调用21h中断的第9号功能,显示起始地址在DS:DX,以'$'结束的字符串
mov ah,1
int 21h ;调用21h中断的第1号功能,从键盘读入字符,AL保存读入字符的ASCII码
sub al, 30h ;ASCII变数字
cmp al, 0
je exit
mov bl, al
mov bh, 0
add bx, bx
sub bx, 2
call word ptr codetab[bx];调用子函数
jmp disp0
exit:
mov ah,4ch
int 21h
sub1: ;功能为显示时间,格式是:时:分:秒
push ax
push ds
push ss
push sp
push si
push di
push cx
push ax
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,256
mov ah,2;调用21号中断的2号功能,输出空格
mov dl,' '
int 21h
mov si,offset list2
mov di,offset time
mov cx,3
s1:
push cx
mov al,[si]
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr al,cl
and ah,00001111b
add ax,3030h
mov [di],ax ;转移过来
add di,3
inc si
pop cx
loop s1
mov ah,9
mov dx,offset time
int 21h ;调用21h中断的第9号功能,显示起始地址在DS:DX,以'$'结束的字符串
pop ax
pop cx
pop di
pop si
pop sp
pop ss
pop ds
pop ax
ret
sub2:;功能为显示日期,格式是:年-月-日
push ax
push ds
push ss
push sp
push si
push di
push cx
push ax
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,256
mov ah,2;调用21号中断的2号功能,输出空格
mov dl,' '
int 21h
mov si,offset list1
mov di,offset time
mov cx,3
s2:
push cx
mov al,[si]
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr al,cl
and ah,00001111b
add ax,3030h
mov [di],ax
add di,3
inc si
pop cx
loop s2
mov ah,9
mov dx,offset time
int 21h ;调用21h中断的第9号功能,显示起始地址在DS:DX,以'$'结束的字符串
pop ax
pop cx
pop di
pop si
pop sp
pop ss
pop ds
pop ax
ret
sub3:
mov ax, stack
mov ss, ax
mov sp, 16
int 7ch ;调用21h中断的第7c号功能,自己提前设置自编译,功能为蜂鸣器响一声
ret
code ends
end start