16.02.2013 Aufrufe

24531904_j

24531904_j

24531904_j

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

CALL ─ Call Procedure ( 続き )<br />

near コ ールを実行する と き、 絶対ア ド レ スを示すタ ーゲ ッ ト ・ オペラ ン ド のサイズ (16<br />

ビッ トまたは32 ビッ ト ) は、 オペラン ド ・ サイズ属性によ って決ま る。 絶対アド レス<br />

は、 EIP レ ジ ス タ に直接ロ ー ド さ れる。 相対オ フ セ ッ ト が指定 さ れてい る場合は、 その<br />

値が EIP レジスタの値に加算される。 オペランド ・サイズ属性が16 の場合は、 EIP レジ<br />

スタの上位2 バイ ト が 0 にク リアされ、 命令ポインタの最大サイズは 16 ビッ トになる。<br />

CS レジスタは near コールでは変わらない。<br />

far コールを実行する と きは、 プロセッサは、 リ ターン命令ポインタ として使用するため<br />

に、 CS および EIP 両レ ジ ス タ の現在の値をプ ロ シ ー ジ ャ ・ ス タ ッ ク にプ ッ シ ュ す る。 プ<br />

ロセッサは、 次にコール先プロシージャのターゲット ・オペランドで指定されるコー<br />

ド・セグメントとオペランドへのfar ジャンプを実行する。 この場合、 ターゲット ・オ<br />

ペラン ド は、 絶対far アドレスをポインタ (ptr16:16 または ptr16:32) で直接的に、 ま たは<br />

メモリ ・ ロケーシ ョ ン (m16:16 または m16:32) で間接的に指定す る。 ポ イ ン タ方式では、<br />

コ ー ル先プ ロ シ ー ジ ャ のセグ メ ン ト と ア ド レ ス は、 命令内で 4 バイ ト (16 ビッ ト ・オペ<br />

ランド ・ サイズ ) または 6 バイ ト (32 ビッ ト ・オペランド ・サイズ) の far 即値ア ド レ ス<br />

を使用して コ ー ド 化 さ れる。 間接方式では、 タ ー ゲ ッ ト ・ オペラ ン ド は、 4 バイ ト (16<br />

ビッ ト ・オペランド ・サイズ) または 6 バイ ト (32 ビッ ト ・オペランド ・サイズ) の far<br />

アドレスがストアされているメモリ ・ロケーションを指定する。 オペランド ・サイズ属<br />

性に よ って far アドレス内のオフセットのサイズ(16 または 32 ビット ) が決ま る。 far ア<br />

ドレスはCS および EIP レジスタに直接ロード される。 オペランド ・サイズ属性が16 の<br />

場合は、 EIP レジスタの上位2バイ ト が 0 にク リアされる。<br />

32 ビッ ト ・ コード ・セグメントから 16 ビッ ト ・ コード ・セグメントへのfar コールは、<br />

32 ビ ッ ト ・ コ ー ド ・ セグ メ ン ト の最初の 64K バイ ト から実行しなければならない。 これ<br />

は、 命令のオペラ ン ド ・ サ イ ズ属性が 16 に設定されるため、 16 ビッ トのリターン・ア<br />

ドレス・オフセットだけがセーブされるからである。 また、 このコールは、 16 ビット値<br />

がスタ ッ ク上にプッ シュ される よ うに、 16 ビ ッ ト ・ コール ・ ゲー ト を使用して実行しな<br />

ければならない。<br />

プ ロ セ ッ サが保護モ ー ド で動作している と き は、 far コ ー ルを使用して、 異な る特権レベ<br />

ルにあるコー ド ・ セグメン ト にアクセスしたり、 タスクを切り替えられる。 この場合、<br />

プロセッサは、 far アドレスのセグメント ・セレクタ部を使用して、 ジャンプ先セグメン<br />

トのセグメント ・ディスク リプタにアクセスする。 CALL 命令は、 セグ メ ン ト ・ セレ ク<br />

タ内の タ イ プお よ びア ク セス権情報の値に基づいて、 以下の操作を実行で き る。<br />

• 同じ特権レベルへの far コール( 前の段落で説明 )。<br />

• 異なる特権レベルへの far コール。 Itanium ベース・システム環境では、<br />

IA-32_Intercept(Gate) が発生する。<br />

• タスク ・ スイッチ。 Itanium ベース・システム環境では、IA-32_Intercept(Gate) が発<br />

生する。<br />

特権レベル間の far コールを実行するときは、 コール先プロシージャのコード ・セグメ<br />

ン ト にはコール ・ ゲー ト を介してアクセスする。 コール ・ ゲー ト はターゲッ ト ・ オペラ<br />

ンドによって指定されるセグメント ・セレクタによって指定される。 コール・ゲートを<br />

介して コ ー ルを実行す る と き に特権レベルの移行が発生する場合は、 プ ロ セ ッ サは、<br />

コール先プロシージャの特権レベルのスタックに切り替え、 CS および EIP レジスタの現<br />

在値 と 元のス タ ッ ク の SS および ESP 値を新しいスタ ッ クにプッ シュしてから、 新しい<br />

コード ・セグメントへのfar ジャンプを実行する。 新しいコード ・セグメントは、 コー<br />

ル ・ ゲ ー ト ・ デ ィ ス ク リ プ タ で指定 さ れる。 新しいス タ ッ ク ・ セグ メ ン ト は、 現在実行<br />

中のタ ス クの TSS で指定される。 新しい コ ー ド ・ セグメ ン ト へのジ ャ ンプはスタ ッ ク ・<br />

スイッチの後で行われる。 プロセッサは、 新しいスタックに、 コール元プロシージャの<br />

スタックのセグメント ・セレクタとスタック ・ ポインタ、 およびコール元プロシージャ<br />

のコー ド ・ セグメン トのセグメン ト ・ セレクタと命令ポインタをプッシュする。 ( コー<br />

ル・ゲート記述子内の値によって、 新しいスタックにコピーするパラメータの数が決ま<br />

る。 )<br />

第 3 巻 : IA-32 基本命令リファレンス 3:409

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!