作者在 2015-05-24 19:21:55 发布以下内容
- ;***************************************
- ; 程序功能:读取CMOS时间并显示
- ; CMOS读写方法如下:
- ; 1.向地址端口70H写入要访问的单元地址
- ; 2.从71H端口读出数据
- ; 注意:CMOS中存放的是BCD码
- ; 数码: 0 1 2 3 4
- ; BCD码:0000 0001 0010 0011 0100
- ; 数码: 5 6 7 8 9
- ; BCD码:0101 0110 0111 1000 1001
- ; CMOS RAM中时间格式如下:
- ; 秒:00H
- ; 分:02H
- ; 时:04H
- ; 日:07H
- ; 月:08H
- ; 年:09H
- ; BCD码转ASCII码:BCD + 30H = ASCII
- ;***************************************
- assume cs:code,ds:data,ss:stack
- stack segment
- db 16 dup(0)
- stack ends
- data segment
- ;格式: 年 月 日 时 分 秒
- db 0,0,'-',0,0,'-',0,0,' ',0,0,':',0,0,':',0,0,'$'
- ;CMOS端口号序列
- db 09h,08h,07h,04h,02h,00h
- data ends
- code segment
- start:
- mov ax,stack ;栈段初始化
- mov ss,ax
- mov sp,10h
- mov ax,data ;数据段初始化
- mov ds,ax
- ;数据段偏移量如下:
- ; L H
- ;年: 0, 1
- ;月: 3, 4
- ;日: 6, 7
- ;时: 9, 10
- ;分: 12, 13
- ;秒: 15, 16
- ; L->si H->di
- mov si,0
- mov di,1
- xor bx,bx
- mov bx,18
- mov cx,6
- s: mov al,ds:[bx]
- out 70h,al
- in al,71h
- mov ah,al
- push cx
- mov cl,4
- shr ah,cl
- pop cx
- and al,00001111b
- add ah,30h
- add al,30h
- mov byte ptr ds:[si],ah
- mov byte ptr ds:[di],al
- inc bx
- add si,3
- add di,3
- loop s
- mov dx,offset ds:[0] ;设置字符串首地址
- call show
- mov ah,4ch ;返回OS
- mov al,0h ;返回值:0
- int 21h ;调用21号中断
- ;*********************
- ; 子程序:显示字符
- ; 入口参数:DS:DX=串首址
- ; 返回值:无
- ;*********************
- show: push ax
- mov ah,09h
- int 21h
- pop ax
- ret
- code ends
- end start