第14章 端口
检测点14.1
(1).编程,读取CMOS RAM的2号单元的内容。
mov al,2 ;向al写入2
out 70,al ;将2送入端口70h
in al,71 ;从端口71h读取2号单元的内容
在CMOS RAM中用6个字节存放当前时间(以BCD码形式存放),地址02中存放的是分。
即从2号单元中读到的内容是当前时间的分钟。如下图所示:
当前分钟为59分
程序运行后al中内容如下:
(2).编程,向CMOS RAM的2号单元写入0。
mov al,2
out 70,al
mov al,0
out 71,al
检测点14.2
编程,用加法和移位指令计算(ax)=(ax)*10
提示,(ax ×10)=(ax)×2+(ax)×8。
如:计算2 ×10 = 20
mov bx,2 ;将2放入bx中
mov cl,3 ;将3放入cl中(移位位数)
shl bx,cl ;将bx中的内容左移3位
mov ax,bx ;将移位后的数据暂存到ax中
mov bx,2 ;将2放入bx
shl bx,1 ;左移1位
add ax,bx ;加到ax中
实验14 访问CMOS RAM
编程,以“年/月/日 时:分:秒"的格式,显示当前的日期、时间。
注意:CMOS RAM中存储着系统的配置信息,除了保存时间信息的单元外,不要向其他的单元中写入内容,否则将引起一些系统错误。
assume cs:code
data segment
db 9,8,7,4,2,0
db '// ::'
data ends
code segment
start:mov ax,data
mov ds,ax ;ds指向数据段(CMOS RAM时间单元地址)
mov ax,0b800h
mov es,ax ;es指向显存空间
mov di,0 ;使用di访问时间单元地址
mov si,0 ;使用si访问显存空间
mov cx,6 ;循环6次
s:push cx ;cx入栈
mov al,ds:[di] ;将时间单元地址送入al
out 70h,al ;将时间单元地址送入70h端口
in al,71h ;从71h端口读取时间数据送入al
mov ah,al ;al送入ah
mov cl,4 ;4送入cl(移位位数)
shr ah,cl ;ah左移4位(分离10位)
and al,00001111b ;分离个位
add ah,30h ;十位转换成ASCII
add al,30h ;个位转换成ASCII
mov byte ptr es:[160*12+40*2+si],ah ;十位写入显存空间
mov byte ptr es:[160*12+40*2+si+2],al ;个位写入显存空间
mov al,ds:[di+6] ;取出间隔字符放入al
mov byte ptr es:[160*12+40*2+si+4],al ;间隔字符写入显存空间
inc di ;di+1指向下一个字符
add si,6 ;si+6指向下一个显存空间
pop cx ;cx出栈
loop s ;重新循环
mov ax,4c00h
int 21h
code ends
end start
将上面程序在DOS中运行后效果如下: