24531904_j

24531904_j 24531904_j

16.02.2013 Aufrufe

OUTS/OUTSB/OUTSW/OUTSD—Output String to Port オペコード 命令 説明 6E OUTS DX, DS:(E)SI アドレス DS:(E)SI のバイトを DX の I/O ポートに出力する。 6F OUTS DX, DS:SI アドレス DS:SI のワードを DX の I/O ポートに出力する。 6F OUTS DX, DS:ESI アドレス DS:ESI のダブルワードを DX の I/O ポートに出力する。 6E OUTSB アドレス DS:(E)SI のバイトを DX の I/O ポートに出力する。 6F OUTSW アドレス DS:SI のワードを DX の I/O ポートに出力する。 6F OUTSD アドレス DS:ESI のダブルワードを DX の I/O ポートに出力する。 説明 これらの命令は、 データを第2 オペラン ド ( ソース・ オペランド ) から第1 オペラン ド ( デステ ィ ネーシ ョ ン ・ オペラン ド ) で指定された I/O ポー トにコピーする。 ソース ・ オペ ランドは、 アド レス DS:ESI のメモリ ・ロケーションである( オペラン ド ・ サイズ属性が 16 の場合は、 SI レジスタがソース ・ インデックス ・ レジスタとして使用される )。 DS セグメ ントをセグメント ・オーバライド ・プリフィックスでオーバライドすることができる。 デステ ィ ネーシ ョ ン ・ オペラン ド は、 I/O ポー ト ・アドレス 0 ~ 65535 にアクセスできる ように、 DX レジスタでなければならない。 8 ビットのI/O ポー トにアクセスする場合 は、 ポー ト ・ サイズはオペコ ー ド に よ って決ま る。 16 ビッ トまたは32 ビッ トのI/O ポー トにアクセスする場合は、 ポート ・サイズはオペランド ・サイズ属性によって決まる。 OUTSB、 OUTSW、 OUTSD ニーモニッ クは、 それぞれ OUTS 命令のバイ ト 版、 ワ ー ド 版、 ダブルワ ー ド 版のシ ノ ニムであ る (OUTS 命令では、 命令の中で "DS:ESI" を明示的 に指定しなければならない )。 バイ ト、 ワー ド、 またはダブルワー ドがメモリ ・ ロケーシ ョ ンから I/O ポ ー ト に転送 さ れた後、 ESI レジスタは EFLAGS レジスタ内のDF フラグの設定に従って自動的にイン クリメントまたはデクリメントされる。 (DF フラグが0 である場合は、 ESI レジスタは インク リ メン ト される。 DF フラグが1 である場合は、 ESI レジスタはデクリメント され る。 ) ESI レ ジ ス タ は、 バイ ト 操作の場合は 1、 ワー ド操作の場合は 2、 ダブルワー ド操 作の場合は 4、 それぞれインク リ メン ト またはデク リ メン ト される。 OUTS、 OUTSB、 OUTSW、 OUTSD 命令は、 前に REP プリフィックスを付けると、 ECX バイ ト、 ワー ド、 またはダブルワー ドのブロ ッ ク入力を行える。 REP プリフィックスの 説明については、 3:713 ページの 「REP/REPE/REPZ/REPNE/REPNZ—Repeat String Operation Prefix」 を参照のこ と。 OUTS、 OUTSB、 OUTSW、 または OUTSD 命令の実行後、 プ ロ セ ッ サは、 OUT トランザ ク シ ョ ンの完了を確認してか ら、 次の命令の実行を開始する。 ただし、 OUT トランザク シ ョ ンが ま だ完了していな く て も 、 次の命令がプ リ フ ェ ッ チ さ れる場合がある。 この命令は、 プロセッサのI/O アドレス空間にあるI/O ポー トのアクセスだけに有用であ る。 I/O トランザクションは、すべての先行するデータ・メモリ操作の後で実行される。これ 以降のデータ・メモリ操作は、I/O トランザクションを通ることができない。 Itanium ベース・システム環境では、I/O ポートの参照は、IOBase レジスタで指定される 64 ビット仮想アドレスに、4K バイト仮想ページ当たり 4 ポートずつマッピングされる。 オペレーティング・システムは、Itanium アーキテクチャの TLB を利用して、任意の 4 つ の I/O ポートへのアクセス許可を付与または拒否できる。I/O ポート空間は、オペレーティ ング・システム・コードによって、任意の 64 ビット物理メモリ・ロケーションにマッピ ングされる。CFLG.io = 1 かつ CPL > IOPL の場合は、TSS を参照して、I/O 許可を与える かどうかを決定する。CFLG.io = 0 または CPL

OUTS/OUTSB/OUTSW/OUTSD—Output String to Port ( 続き ) 参照される I/O ポートが (I/O ベース・レジスタを介して ) 実装されていない仮想アドレ スにマッピングされる場合や、データ変換がディスエーブル (PSR.dt = 0) になっている 場合は、その I/O ポートを参照する OUTS 命令を発行すると、GPFault が発生する。 操作 IF ((PE = 1) AND ((VM = 1) OR (CPL > IOPL))) THEN (* Protected mode or virtual-8086 mode with CPL > IOPL *) IF (CFLG.io AND Any I/O Permission Bit for I/O port being accessed = 1) THEN #GP(0); FI; ELSE ( * I/O operation is allowed *) FI; IF (Itanium_System_Environment) THEN DEST_VA = IOBase | (Port{15:2}

OUTS/OUTSB/OUTSW/OUTSD—Output String to Port ( 続き )<br />

参照される I/O ポートが (I/O ベース・レジスタを介して ) 実装されていない仮想アドレ<br />

スにマッピングされる場合や、データ変換がディスエーブル (PSR.dt = 0) になっている<br />

場合は、その I/O ポートを参照する OUTS 命令を発行すると、GPFault が発生する。<br />

操作<br />

IF ((PE = 1) AND ((VM = 1) OR (CPL > IOPL)))<br />

THEN (* Protected mode or virtual-8086 mode with CPL > IOPL *)<br />

IF (CFLG.io AND Any I/O Permission Bit for I/O port being accessed = 1)<br />

THEN #GP(0);<br />

FI;<br />

ELSE ( * I/O operation is allowed *)<br />

FI;<br />

IF (Itanium_System_Environment) THEN<br />

DEST_VA = IOBase | (Port{15:2}

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!