《汇编语言》第14章 端口——实验14 访问CMOS RAM
编程,以“年/月/日 时:分:秒”的格式,显示当前的日期、时间。
注意:CMOS RAM中存储着系统的配置信息,除了保存时间信息的单元外,不要向其的单元写入内容,否则将引起一些系统错误。
方法1:以中断的方式显示
;sy14_1.asmassume cs:code
code segment
time db 'yy/mm/dd hh:mm:ss','$'
cmos db 9,8,7,4,2,0
start: mov ax,cs mov ds,ax mov bx,0mov si,0mov cx,6a: push cx mov al,cmos[bx]out 70h, al ;将al送入地址端口70上,分别为9号单元,8号单元。。。0号单元in al,71h ;从数据端口71h处理分别读出9号单元,8号单元。。。0号单元内容 mov ah,al mov cl,4shr al,cl ;右移4位and ah,0fh ;al分成两个表示BCD码值的数据add ax,3030h ;BCD码+30h=10进制数对应的ASCII码mov cs:[si],ax ;ASCII码写入time段inc bx add si,3 pop cx loop a
;名称:BIOS中断(int 10h)
;功能:(ah)=2置光标到屏幕指定位置、(ah)=9在光标位置显示字符
;参数:(al)=字符、(bh)=页数、(dh)=行号、(dl)=例号
; (bl)=颜色属性、(cx)=字符重复个数mov ah,2 ;置光标mov bh,0 ;第0页mov dh,13 ;dh中放行号mov dl,32 ;dl中放例号int 10h
;名称:DOS中断(int 21h)
;功能:(ah)=9显示用'$'结束的字符串、(ah)=4ch程序返回
;参数:ds:dx指向字符串、(al)=返回值mov dx,0 mov ah,9int 21h ;结束 mov ax,4c00h int 21h code ends
end start
运行结果:
方法二:以字符串的数据格式显示
;sy14_2.asm 方法2assume cs:codesg
codesg segment
start: mov ax,0mov al,9mov si,0mov cx,6s: push cx push ax out 70h,al ;将al送入端口70h,设置写入70h端口的al号单元in al,71h ;从端口71处理读出单元内容mov ah,al mov cl,4 shr ah,cl and al,00001111b ;al分成两个表示BCD码值的数据add ah,30hadd al,30h ;BCD码+30h=10进制数对应的ASCII码mov bx,0b800h mov es,bx mov byte ptr es:[160*12+40*2][si],ah ;显示十位数码mov byte ptr es:[160*12+40*2+2][si],al ;显示个位数码pop ax dec ax ;指向前一数据单元jmp s1 s0: pop cx add si,6 loop s mov ax,4c00h int 21h s1: cmp ax,10ja s0cmp ax,0je s0cmp ax,6ja s2 ;ax>6,为年/月/日je s3 ;ax=6,为日结尾jb s4 ;ax<6,为时:分:秒s2: mov byte ptr es:[160*12+40*2+4][si],'/' ;添加 '/'jmp s0 s3: sub ax,2 jmp s0 s4: sub ax,1 mov byte ptr es:[160+12+40*2+4][si],':' ;添加 ':jmp s0
codesg ends
end start
运行效果: