;尽我所能,应该够详细了,呵呵......
assume cs:code
code segment
ORG 100H
start:
JMP CZR
MESS DB 'PRESS "T" START, "Q " TO EXIT! $'
CZR:
MOV AH,09 ;显示提示信息
MOV DX,OFFSET MESS
INT 21H
mov ah,1 ;输入一个字符
int 21h
cmp al,54h ;是'T'吗?
je start1 ;是则开始运行程序
jmp start ;不是转重新输入一个字符
start1: mov bx,0b800h ;设置彩色显示卡显示区地址
mov es,bx
mov di,160*12+2*30 ;光标定位:12行/30列
push di ;光标位进栈保存
mov al,10
rdate:
dec al ;AL-1
cmp al,7 ;依次设AL=9,8,7 通过OUT 70H,AL及IN AL,71H,可依次取年月日数据
jb rtime ;AL若小于7,则取时间
call show
add di,6 ;本是增加3个字符位,但还有3个属性位,所以+6
jmp short rdate
rtime:
sub al,2 ;依次设AL=4,2,0 通过OUT 70H,AL及IN AL,71H,可依次取时分秒数据
cmp al,0feh ;0-2H=0feh
je sign ;转显示" / / : : " 标志符号
call show
add di,6 ;本是增加3个字符位,但还有3个属性位,所以+6
jmp short rtime
sign:
pop di ;光标位出栈
add di,4
mov byte ptr es:[di],'/' ;在12行/32列 显示 '/'
add di,6
mov byte ptr es:[di],'/' ;在12行/35列 显示 '/'
add di,12
mov byte ptr es:[di],':' ;在12行/41列 显示 ':'
add di,6
mov byte ptr es:[di],':' ;在12行/44列 显示 ':'
in al,60h ;从键盘读入字符
cmp al,10h ;是Q的扫描码吗?
je quit ;是则退出程序
jmp start1 ;否则继续
quit: mov ax,4c00h ;退出程序,返回DOS
int 21h
show: push ax ;从CMOS取数并转换成ASCII码子程序
push cx
out 70h,al
in al,71h ;从CMOS读取日期/时间数据, 假如AL=12H
mov ah,al ;AX=1212H
mov cl,4
shr ah,cl ;AH右移4位后,AH=01H
and al,00001111b ;AL=02H
add ah,30h ;AH=31H 至此,完成ASCII码转换
add al,30h ;AL=32H
mov byte ptr es:[di],ah ;将ASCII码填入待显示的位置,AH为10位
mov byte ptr es:[di+2],al ;AL为个位,之所以+2,是因为除字符位外,还有一个属性位
pop cx
pop ax
ret
code ends
end start