编程,以“年/月/日 时:分:秒”的格式,显示从cmos ram中读取的时间:
assume cs:code , ds:data
data segment
db 32 dup(0) //开辟32个字节的空间来存放最终要显示的字符串,实际用到了17字节。初始化为0
data ends
code segment
start:
mov ax , data
mov ds , ax
mov bx , 0
mov al , 9
call getdata //获取年
call adddata //将年数据写入内存字符串
call showx //将‘/’字符写入内存字符串
mov al , 8
call getdata //获取月
call adddata
call showx
mov al , 7
call getdata //获取日
call adddata
call showk //写入空格
mov al , 4
call getdata //获取时
call adddata
call showm //写入冒号
mov al , 2
call getdata //获取分
call adddata
call showm
mov al , 0
call getdata //获取秒
call adddata
call showtime //在屏幕上显示字符串
mov ax , 4c00h
int 21h
adddata: //将cmos中获取的字符(两个字节)写到内存字符串的函数
mov [bx] , ah
inc bx
mov [bx] , al
inc bx
ret
showx: //写'/’'的函数
mov byte ptr [bx] , 47
inc bx
ret
showm: //写':‘'的函数
mov byte ptr [bx] , 58
inc bx
ret
showk: //写' ‘'的函数
mov byte ptr [bx] , 32
inc bx
ret
getdata: //从cmos ram中读取一个字节,并提取出对于的十位数和个位数,分别放入ah,al
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
pop cx
ret
showtime: //显示字符串的函数
push ax
push ds
push bx
push es
push si
mov ax , data
mov ds , ax
mov bx , 0
mov ax , 0b800h
mov es , ax
mov si , 160*12+30*2
realshow:
cmp byte ptr [bx] , 0
je showover
mov al , [bx]
mov es:[si] , al
inc bx
inc si
mov byte ptr es:[si] , 2
inc si
jmp short realshow
showover:
pop si
pop es
pop bx
pop ds
pop ax
ret
code ends
end start