1.背景介绍:
(1)在计算机中,各种存储器都和CPU的地址线、数据线和控制线相连(合称总线Bus)。CPU会把它们总的当成一个由若干存储单元组成的逻辑存储器来看待,我们把它称为内存地址空间。
(2)实际上在PC机中,和CPU通过总线相连的芯片除了各种存储器以外,还有以下三种芯片:
- 各种接口卡(网卡、显卡等);
- 主板上的接口芯片(CPU通过这些芯片对部分外设进行访问);
- 其他芯片(用于存储相关系统信息,或进行相关的输入输出处理)
(3)CPU将这些芯片中的寄存器都当做端口,对它们进行统一的编址,从而建立起来一个统一的端口地址空间,每一个端口在地址空间中都有一个地址
总结:CPU可以从以下三个地方读取数据
(1)CPU内部寄存器
(2)内存单元
(3)端口
2.端口读写
端口读写的命令只有两条:
(1)IN指令: in al, 60H(从端口地址60H读取数据送到al寄存器中)
(2)OUT指令:out 20H, al(从寄存器al中读出数据,送到端口20H处)
这类指令执行同内存数据操作指令相似,一般来说CPU执行分为三步:
1.CPU通过地址线,将地址信息发出
2.CPU通过控制线选中相应端口所在芯片,告诉它是读数据还是写数据。
3.CPU通过数据线发送数据或者接收数据
注意!端口的读写指令IN和OUT都必须用寄存器al或者ax来传送数据,不能够出现立即数
3、应用举例:COMS RAM芯片端口编程
-
COMS RAM芯片特征:
(1)包含一个实时钟和有128个存储单元的RAM存储器;
(2)该芯片靠电池供电。所以,一般来说关机以后实时钟仍然可以正常工作,RAM信息也不会丢失;
(3)128字节的RAM中,0~0dh单元保存时间信息,其余大部分单元用于保存系统配置信息,供给BIOS程序在开机的时候读取,BIOS也提供了相应程序可以供给用户在开机时配置COMS芯片。
(4)COMS RAM芯片操作:芯片提供两个端口地址为70h和71h,CPU通过这两个端口来读写COMS RAM;70h为地址端口,存储想要访问的芯片单元地址,71h为数据端口,存放向芯片传送的数据或者芯片读取出来的数据; -
COMS RAM存储的时间信息
在此芯片中,一次存放着当前的时间信息:
0:秒 2:分 4:时 6:日 8:月 9:年 (每个字节地址单元对应的时间信息)
这些数据全部以BCD码的形式存放
实验说明:从COMS RAM中读出当前月份,显示在频幕上
实验参考代码:
assume cs:code,ds:data
data segment
db 'Month:'
data ends
code segment
start:
mov ax,0b800H
mov es,ax
mov si,160*12+35*2 ; 显存段地址
mov ax,data
mov ds,ax
mov di,0
mov al,8 ; 注意out和in指令中只能用al寄存器来读入数据或者存储要发送到端口的数据
out 70H,al
in al,71H
mov ah,al ; al中存有从8号单元读出的数值,放入ah中
mov cl,4 ; 准备进行四位移动
shr ah,cl ; 高位BCD存在ax高位
and al,00001111b ; 低位存在ax低位、
add ah,30H
add al,30H ; 转换为ASCii表示的数字
mov cx,6
S: mov dl,ds:[di]
mov es:[si],dl
mov byte ptr es:[si+1],02H
inc di
add si,2
loop S ; 将month传入显存
mov byte ptr es:[si],ah
add si,2
mov byte ptr es:[si],al ; 将月份传入显存
mov ax,4c00H
int 21H
code ends
end start
实验结果演示:
4、补充:shl和shr指令同CF标志的使用
- shl逻辑左移指令功能:
(1)将一个寄存器或内存单元的数据向左移动
(2)将最后移除的一位写入CF标志位中
(3)最低位补充0 - shr逻辑右移功能:
(1)同上,向右移动
(2)同上,将最后一位移出去的写入CF
(3)最高位补充0
注意!如果移动的位数大于1,则必须写入cl寄存器中
网友评论