; 读取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码。。。