在看书过程中遇到一个问题:
以“年/月/日 时:分:秒”的格式,显示当前的日期、时间。
我们知道 CMOS RAM 中存放着当前的时间:年,月,日,时,分,秒。这6个信息的长度都为1个字节,存放单元为: 秒:0 分:2 时 :4 日:7 月:8 年:9 这些数据以BCD码的方式存放。当我们从CMOS RAM的8号单元中读出一个字节后,进行如下处理:
assume cs:code
data segment
db 9,8,7,4,2,0
db '/','/',0,':',':',0
data ends
code segment
start: mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov si,0
mov di,160*12+30*2
mov cx,6
s:mov al,[si]
out 70h,al
in al,71h
call c
mov es:[di],ah ;ah中为数据的十位数码值
mov es:[di+2],al ;al中为数据的个位数码值
mov bl,[si+6] ;特殊字符
mov es:[di+4],bl
inc si
add di,6
loop s
in al,60h
cmp al,10h
je quit
jmp start
quit:mov ax,4c00h
int 21h
c:push cx
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
pop cx
ret
code ends
end start
完整程序如下[此程序运行后按‘Q’键即可正常退出]:
assume cs:code
code segment
start:
mov bx,0b800h
mov es,bx
mov di,160*12+2*30 ;初始化显存的偏移地址,
push di ;此处为第12行第30列。
mov al,10 ;为了有规律可循,初始al的值为10(十进制)

rdate: ;读取日期
dec al 
cmp al,7
jb rtime ;当读完‘日’后,就跳至标号rtime处
call show
add di,6
jmp short rdate

rtime: ;读取时间
sub al,2 
cmp al,0feh ;为无符号数相减
je sign ;当读完‘秒’后,就跳至标号sign处
call show
add di,6
jmp short rtime

sign: ;显示相关符号
pop di
add di,4 ;定位第一个'/'符号在显存的偏移地址
mov byte ptr es:[di],'/'
add di,6
mov byte ptr es:[di],'/'
add di,12 ;跳过日期与时间之间的空格
mov byte ptr es:[di],':'
add di,6
mov byte ptr es:[di],':'


in al,60h
cmp al,10h ;Q键的扫描码
je quit
jmp start
;以上4句为动态获取系统时间的关键
quit: mov ax,4c00h
int 21h

show: push ax
push cx

out 70h,al
in al,71h

mov ah,al
mov cl,4
shr ah,cl
and al,00001111b

add ah,30h
add al,30h

mov byte ptr es:[di],ah
mov byte ptr es:[di+2],al
pop cx
pop ax
ret

code ends
end start
647

被折叠的 条评论
为什么被折叠?



