我知道这个问题已经讨论过了,但是我仍然不明白一些事情,所以请帮我澄清一下。
据我所知,有两种方法可以进行 I/O,即从 CPU 与其他硬件进行通信。一种是使用输入和输出指令,另一种是内存映射。
但我实际上不明白的是,如果使用 IN 和 OUT 指令,您就会定义源端口。但这个端口是什么?我的意思是,它是 CPU 上的不同引脚组还是什么?而且,该端口连接到什么?
对于内存映射,我遗漏了一个小细节。内存映射 I/O 是否必须先通过 IN 和 OUT 指令进行设置,或者设备是否实际上以某种方式连接到 RAM 并读取它?谢谢。
答案1
在Z80,当指令为 IN 或 OUT 指令时,芯片上有一个引脚被置位(设置为高电平或逻辑 1 状态)。连接到芯片的硬件会监控该引脚、读/写引脚以及一些地址引脚,以确定操作是否引用它们。每个设备都配置为识别某个数字作为其端口号并做出相应响应。因此,当您编写如下汇编指令时:
OUT(15),A
芯片将低 8 位地址引脚设置为 15,并将寄存器 A 的内容写入数据引脚。如果硬件配置和连接正确,它就会知道这是为它准备的。 类似地IN(15),A
。
对于内存映射 I/O,会为硬件保留一个内存位置。当 CPU 写入地址 0xFFF0 时(假设是方便的 8 位微架构,例如 6502 或 6800 或 6809 - 或者 Z80),则连接到该地址以响应该地址的硬件不是 RAM 芯片,而是设备。通常,至少有一个用于读取的附近地址;有时,同一个地址用于读取和写入。
在这两种情况下,问题基本上在于连接到 CPU 的硬件将芯片引脚(一些控制引脚、数据引脚和地址引脚)上的某些活动模式识别为引用它们。如果几个不同的设备都认为相同的地址或 I/O 端口引用它们,则可能会遇到问题。
虽然我使用 8 位芯片作为示例,但相同的基本原理也适用于 16 位、32 位或 64 位芯片。