王爽 《汇编语言》 实验14:显示CMOS中的时间
CMOS中存放的地址: 秒:0 分:2 时:4 日:7 月:8 年:9
目的:显示 “年/月/日 时:分:秒"
方法一:
assume cs:code
data segment
db '00/00/00 00:00:00','$'
db 9,8,7,4,2,0
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov cx,6
mov bx,18
s1: push cx
mov ax,[bx]
out 70h,al
in al,71h ;取出来的时CBD编码:用4位表示10进制数。
; 例如:0001 0001 表示 1*10 + 1 = 11
mov ah,al
mov cl,4
shr al,cl
add al,30h
and ah,00001111b ;CBD取得低4位
add ah,30h
mov ds:[si],ax ;注意前后颠倒,al保存10位上数,ah保存个位上数
inc bx
add si,3
pop cx
loop s1
mov ah,2 ;放置光标
mov bh,0
mov dh,12
mov dl,40
int 10h
mov ax,data ;DOS提供的9号中断例程,显示字符。
mov ds,ax
mov dx,0 ;需提供 ds:dx作为数据的首地址,遇到'$'后结束。
mov ah,9 ;中断向量9。
int 21h
mov ax,4c00h ;同上,中断向量4ch,功能:返回程序。
int 21h
code ends
end start
方法二:
assume cs:code, ds:data
data segment
db '2000/00/00 00:00:00',0
db 9,8,7,4,2,0
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,2
mov cx,6
mov bx,20
s1: push cx
mov ax,[bx]
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr al,cl
add al,30h
and ah,00001111b
add ah,30h
mov ds:[si],ax
inc bx
add si,3
pop cx
loop s1
mov ax,0b800h
mov es,ax
mov di,160*12+40*2
mov si,0
showtime:
mov cl,ds:[si]
mov ch,0
jcxz ok
mov es:[di],cl
inc si
add di,2
jmp short showtime
ok:
mov ax,4c00h
int 21h
code ends
end start