16.02.2013 Aufrufe

24531904_j

24531904_j

24531904_j

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

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

プロセッサは、 最後に新しいコ ー ド ・ セグメン ト 内のコ ール先プロシージ ャのア ド レス<br />

にジャンプする。 このプロシージャ ・ アド レスは、 ターゲッ ト ・ オペランドで指定され<br />

たオ フ セ ッ ト である。 こ の場合 も 、 タ ー ゲ ッ ト ・ オペラ ン ド は、 ポ イ ン タ (ptr16:16 また<br />

は ptr16:32) を使用して直接に、 またはメモ リ ・ ロケーシ ョ ン (m16:16 または m16:32) を<br />

使用して間接的に、 コ ー ル ・ ゲー ト と プ ロ シ ー ジ ャ の far アドレスを指定できる。<br />

CALL 命令で タ ス ク ・ ス イ ッ チを実行す る のは、 コ ー ル ・ ゲ ー ト を介した コ ー ルを実行<br />

す る のに似てい る。 タ ス ク ・ ス イ ッ チの場合、 タ ー ゲ ッ ト ・ オペラ ン ド は、 切 り 替え先<br />

タスクへのタスク・ゲートのセグメント ・セレクタと、 切り替え先タスク内のコール先<br />

プロシージャのアド レスを指定する。 次に、 タスク ・ゲー トがタスクの TSS を指す。<br />

TSS の内容はタスクのコー ドおよびスタックの両セグメン トのセグメン ト ・ セレクタで<br />

ある。 CALL 命令は、 TSS のセグ メ ン ト ・ セレ ク タ を直接指定で き る。 タ ス ク ・ ス イ ッ<br />

チの仕組みの詳細は、 『IA-32 インテル ® アーキテクチャ ・ ソフ ト ウェア ・ ディベロッ<br />

パ ー ズ ・ マニ ュ アル、 下巻』 を参照の こ と 。<br />

操作<br />

IF near call<br />

THEN IF near relative call<br />

IF the instruction pointer is not within code segment limit THEN #GP(0); FI;<br />

THEN IF OperandSize = 32<br />

THEN<br />

IF stack not large enough for a 4-byte return address THEN #SS(0); FI;<br />

Push(EIP);<br />

EIP ← EIP + DEST; (* DEST is rel32 *)<br />

ELSE (* OperandSize = 16 *)<br />

IF stack not large enough for a 2-byte return address THEN #SS(0); FI;<br />

Push(IP);<br />

EIP ← (EIP + DEST) AND 0000FFFFH; (* DEST is rel16 *)<br />

FI;<br />

FI;<br />

ELSE (* near absolute call *)<br />

IF the instruction pointer is not within code segment limit THEN #GP(0); FI;<br />

IF OperandSize = 32<br />

THEN<br />

IF stack not large enough for a 4-byte return address THEN #SS(0); FI;<br />

Push(EIP);<br />

EIP ← DEST; (* DEST is r/m32 *)<br />

ELSE (* OperandSize = 16 *)<br />

IF stack not large enough for a 2-byte return address THEN #SS(0); FI;<br />

Push(IP);<br />

EIP ← DEST AND 0000FFFFH; (* DEST is r/m16 *)<br />

FI;<br />

FI:<br />

IF Itanium System Environment AND PSR.tb THEN IA-32_Exception(Debug);<br />

FI;<br />

IF far call AND (PE = 0 OR (PE = 1 AND VM = 1)) (* real address or virtual 8086 mode *)<br />

THEN<br />

IF OperandSize = 32<br />

THEN<br />

IF stack not large enough for a 6-byte return address THEN #SS(0); FI;<br />

IF the instruction pointer is not within code segment limit THEN #GP(0); FI;<br />

Push(CS); (* padded with 16 high-order bits *)<br />

Push(EIP);<br />

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!