assembly - 从哪里获得硬件的 I/O 端口地址分配?

标签 assembly io x86 hardware pc

最近在学习汇编语言,已经知道如何使用in/out命令了。但我有一些问题:

  • 端口地址从哪里来,比如 0x70?
  • 我怎么知道我的电脑有多少个端口以及它们的地址?

  • 我查看了英特尔开发人员手册,但找不到答案。

    最佳答案

    最多有 65536 个 IO 端口,而且大多数都没有使用。

    现代 PC 上使用的 IO 端口可以分为两类:PCI 设备和传统设备。

    对于 PCI 设备;每个设备(PCI 规范使用的术语中的“功能”)都有一些包含“BAR”(基地址寄存器)的配置空间。每个BAR表示设备使用的区域是在物理地址空间还是IO端口空间;如果它在 IO 端口空间中,BAR 会告诉您在哪个基本 IO 端口上有多少 IO 端口。这些可以设置为任何内容(如果有理由,软件可以更改设置 - 通常固件在操作系统启动之前设置它们)。

    传统设备(在采用 PCI 之前内置于主板或通过 ISA 总线连接的设备,但现在可能仍然存在)使用固定 IO 端口。例如,主 PIC Controller (如果存在)将始终使用 IO 端口 0x20 和 0x21。理想情况下;您决定支持旧设备并检查其文档,其文档将告诉您要使用哪个 IO 端口以及它们的作用。请注意(由于 ISA 总线限制)所有这些 IO 端口都将小于或等于 0x3FF。对于现代计算机,您还应该在尝试使用之前检查(使用 ACPI 表)该设备是否存在。当然,如果您不是为旧设备编写设备驱动程序,您就不需要关心它的 IO 端口可能是什么。

    注 1:对于带有 ISA 插槽的计算机(例如 1990 年代中期之前),您可以插入任何类型的 ISA 卡;每张卡使用的 IO 端口通常由卡本身上的小“DIP 开关”控制。软件(操作系统)无法自动检测设备的 IO 端口(也无法自动检测设备是否存在)。解决此问题的唯一方法是让用户告诉您并希望他们记住并正确处理(并将详细信息存储在配置文件中)。这对每个人来说都是可怕的,幸运的是后来的总线 (PCI) 避免了这个问题。

    注 2:实际上有一个“即插即用 ISA”规范(来自 Microsoft)来添加一种自动检测 ISA 设备及其资源(例如 IO 端口)的方法。不管是好是坏,支持此规范的 ISA 卡都极为罕见。主要是因为 PCI 在大多数制造商试图支持它之前就到了。现在 ISA 插槽已经过时了(我们在主板中留下了一些带有固定 IO 端口的旧部件),没有必要支持它(或一般的 ISA 插槽)。

    注 3:我忽略了某些 PC 上(简要地)存在的其他总线类型(EISA、MCA)。这些在使用时并不常见,现在极为罕见(例如,您可能会在某个地方的博物馆中找到一个可以使用的产品,但他们不会让您将其带回家来测试您的软件)。

    注 4:一些 CPU(主要来自 1980 年代末和 1990 年代初的 Cryix 和 IBM)为 CPU 本身使用了一些 IO 端口,并将它们用作各种事物(CPU 功能和缓存控制)的配置寄存器。再次;现在一切都太老了。

    关于assembly - 从哪里获得硬件的 I/O 端口地址分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62212913/

    相关文章:

    assembly - 如何在汇编中打印笑脸字符?

    assembly - `dup (?)` 在 TASM 中是什么意思?

    c++ - 在 __asm 中插入注释导致 C2400 错误 (VS2012)

    c - 使用 fscanf 读取输入文件在中线失败

    c - 在 64 位汇编中编写函数

    c# - 文件被两个进程使用

    带有 java.io 包的 Java react 器模式

    memory - x86 mov/add 指令和内存寻址

    assembly - 20 个字节而不是 20 个字节是多少?

    assembly - MSP430 中的 sxt 指令到底有什么作用?