检测点14.1
(1) 编程,读取CMOS RAM的2号单元的内容。
mov al,2 ;声明要读取的内存单元
out 70H,al ;写入70H端口
in al,71H ;从71端口读取CMOS RAM的2号内存单元的数据
(2) 编程,向CMOS RAM的2号单元写入0。
mov al,2 ;声明要写入的内存单元
out 70H,al ;写入70端口
mov al,0 ;写入值
out 71H,al ;从71端口写入要在CMOS RAM的2号内存单元写入的数据
检测点14.2
编程,用加法和移位指令计算(ax)=(ax)*10
提示:(ax)*10=(ax)*2+(ax)*8
assume cs:codesg
codesg segment
start:
mov bx,ax
shl ax,1 ;ax左移1位
mov cl,3 ;ax左移3位
shl bx,cl
add ax,bx ;结果相加
mov ax,4c00H
int 21H
codesg ends
end start
实验14:访问CMOS RAM
实验要求:编程,以“年/月/日 时:分:秒”的格式,显示当前的日期、时间。
代码实现与完整注释:
assume cs:codesg
codesg segment
start:
mov ax,0B800H ;显存定位
mov es,ax
mov di,160*12+40*2
mov al,9 ;年
call show_time_data
mov byte ptr es:[di+4],'/'
add di,6
mov al,8 ;月
call show_time_data
mov byte ptr es:[di+4],'/'
add di,6
mov al,7 ;日
call show_time_data
mov byte ptr es:[di+4],' '
add di,6
mov al,4 ;时
call show_time_data
mov byte ptr es:[di+4],':'
add di,6
mov al,2 ;分
call show_time_data
mov byte ptr es:[di+4],':'
add di,6
mov al,0 ;秒
call show_time_data
mov ax,4c00H
int 21H
;---
;子程序名称:show_time_data
;功能:读取CMOS RAM中存储的系统时间,并转换成ASCII码后在屏幕上显示
;入口参数:al(端口单元号),di(显示位置)
;返回值:无
;---
show_time_data:
push ax ;保存寄存器值
push cx
out 70H,al ;读取al参数端口单元号的日期数据
in al,71H
mov ah,al ;临时存储两个BCD码
mov cl,4
shr ah,cl ;右移动4位,得到高4位上的十位数
and al,00001111B ;高四位置为0,得到低4位上的个位数
add al,30H ;个、十位转为ascii码
add ah,30H
mov es:[di],ah ;写入显存
mov es:[di+2],al
pop cx ;还原寄存器值
pop ax
ret
codesg ends
end start