《汇编语言》第14章 -端口 实验14-访问CMOS RAM 检测点答案

检测点14.1

(1)编程,读取CMOS RAM的2号单元内容;

mov al,2		;将2送入al中;因为只能通过ax,al与端口通信
out 70h,al		;向70h端口中写入al的值
in al,71h		;从71端口中读出数据放到al中 			

(2)编程,向CMOS RAM的2号单元写入0

mov al,2		;先将要写入的地址送入al
out 70h,al		;将al的数据送入70h端口
mov al,0		;再将要写入的数据送入al
out 71h,al		;最后往71号端口写数据。

检测点14.2

编程:用加法和移位指令计算(ax)=(ax)*10

'''
根据提示,可以先将ax做左移3位,再加上a左移1位的值;
'''
mov bx,ax		;先将ax送入bx保存
mov cl,3		;移位位数大于1,用cl保存
shl ax,cl		;将ax左移3位
shl bx,1		;将bx左移1位
add ax,bx		;将二者相加送入ax中,即为(ax)=(ax)*10

实验14 访问CMOS RAM

编程:以“年/月/日 时:分:秒”的格式,显示当前的日期,时间。
进行分析:
1.从CMOS的RAM内存单元中取数据
2.将这些数据通过一定格式送入到显存

(1)这些数据在CMOS芯片的RAM的0,2,4,7,8,9单元中,需要把它们通过70h,71h端口取处;
但是取出的数据是BCD码表示的,需要转换成表示10进制字符的ASCII码;
(2)可以事先定义一个编好格式的字符串放在内存,然后调用show_str函数;将它们送到显存即可。
但是有一个问题,我们取数据只能一个一个的取,现在有6个单元地址数据,可以把它们也放到内存中,用一个循环来依次对al赋值

以下为我的代码:

assume cs:code
data segment
db 9,0,8,0,7,0,4,0,2,0,0,0,0,0,0,0
db 'yy/mm/dd ss:ff:mm ',0
data ends
code segment
start:
mov ax,data
mov ds,ax				
mov si,0	
mov di,0
mov bx,10h				;使ds指向data段

mov cx,6

s:
push cx
mov al,ds:[si]				;将单元地址送入al

out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b			;将取出的数据用ax保存

add ah,30h
add al,30h					;转换为10进制ASCII码表示

mov ds:[bx].[di],ah
mov ds:[bx].1[di],al		;传送到data段的时间格式区

add si,2
add di,3					;控制单元地址,递增
pop cx
loop s

mov dh,12
mov dl,20
mov cl,2
mov si,10h					;传递参数

call show_str

mov ax,4c00h
int 21h

"""
名称:show_str
功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
所需参数:(dh )=行号(范围:0~24),(dl)=列号(范围:0-79),
	 (cl)=颜色,ds:si指向字符串的首地址;
返回:无
"""

show_str:
push ax
push bx
push cx
push dx
push si
push di
push ds
push es				;将子程序所有用到的寄存器入栈保存,方便调用。

#将参数转化为显存上的地址。其对应关系为:行起始=0a0h*行号;列起始=02h*列号;
mov al,0a0h			
mul dh				
mov bx,ax			;对应显存的行
mov al,2
mul dl				
mov di,ax			;对应显存的列
mov ax,0b800h
mov es,ax			;用es:[bx].[di]来寻址显存

mov ah,cl			;先将颜色用ah保存,因为一开始就要用cx进行判断

#完成字符串到显存的传送
trans:
mov cx,ds:[si]
jcxz back			;判断要传送的字符是否为‘0’,为0则直接返回。

mov al,ds:[si]
mov es:[bx].[di],al
					;传送字符到奇数列,对应显存上的ASCII码
mov es:[bx].1[di],ah
					;传送颜色到偶数列,对应显存上的颜色
inc si				
add di,2			;控制字符串及显存地址指向下一个单元

jmp short trans

back:
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret

code ends
end start


结果如下:
《汇编语言》第14章 -端口 实验14-访问CMOS RAM 检测点答案_第1张图片


知识点概括

端口:

(1)各种接口卡(显卡,网卡)上的接口芯片;
(2)主板上的接口芯片;
(3)其他芯片;
这些芯片中有一组可由CPU读写的REG。CPU把它们都当作端口,进行统一编址(就像处在不同位置上的内存单元一样;在CPU看来是连续的);每一个端口都有一个地址。

简单来说,端口就是一组寄存器,不过如同内存单元一样可以寻址;

14.1 端口的读写

1.端口地址和内存地址一样,通过地址总线来传送。
端口范围是0~65535(64kb);
2.端口的读写命令只有两条:in和out
分别用于从端口读取数据和写入数据。
3.在in和out指令中,只能使用ax或al来存放要读取或写入的数据
高于255的端口地址放在dx中,低于255的端口地址可直接写;

14.2 CMOS RAM芯片

1.CMOS芯片中包含一个实时钟和一个有128个存储单元的RAM存储器。该芯片靠电池供电,关机后其内部的实时钟可以正常工作,RAM信息不丢失。
2.该芯片内部有两个端口,端口地址为70h和71h。CPU通过这两个端口来读写CMOS

70h为地址端口;71h为数据端口;

14.3 shl和shr指令

1.shl:逻辑左移指令;
将一个寄存器或内存单元中的数据向左移位;最后移出的一位写入CF中;最低位用0补位。
如果移动位数大于1,必须将移动位数放在cl中;
将x逻辑左移1位,相当于执行x=x*2。
2.shr:逻辑右移指令;
和shl所进行的操作刚好相反。

14.4 CMOS RAM中存储的时间信息

在 0 2 4 7 8 9 单元中分别存放着秒分时,日月年;
存放的数据以BCD码方式存放;
BCD码以4位二进制数来表示十进制数码的编码方法。
例如 十进制的8可用BCD码表示为:0000 1000
19可表示位:0001 1001

你可能感兴趣的:(汇编语言)