汇编语言(王爽第三版)实验14 访问CMOS RAM
实验14 访问CMOS RAM
实验要求:编程,以“年/月/日 时:分:秒”的格式,显示当前的日期、时间。
实验分析:
(1)直接在指令中写字符/和:,让编译器自动查吧。
(2)熟悉CMOS RAM 端口中的那些单元代表的信息。
秒:0单元 分:2单元 时:4单元 日:7单元 月:8单元 年:9单元
(3)熟练对于端口单元的读出操作。只能使用al或ax。
(4)显示在屏幕什么地方?还是中间吧。书中的程序就不用怎么改动了。
(5)由于要重复6次读出BCD码数据,并转换它们,需要对重复的代码编制成子程序来做。将读出,转换,显示做成一个子程序,调整入口参数即可。
子程序代码为:
;---
;子程序名称:read_show
;功能:将CMOS RAM中存储的系统时间读取并转换成ASCII码,并显示出来
;入口参数:al(端口单元号)
;返回值:无
;---
read_show:
;保护寄存器变量,di不用了。
push ax
push cx
add di, 6 ;递增3个字(6个字节)用于显示下一个数据。
;从CMOS端口读出月份的信息
;mov al, 8
out 70H, al
in al, 71H
;将al中BCD码数据分离为高4位(存储在ah)和低4位(存储在al)
mov ah, al ;(al)是读出的BCD数据,复制给ah一份
mov cl, 4 ;设置移位的位数是4
shr ah, cl ;将ah寄存器右移4位,前面4位补0,将高4位(十位)保留
and al, 00001111b ;将al寄存器逻辑与,前4位置0,后4位(个位)保留
;转换成ASCII码,用于显示
add ah, 30H
add al, 30H
;显示
mov byte ptr es:[di], ah ;显示十位
mov byte ptr es:[di+2], al ;显示个位
;恢复寄存器值
pop cx
pop ax
ret
子程序分析:基本上按照书中的例子稍微改动了下。注意入口参数就是al,由于di始终参与运算,故不能作为入口参数。也不用保护其值。
完整的代码如下:
assume cs:code
code segment
start: mov ax, 0b800H
mov es, ax
mov di, 160*12+30*2 ;设置es:di指向屏幕中间,位置可以调整
mov al, 9 ;入口参数,端口单元:9号(年份)
call read_show ;调用子程序转换并显示
mov byte ptr es:[di+4], '/' ;写分隔符
mov al, 8 ;端口单元:9号(月份)
call read_show
mov byte ptr es:[di+4], '/'
mov al, 7 ;端口单元:7号(日)
call read_show
mov byte ptr es:[di+4], ' '
mov al, 4 ;端口单元:4号(时)
call read_show
mov byte ptr es:[di+4], ':'
mov al, 2 ;端口单元:2号(分)
call read_show
mov byte ptr es:[di+4], ':'
mov al, 0 ;端口单元:0号(秒)
call read_show
mov ax, 4c00H
int 21H
;---
;子程序名称:read_show
;功能:将CMOS RAM中存储的系统时间读取并转换成ASCII码,并显示出来
;入口参数:al(端口单元号),di(显存缓冲区偏址)
;返回值:无
;---
read_show:
;保护寄存器变量,di不用了。
push ax
push cx
add di, 6 ;递增3个字(6个字节)用于显示下一个数据。
out 70H, al
in al, 71H
;将al中BCD码数据分离为高4位(存储在ah)和低4位(存储在al)
mov ah, al ;(al)是读出的BCD数据,复制给ah一份
mov cl, 4 ;设置移位的位数是4
shr ah, cl ;将ah寄存器右移4位,前面4位补0,将高4位(十位)保留
and al, 00001111b ;将al寄存器逻辑与,前4位置0,后4位(个位)保留
;转换成ASCII码,用于显示
add ah, 30H
add al, 30H
;显示
mov byte ptr es:[di], ah ;显示十位
mov byte ptr es:[di+2], al ;显示个位
;恢复寄存器值
pop cx
pop ax
ret
code ends
end start
程序结果:
程序分析:
【1】将重复大量使用的代码,编制成一个子程序,利于减少代码量,结构化程序。
【2】对于CMOS RAM端口来说,它分为地址端口70H和数据端口71H二个,RAM中不同的单元存储着不同的信息,基本都是机器硬件的配置信息。比较重要。