Assembly CPU如何将数据写入IO端口?

Assembly CPU如何将数据写入IO端口?,assembly,x86,cpu,Assembly,X86,Cpu,我很想知道CPU是如何将数据写入(以及从)IO端口(例如:串行/并行/USB)的 是否有直接向IO端口发送数据的指令,例如: send the number 3 to pin 0 of serial port 1 send the number 3 to memory location 0x12345 或者CPU是否写入指定的内存位置,并且一旦数据写入该内存位置,数据将自动发送到IO端口,例如: send the number 3 to pin 0 of serial port 1 sen

我很想知道CPU是如何将数据写入(以及从)IO端口(例如:串行/并行/USB)的

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

send the number 3 to pin 0 of serial port 1
send the number 3 to memory location 0x12345
或者CPU是否写入指定的内存位置,并且一旦数据写入该内存位置,数据将自动发送到IO端口,例如:

send the number 3 to pin 0 of serial port 1
send the number 3 to memory location 0x12345

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

通常I/O设备的寄存器映射到内存。这将在设备的文档中明确定义

例如,向设备发送数据的方式是将数据写入缓冲区,然后将特定寄存器设置为某个值,该值向设备发出信号,表明缓冲区中存在需要获取的数据。您写入的缓冲区可以是与系统内存在同一地址空间中映射的设备内存,也可以是系统内存。寄存器的设置是通过写入其映射的内存位置来完成的


到目前为止,我还不是这方面的专家,因此如果我错了,请指出,我将删除这一点。

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

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

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

  • 内存映射I/O—这里,CPU对I/O端口的寻址方式与对内存的寻址方式相同—I/O端口位于CPU的“正常”内存地址空间内,CPU本身没有特定的I/O指令,因为它将使用与访问内存相同的指令。CPU控制总线通常没有用于I/O端口访问的特定线路。实现内存映射I/O的CPU的典型示例是Motorola 68000或MOS 6502
  • 单独的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,因此可以采用混合模式方法

  • 你好,我是电子工程专业的学生。 在我们班,微处理器有一些与串行通信有关的地址。因此,如果您将数据写入地址,硬件会自动通过串行总线传输数据

    例如,让我们看一个名为TXR(0xffff01)的地址 一个CPU执行以下指令:发送143到0xffff01地址。 然后在0xffff01位置,将有143个值。 经过几个时钟后,串行硬件自动从TXR(0xffff01)读取数据并传输

    在这种情况下,TXR是一种寄存器。 所以,若你们想做些什么,你们要做的就是把数据发送到相应的地址(寄存器)


    谢谢。

    在什么CPU体系结构下?脱离主题。但是,请参阅&wikipages&对于x86cpu,您可以同时使用这两种方法。您可以通过使用
    IN
    OUT
    指令或通过
    MOV
    将数据传输到RAM块直接访问端口。像Z80这样的“古老”CPU具有不同的控制引脚,以确定内存和IO访问(!mreq和!ioreq)的可能副本,因此当我要写入设备时,我可以简单地写入某个内存位置,而不必担心实际将数据发送到串行端口?所有设备是否都占用相同的内存量,或者一个设备是否可以指定它需要多少内存,例如:打印机是否可以有1MB内存,而网络摄像头是否可以有2MB内存?@John如果是内存映射I/O,则是。但是你对I/O设备中的寄存器空间的想象太过分了。典型的I/O设备不占用兆字节,而是占用多个兆字节(我了解到,每个设备都有自己的内部寄存器,它们映射到RAM,但是所有设备的寄存器数量是否相同,或者每个设备是否可以有任意数量的寄存器(例如:打印机是否可以有4个寄存器,而网络摄像头是否可以有7个寄存器)“?@John Sure。这不仅取决于设备类别,还取决于I/O芯片的供应商和品牌。让我们看看8255 PIO,一种用于连接并行打印机的典型I/O芯片:它有3个8位并行寄存器,可以读取或写入,外加1个控制字节,用于配置芯片的输入和输出,即只写。@tofro我有如果您不介意的话,有两个问题:1)打印机是否有一个仅用于打印机的并行端口?2) 8255 PIO芯片是打印机并行端口的一部分,还是打印机本身的一部分?