Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory x86内存和I/O映射_Memory_Assembly_X86 - Fatal编程技术网

Memory x86内存和I/O映射

Memory x86内存和I/O映射,memory,assembly,x86,Memory,Assembly,X86,学期结束了,所以我又沉迷于组装。我已经阅读了x86系列用户手册中有关内存映射和I/O的一些文章和部分,但我仍然没有弄清楚它是如何工作的。。据我现在所知,我可以通过输入和输出指令访问I/O,在这种情况下,我用作参数的端口号是否实际上是某个预定义区域的相对地址?或者这两条指令在执行时做什么?或者I/O的寻址方式与RAM完全不同?硬件报告是硬件的接口。每个端口号都映射到特定的设备。 在受保护模式下,您无法访问端口,这必须在内核模式下完成 在DOS模式下,您可以这样做。I/O端口有点像内存地址,但使用输

学期结束了,所以我又沉迷于组装。我已经阅读了x86系列用户手册中有关内存映射和I/O的一些文章和部分,但我仍然没有弄清楚它是如何工作的。。据我现在所知,我可以通过输入和输出指令访问I/O,在这种情况下,我用作参数的端口号是否实际上是某个预定义区域的相对地址?或者这两条指令在执行时做什么?或者I/O的寻址方式与RAM完全不同?

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

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

I/O端口有点像内存地址,但使用输入和输出指令进行不同的访问。关于现代硬件的整个故事非常复杂,但在真实模式下访问遗留设备却非常简单。下面是一个如何从键盘上读取扫描代码的示例,即键盘控制器

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分配在很久以前就得到了修复


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

不可能以与内存相同的方式寻址I/O

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

您打算使用哪个操作系统?我不打算使用任何操作系统,因为这不依赖于操作系统,但是微处理器的架构……你错了!在IA32保护模式下,不允许正常的I/O访问,并将导致I/O异常,因此您需要编写I/O内核驱动程序。ahhhpff。。。好的,假设我是在真实模式下工作,在硬件中完成事情的方式不依赖于O.S.仍然是正确的。O.S.控制的事实并不意味着硬件的改变。不可能,谢谢你。。那么,除了输入和输出之外,使用其他指令访问I/O有什么用呢?内存空间和I/O空间是独立的。有些设备使用内存映射I/O,这意味着它们是通过正常的内存读写来访问的。两种方案都有优缺点,这就是为什么一些硬件制造商使用I/O地址,而一些使用内存映射I/O。当访问pci设备时,我如何知道应该使用端口还是I/O内存进行访问?它取决于cpu还是pci设备?