汇编中的端口

1.什么是端口?

   我们先了解下CPU和各种外设连接的情况: 各种存储器都和cpu的数据总线,地址总线,控制总线相连。但是除了存储器的芯片外,还有其他的接口芯片:

    1.各种接口卡的芯片,如网卡和显卡  2.主板上的接口芯片 3.其他芯片,用来存储相关系统 信息。

在这些芯片中,都有一组寄存器,可以供cpu读写操作。他们在物理上处于不同的外部设备中但是

   1.他们都和cpu的总线相连,通过他们的芯片进行联系

    2.cpu对他么进行读或者写的时候通过控制总线向他们所在的芯片发出命令。

这里可以看到,端口就是这些芯片中的寄存器的抽象概念,cpu对他们进行统一编址。从而建立起统一的端口地址空间,每一个端口在地址空间都有一个地址。相当于外设的单元号。CPU和端口所在的芯片通过地址总线相连,所以端口地址和内存地址一样,通过地址总线来传送。在PC系统中,CPU最多可以定位64KB个不同的端口。则端口的地址范围为0~65535.

2.怎么使用端口

8086系统汇编对端口的读写只能用in和out指令。

访问内存和访问端口的区别:

(1)访问内存:

mov ax,ds:[8]   ;假设执行前(ds)=8

执行步骤:

一.cpu通过地址线将地址信息8发出

二.cpu通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据

三.存储器将8号单元中的数据通过数据线送入CPU

(2)访问端口:

in al,60h  ;从60号端口读入一个字节

执行步骤:

一.CPU通过地址线将地址信息60h发出

二.CPU通过控制线发出端口命令,告诉芯片将要读取该端口的信息

三.端口所在芯片将60h端口的信息送到al中

3.摘录一些网上对汇编端口的总结:

    3.1  比如 IN AL, 60H ;从端口60H读入一个字节到AL中 这个60H相当于地址.至于你说的地址怎么换算就是计算机组成原理的内容了.关于外设有2种寻址方式,每个连接到I/O总线上的设备都有自己的I/O地址集,即所谓的I/O端口(I/O port)。在IBM PC体系结构中,I/O地址空间一共提供了65,536个8位的I/O端口。可以把两个连续的8位端口看成一个16位端口,但是这必须是从偶数地址开始。同理,也可以把两个连续的16位端口看成一个32位端口,但是这必须是从4的整数倍地址开始。有四条专用的汇编语言指令可以允许CPU对I/O端口进行读写:它们分别是in、ins、out和outs。在执行其中的一条指令时,CPU使用地址总线选择所请求的I/O端口,使用数据总线在CPU寄存器和端口之间传送数据。   I/O端口还可以被映射到物理地址空间:因此,处理器和I/O设备之间的通信就可以直接使用对内存进行操作的汇编语言指令(例如,mov、and、or等等)。现代的硬件设备更倾向于映射I/O,因为这样处理的速度较快,并可以和DMA结合起来使用。也就解释了为什么32位系统名义上支持4G内存,实际上你装上4G
内存条在机器上是不行了。因为访问不到4G,还需要为显卡,声卡等设备提供物理地址的映射。系统设计者的主要目的是提供对I/O编程的统一方法,但又不牺牲性能。为了达到这个目的,每个设备的I/O 端口都被组织成一组专用寄存器。CPU把要发给设备的命令写入控制寄存器(control register),并从状态寄存器(status register)中读出表示设备内部状态的值。CPU还可以通过读取输入寄存器(input register)的内容从设备取得数据,也可以通过向输出寄存器(output register)中写入字节而把数据输出到设备。

    系统设计者的主要目的是提供对I/O编程的统一方法,但又不牺牲性能。为了达到这个目的,每个设备的I/O 端口都被组织成一组专用寄存器。CPU把要发给设备的命令写入控制寄存器(control register),并从状态寄存器(status register)中读出表示设备内部状态的值。CPU还可以通过读取输入寄存器(input register)的内容从设备取得数据,也可以通过向输出寄存器(output register)中写入字节而把数据输出到设备。

3.2 什么是DMA

  DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。

  要把外设的数据读入内存或把内存的数据传送到外设,一般都要通过CPU控制完成,如CPU程序查询或中断方式。利用中断进行数据传送,可以大大提高CPU的利用率

    但是采用中断传送有它的缺点,对于一个高速I/O设备,以及批量交换数据的情况,只能采用DMA方式,才能解决效率和速度问题。DMA在外设与内存间直接进行数据交换,而不通过CPU,这样数据传送的速度就取决于存储器和外设的工作速度。

  通常系统的总线是由CPU管理的。在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态--高阻状态,而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。DMA控制器必须有以下功能:

  1. 能向CPU发出系统保持(HOLD)信号,提出总线接管请求;

  2. 当CPU发出允许接管信号后,负责对总线的控制,进入DMA方式;

  3. 能对存储器寻址及能修改地址指针,实现对内存的读写操作;

  4. 能决定本次DMA传送的字节数,判断DMA传送是否结束

  5. 发出DMA结束信号,使CPU恢复正常工作状态。

4.端口和外中断:

      我们知道8086cpu没有io映射和DMA技术的时候都是cpu和端口直接进行数据交换。那么问题来了。cpu如何及时的知道并处理外设的输入随时随地的到达的数据呢??

8086系统提供了中断机制,当外设的输入到达时候,将产生中断信息,引发中断程序。外中断根据中断源的不同分为可屏蔽中断和不可屏蔽中断。

猜你喜欢

转载自blog.csdn.net/Jbinbin/article/details/81453709