王爽《汇编语言》第十四章读取CMOS时钟练习解答

来源:互联网 发布:知彼手机防盗 编辑:程序博客网 时间:2024/05/16 07:08

 ; 读取CMOS里的年月日时分秒,以格式 年/月/日  时:分:秒 显示在屏幕上,
; '/' 的ASCII码是 2F, ':' 的ASCII码是 3A

assume cs:code,

code segment
start:
 ; 读取年,CMOS4单元
 mov al, 9
 call  readConvert
 mov bx, 0b800h
 mov es, bx
 mov byte ptr es:[160*12 + 40*12], al ; 个位数
 mov byte ptr es:[160*12 + 40*12 + 2], ah ; 十位数
 mov byte ptr es:[160*12 + 40*12 + 4], 2fh ; '/'

 ; 读取月,COMS 8单元的数据
 mov  al, 8
 call readConvert
 mov byte ptr es:[160*12 + 40*12 + 6], al ; 个位数
 mov byte ptr es:[160*12 + 40*12 + 8], ah ; 十位数
 mov byte ptr es:[160*12 + 40*12 + 0ah], 2fh ; '/'

 ; 读取日,COMS 7单元的数据
 mov  al, 7
 call readConvert
 mov byte ptr es:[160*12 + 40*12 + 0ch], al ; 个位数
 mov byte ptr es:[160*12 + 40*12 + 0eh], ah ; 十位数
 mov byte ptr es:[160*12 + 40*12 + 10h], ' ' ; 空格

 ; 读取时
 mov  al, 4
 call readConvert
 mov byte ptr es:[160*12 + 40*12 + 12h], al ; 个位数
 mov byte ptr es:[160*12 + 40*12 + 14h], ah ; 十位数
 mov byte ptr es:[160*12 + 40*12 + 16h], ':'

 ; 读取分
 mov  al, 2
 call readConvert
 mov byte ptr es:[160*12 + 40*12 + 18h], al ; 个位数
 mov byte ptr es:[160*12 + 40*12 + 1ah], ah ; 十位数
 mov byte ptr es:[160*12 + 40*12 + 1ch], ':'

 ; 读取秒
 mov  al, 0
 call readConvert
 mov byte ptr es:[160*12 + 40*12 + 1eh], al ; 个位数
 mov byte ptr es:[160*12 + 40*12 + 20h], ah ; 十位数

 loop start

 mov ax, 4c00h
 int 21h

; 子程序,把2进制划分为BCD码,然后转换为10进制的ASCII码,放在ah和al中
readConvert:
 out 70h, al
 in al, 71h

 ; 把读取到的字节用BCD码表示出来
 mov ah, al
 mov cl, 4
 shr al, cl
 and ah, 00001111b

 ; 10进制显示出来
 add ah, 30h
 add al, 30h
 ret

code ends

end start

 

本章学习到端口方面的知识,并用in和out指令来读写端口。

端口是在芯片里的,芯片里的信息通过端口和CPU交互。

还有就是使用shr和shl来进行移位运算,从而把8位的二进制转化为两个4位的BCD码。。。

原创粉丝点击