x86内存和I / O映射

时间:2010-07-07 11:14:43

标签: memory assembly x86

学期结束了,所以我再次沉入装配。我已经阅读了有关内存映射和I / O的x86系列用户手册的一些文章和部分,我仍然没有弄清楚它是如何工作的......正如我现在所理解的那样,我可以用IN访问I / O. OUT指令,在这种情况下是否像我用作参数的端口号实际上是某个预定义区域的相对地址?或者这两条指令在执行时会做什么?或者I / O的处理方式与RAM完全不同?

3 个答案:

答案 0 :(得分:3)

I / O端口类似类似于内存地址,但使用IN和OUT指令以不同方式访问。关于现代硬件的完整故事非常复杂,但在实模式下访问传统设备非常简单。以下是如何从键盘(技术上,键盘控制器)读取扫描代码的示例。

Wait:
  IN  AL, 64H   ; read keyboard status port
  AND AL, 1     ; a key is ready when bit 0 is set
  JZ  Wait
  IN  AL, 60H   ; read scan code

端口号60H和64H是由IBM在您出生之前的某个时间建立的,但从那时起,每台PC都以向后兼容的名义模仿了这种行为。其他传统设备也有固定的端口号。如果你有一个软盘驱动器,这是一个有趣的:

MOV DX, 3F2H  ; 3F2 is the floppy controller's control port
MOV AL, 10H   ; turn on bit 4
OUT DX, AL    ; start the floppy motor!

对于大于8位的端口号(例如3F2),您必须先将端口号放在DX中(只是指令集的一个怪癖)。同样,随着IBM PC的推出,3F2的分配在很久以前得到了解决。

在现代公交车上访问今天的设备要复杂得多。

答案 1 :(得分:0)

Hardwareports是硬件接口。每个端口号都映射到特定设备。 在保护模式下,您无法访问端口,这必须在内核模式下完成。

在DOS模式下,你可以这样做。

答案 2 :(得分:0)

无法以与内存相同的方式处理I / O.

I / O和内存有一个公共地址总线。但是,您是否访问内存或I / O取决于您使用的说明。有M / IO引脚决定一个或另一个。 然而,整个机制要复杂得多,并且在一定程度上取决于系统的设计。对于我最喜欢的设计 - 如果你想使用mov指令编程设备,你需要编程设备地址解码器,以便设备开始响应这些地址范围。