如何使用IN / OUT指令将数据加载/存储到地址大于2 ^ 16的外围。
当我使用IN / OUT指令时,让我们说OUT DX, AL
,我知道没有使用DX的段寄存器,因此我只能访问前2 ^ 16个地址(因为DX长16位)。
我的一个设备位于地址18000h
。我该怎么办?内存/ IO空间重叠(不使用M / IO引脚),所以可以说
MOV BX, 18000h
MOV [BX], AL
我对这类事情都很陌生,所以如果有人在这里,我真的很感谢来自旧的,核心的,asm程序员的任何帮助:) 感谢。
答案 0 :(得分:3)
你不能用IN or OUT
指令!
x86处理器支持最多包含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地址空间或 物理记忆地址空间(记忆 映射的I / O)或两者。
答案 1 :(得分:0)
如果您的系统是386或更高版本,您可以使用操作数大小覆盖前缀,这将导致“out edx,al”。您需要使用相同的前缀,也许还需要使用运算符大小覆盖前缀来加载edx。铝装有标准的8086 mnemomic -