文章目录[隐藏]
我们前面讲过,各种存储器都和CPU的地址线、数据线、控制线相连。CPU在操控它们的时候,把它们都当作内存来对待,把它们总地看做一个由若干存储单元组成的逻辑存储器,这个逻辑存储器我们称其为内存地址空间(可参见1.15)。
在PC机系统中,和CPU通过总线相连的芯片除各种存储器外,还有以下3种芯片。
(1)各种接口卡(比如,网卡、显卡)上的接口芯片,它们控制接口卡进行工作;
(2)主板上的接口芯片,CPU通过它们对部分外设进行访问;
(3)其他芯片,用来存储相关的系统信息,或进行相关的输入输出处理。
在这些芯片中,都有一组可以由CPU读写的寄存器。这些寄存器,它们在物理上可能处于不同的芯片中,但是它们在以下两点上相同。
(1)都和CPU的总线相连,当然这种连接是通过它们所在的芯片进行的;
(2) CPU对它们进行读或写的时候都通过控制线向它们所在的芯片发出端口读写
命令。
可见,从CPU的角度,将这些寄存器都当作端口,对它们进行统一编址,从而建立了一个统一的端口地址空间。每一个端口在地址空间中都有一个地址。
CPU可以直接读写以下3个地方的数据。
(1) CPU内部的寄存器;
(2)内存单元;
(3)端口。
端口的读写
在访问端口的时候,CPU通过端口地址来定位端口。因为端口所在的芯片和CPU通过总线相连,所以,端口地址和内存地址一样,通过地址总线来传送。在PC系统中,CPU最多可以定位64KB个不同的端口。则端口地址的范围为0}655}So
对端口的读写不能用mov, push, pop等内存读写指令。端口的读写指令只有两条:in和out,分别用于从端口读取数据和往端口写入数据。
我们看一下CPU执行内存访问指令和端口访问指令时候,总线上的信息:
(1)访问内存:
mov ax,ds:[8] ;假设执行前(ds)=0
执行时与总线相关的操作如下所示。
①CPU通过地址线将地址信息8发出;
②CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据;
③存储器将8号单元中的数据通过数据线送入CPU
(2)访问端口:
in al,60h ;从60h号端口读入一个字节
执行时与总线相关的操作如下
①CPU通过地址线将地址信息60h发出;
②CPU通过控制线发出端口读命令,选中端口所在的芯片,并通知它,将要从中读取数据;
③端口所在的芯片将60h端口中的数据通过数据线送入CPU
注意,在in和o ut指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。访问8位端口时用al,访问16位端口时用axe
对0~255以内的端口进行读写时:
in al,20h;从20h端口读入一个字节 out 20h,al;往20h端口写入一个字节
对256~65535的端口进行读写时,端口号放在dx中:
mov dx,3f8h ;将端口号3f8h送入dx in a1,dx ;从3f8h端}l读入一个字节 out dx,al, ;向3f8h端口写入一个字节
案例
任务:访问61端口发声
assume cs:codeseg codeseg segment start: mov al, 08h ;设置声音的频率 out 42h, al out 42h, al in al, 61h ;读设备控制器端口原值 mov ah, al ;保存原值 or al, 3 ;打开扬声器和定时器 out 61h, al ;接通扬声器,发声 mov cx, 60000 ;延时 delay: nop loop delay mov al, ah ;恢复端口原值 out 61h, al mov ax, 4c00h int 21h codeseg ends