1、从 CMOS RAM 的8号单元读出当前月份的 BCD 码; 要读取 CMOS RAM 的信息,首先要向地址端口 70h 写入要访问的单元的地址: mov al , 8 out 70h , al 然后从数据端口 71h 中取得指定单元中的数据: in al , 71h |
||
2、将用BCD码表示的月份以十进制的形式显示到屏幕上; BCD码值=十进制数码值,BCD码值+30h=十进制数对应的ASCII码。 从CMOS RAM的8号单元读出的一个字节中,包含了用两个BCD码表示的两位十进制数,高4位的BCD码表示十位,低4位的BCD码表示个位。00010100b表示14。 ① 将从CMOS RAM的8号单元中读出的一个字节,分为两个表示BCD码值的数据 mov ah , al ; al中为从CMOS RAM的8号单元读出的数据 mov cl , 4 shr ah , cl ; al中为月份的十位数码值 and al , 00001111b ; al中为月份的个位数码值 ② 显示 (ah)+30h 和 (al)+30h 对应的ASCII码字符 |
||
|
// 编程:以 "年/月/日 时:分:秒" 的格式,显示当前的日期、时间。
assume cs:code
code segment
d1: db '20YY-MM-DD HH:MM:SS' , '$' ; 设置待显示格式,YY...后面会用读到的时间数据覆盖
d2: db 9 , 8 , 7 , 4 , 2 , 0
start:
mov ax , cs
mov ds , ax
mov si , offset d1+2 ; 这里用到了偏移到标号,就不能把数据放在单独的段中(data segment),ds:data 也不行,只能直接放在code段中
mov di , offset d2
mov cx , 6
s1:
push cx
mov al , [di] ; 读取CMOS RAM端口中的时间
out 70h , al
in al , 71h
mov ah , al ; 转换成数据对应的ASCII码
mov cl , 4
shr ah , cl
and al , 00001111b
add al , 30h
add ah , 30h
mov ds:[si] , ah ; 放到对应的数据段,覆盖实现占为的字符
mov ds:[si+1] , al
add si , 3 ; 偏移
inc di
pop cx
loop s1 ; 循环
mov ax , 3h ; 调用中断清屏
int 10h
mov ah , 2 ; 调用中断设置光标位置
mov bh , 0
mov dh , 12
mov dl , 30
int 10h
mov ax , cs ; 调用中断显示字符串
mov ds , ax
mov dx , 0
mov ah , 9h
int 21h
mov ax , 4c00h
int 21h
code ends
end start
|
// 改进,彩色显示
assume cs:code
code segment
d1: db '20YY-MM-DD HH:MM:SS' , 0
d2: db 9 , 8 , 7 , 4 , 2 , 0
start:
mov ax , cs
mov ds , ax
mov si , offset d1+2
mov di , offset d2
mov cx , 6
s1: push cx
mov al , [di] ; 读取CMOS RAM端口中的时间
out 70h , al
in al , 71h
mov ah , al ; 转换成数据对应的ASCII码
mov cl , 4
shr ah , cl
and al , 00001111b
add al , 30h
add ah , 30h
mov ds:[si] , ah ; 放到对应的数据段,覆盖实现占为的字符
mov ds:[si+1] , al
add si , 3 ; 偏移
inc di
pop cx
loop s1 ; 循环
mov ax , 3h ; 调用中断清屏
int 10h
mov si , offset d1
mov ah , 2 ; 调用中断设置光标位置
mov bh , 0 ; 设置显示页码
mov dh , 12 ; 设置显示位置
mov dl , 30
int 10h
s2: mov ah , 9h ; 彩色显示字符
mov al , [si]
mov bl , 01001010b
mov cx , 1
int 10h
mov ah , 2h ; 光标偏移
inc dl
int 10h
cmp byte ptr [si] , 0
je s3
inc si
jmp short s2
s3: mov ax , 4c00h
int 21h
code ends
end start
|
assume cs:code , ds:data
data segment
d1 db '20yy-mm-dd hh:mm:ss' , 0 // 这样也可以,不能加冒号
d2 db 9 , 8 , 7 , 4 , 2 , 0
data ends
code segment
start:
mov ax , data
mov ds , ax
mov si , offset d1+2
mov di , offset d2
mov cx , 6
......
|