本博文系列参考自<<汇编语言>>第三版,作者:王爽
各种存储器都通过地址总线,数据总线以及控制总线与CPU相连。CPU对这些各种存储器组成的存储单元进行统一编址,统一寻址。除了各种存储器和CPU相连之外,还有以下几种芯片和CPU相连:
(1)各种接口卡(比如网卡,显卡)上的芯片,它们控制接口卡工作
(2)主板上的接口芯片,CPU通过它们对部分外设进行访问
(3)其他芯片,用来存储相关的系统信息,或进行相关的输入输出处理
在这些芯片中,都有一些可以用CPU读写的寄存器,虽然这些寄存器在物理上不同的芯片,但是有如下两个相同点:
(1)都和CPU的总线相连,当然这种连接是通过它们所在的芯片进行的
(2)CPU对它们进行读或写的时候通过控制线向它们的芯片发出端口读写命令
从CPU的角度,CPU对这些端口统一进行寻址,每个端口在地址空间都有独一无二的地址。
CPU可以直接从:内存地址空间,端口,CPU内部寄存器这三个地方直接读写数据。
14.1端口的读写
CPU和端口所在的芯片通过地址总线相连,所以端口地址和内存地址一样,通过地址总线来传送。在PC系统中,CPU最多可以定位64KB个不同的端口。则端口的地址范围为0~65535.
对端口的读写只能用in和out指令。
访问内存和访问端口的区别:
(1)访问内存:
mov ax,ds:[8] ;假设执行前(ds)=8
执行步骤:
一.cpu通过地址线将地址信息8发出
二.cpu通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据
三.存储器将8号单元中的数据通过数据线送入CPU
(2)访问端口:
in al,60h ;从60号端口读入一个字节
执行步骤:
一.CPU通过地址线将地址信息60h发出
二.CPU通过控制线发出端口命令,告诉芯片将要读取该端口的信息
三.端口所在芯片将60h端口的信息送到al中
14.2 CMOS RAM芯片
在PC中有一个CMOS RAM芯片,该芯片特征如下:
1.包含一个时钟和一个128个存储单元的RAM存储器
2.该芯片靠电池供电。所以关机后仍正常工作
3.128字节的ram,其中0~0dh用来保存时间信息,其余大部分用于保存系统配置,供系统启动时的BIOS读取,BIOS
也提供了相关程序,使我们在开机时候可以配置CMOS RAM中的信息
4.该芯片有两个端口70h和71h,用这两个端口实现对CMOS RAM的读写。
5.70h为地址端口,存放要读取的CMOS的地址单元。71h为数据端口,存放要写入或者写出的数据。
比如读CMOS的2号单元分为以下两步:
将2送入70h
从71h读出2号单元的内容
14.3 shl和shr指令
shl和shr为逻辑移位操作
shl为逻辑左移位操作,其功能为:
(1) 将一个寄存器或者内存单元的数据向左移动
(2) 将最后移出的一位写入CF中
(3) 最低位用0补充
比如:
mov al,01001000b
shl al,1
执行后(al)=10010000b,CF=0
如果移动位数大于1,必须将移动位数保存在cl中,比如:
mov al,01010001b
mov cl,3
shl al,cl
可以看出将X逻辑左移一位相当于X=X*2
shr为逻辑右移位操作,其功能为:
(1) 将一个寄存器或者内存单元的数据向右移动
(2) 将最后移出的一位写入CF中
(3) 最低位用0
补充
比如:
mov al,10000001b
shr al,1
执行后(al)=01000000b,CF=1
同样的,
如果移动位数大于1,必须将移动位数保存在cl中
可以看出将X逻辑左移一位相当于X=X/2
14.4 CMOS RAM中存储的时间信息
在CMOS中,存放着当前的时间:年,月,日,时,分,秒。这6个信息的长度都为1个字节,存放单元为:
秒:0 分:2 时:4 日:7 月:8 年:9
这些数据以BCD方式存放。
BCD编码方式如下:
比如数值26,用BCD码表示为:0010 0110
可见在CMOS中,一个字节表示两位BCD码,高四位BCD表示十位,低四位BCD表示个位
问题,在屏幕中间显示当前月份:
一 从CMOS RAM的8号地址单元中读出当前月份的BCD码
mov al,8
out 70h,al
in al.71h
二 将用BCD码表示的月份以十进制的形式显示到屏幕上
BCD码值=十进制码值 ,则BCD码值+30h=十进制数对应的ASCII码
从CMOS RAM的8号单元中读出一个字节,分为两个表示的BCD码值得数据。
mov ah,al
mov cl,4
shr al,cl
and al,00001111b
显示(ah)+30h和(al)+30h对应的ascii字符,完整程序如下:
assume cs:code
code segment
start: mov al,8
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
mov bx,0b800h
mov es,bx
mov byte ptr es:[160*12+40*2],ah
mov byte ptr es:[160*12+40*2+2],al
mov ax,4c00h
int 21h
code ends
end start