在PC机系统中,和CPU通过总线连接的芯片除了各种存储器外,还有以下3种芯片:
1,各种接口卡(网卡,显卡)上的接口芯片
2,主板上的接口芯片,CPU通过访问他们对部分外设进行访问
3,其他芯片,用来储存相关的系统信息
这些芯片中,都是一组可以由CPU读写的寄存器。这些芯片上的寄存器就是端口。
从CPU角度来看,将这些寄存器(三组芯片中的)都当做端口,对它们进行统一编址,从而建立了一个统一的端口地址空间,每个端口在空间中都有一个地址。
在PC中,端口地址范围为0~65535,可以最多定义64K个不同的端口。
CPU可以直接读写三个地方上的数据:
CPU内部的寄存器、内存单元、端口
由于端口是一个独立的存在,他们有他们的端口地址空间,所以对端口的访问,我们不能还是通过mov这样的指令了,我们通过 in , out 指令。比如:
in al, 60h; 就是我们从60h这个端口读取一个字节到al寄存器中去。
注意:只能使用al,或者ax从储存从端口获取的内容。
shl , shr 指令:
移位,进位的那位储存在CF中,补位为0
现在考虑一个问题,比如我们通过键盘输入一个字符进入PC,那么CPU是如何知道我们输入了的呢?
这里就是中断起作用了,CPU在每执行完一个指令后,会检查IF标志位,如果是1,则表明了有一个外部中断来了,然后cpu开始处理外部中断了,这和前面讲的处理内部中断一样,这也为什么前面讲的要将IF清0了。
我们总结下,当一个外设接收到一个数据了,它将这个数据存放在一个寄存器里,也就是端口中,然后外设发送中断请求,CPU判断中断源,并进行相应的中断处理。最后我们再中断处理程序中,去端口获取这个数据,然后处理,最后返回。
来源:oschina
链接:https://my.oschina.net/u/178323/blog/33603