2011-02-10 82 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-