CPU如何向IO口写入数据?

Joh*_*ohn 2 cpu x86 assembly

我很想知道 CPU 如何将数据写入(和读取数据)IO 端口(例如:串行/并行/USB)。

是否有直接向IO口发送数据的指令,例如:

send the number 3 to pin 0 of serial port 1
Run Code Online (Sandbox Code Playgroud)

还是CPU写入指定的内存位置,一旦数据写入该内存位置,数据会自动发送到IO口,例如:

send the number 3 to memory location 0x12345
Run Code Online (Sandbox Code Playgroud)

现在一旦将数字3写入内存位置0x12345,它将自动发送到串行端口 1 的引脚 0。

tof*_*fro 5

首先,CPU 术语中的“I/O 端口”与串行端口等不同。它是 CPU 地址空间内的可寻址实体,可以读取和/或写入。I/O 端口通常是字节、字或长字大小的(这意味着您只是不寻址特定位,而是至少将字节写入端口。必须通过读取端口、设置位和回信)。

您的串行端口示例通常会分解为多个 I/O 端口(例如,一个保存最后接收字节的端口、一个写入以发送字节的端口以及一个或多个控制端口来控制硬件,例如设置波特率或其他行为)。

通常,与输入/输出相关的 CPU 设计有两种类型:

  1. 内存映射 I/O - 在这里,CPU 寻址 I/O 端口,就像寻址内存一样 - I/O 端口位于 CPU 的“正常”内存地址空间内,CPU 本身没有特定指令用于 I/O,因为它将使用与访问内存完全相同的指令。CPU 控制总线通常没有用于 I/O 端口访问的特定线路。实现内存映射 I/O 的 CPU 的典型示例是 Motorola 68000 或 MOS 6502。
  2. 单独的 I/O 地址空间 - 这里 I/O 端口位于 CPU 的“正常”内存地址空间之外。CPU 还具有访问 I/O 端口(如IN或 )的特定指令OUT。通常,CPU 控制总线也有特定的控制线,向外部硬件发出信号,表明 CPU 要在 I/O 地址空间内寻址,如 IOREQ。实现这种方法的 CPU 的典型例子是 Zilog Z80 或 Intel x86 处理器。请注意,支持单独 I/O 地址空间的 CPU 也完全能够支持内存映射 I/O,因此可以使用混合模式方法。