2011-02-10 31 views
0

如何使用IN/OUT指令将数据加载/存储到外围地址大于2^16的地方。 当我使用IN/OUT指令时,可以说OUT DX, AL,我知道DX的段寄存器没有被使用,所以我只能访问前2^16个地址(因为DX是16位长)。8086系统IN/OUT快速问题

我的设备之一是地址18000h。我怎样才能达到它?内存/ IO空间overlapps(不使用M/IO引脚),因此,它是确定这样说

MOV BX, 18000h 
MOV [BX], AL 

我是很新的这样的事情,所以我会很感激的任何帮助旧的,硬核,asm程序员,如果你们中的任何人在这里:) 谢谢。

回答

3

你不能用IN or OUT指令!

x86处理器支持一个I/O地址空间,其中包含多达65,536个8位I/O端口 。

英特尔数据表:

处理器允许应用程序 访问I/O端口以两种 方式:

  • 通过独立的I/O地址空间
  • 通过内存映射I/O

通过I/O 地址空间访问I/O端口通过I/O指令的集合 和特殊I/O 保护机制处理。通过存储器映射I/O访问I/O端口 是 通过处理器 通用移动和字符串 指令,通过分段或分页提供保护 。可以映射I/O 端口,以便它们在出现在I/O地址空间或 物理内存地址空间(内存 映射的I/O)或两者中。

+0

好的,我已经知道了。我改变了模式。那个组织不必要地复杂化了。现在所有外围都低于65536,所以它应该工作正常(至少在纸上:))。感谢你的回答。 – Klark 2011-02-10 20:23:09

0

如果您的系统是386或更高版本,您可以使用操作数大小覆盖前缀,这会导致“out edx,al”。您需要使用相同的前缀,也许还需要使用运算符大小覆盖前缀来首先加载edx。 Al加载了一个标准的8086 mnemomic-