24531904_j

24531904_j 24531904_j

16.02.2013 Aufrufe

PUSH—Push Word or Doubleword onto the Stack オペコード 命令 説明 FF /6 PUSH r/m16 r/m16 をプッシュする。 FF /6 PUSH r/m32 r/m32 をプッシュする。 50+rw PUSH r16 r16 をプッシュする。 50+rd PUSH r32 r32 をプッシュする。 6A PUSH imm8 imm8 をプッシュする。 68 PUSH imm16 imm16 をプッシュする。 68 PUSH imm32 imm32 をプッシュする。 0E PUSH CS CS をプッシュする。 16 PUSH SS SS をプッシュする。 1E PUSH DS DS をプッシュする。 06 PUSH ES ES をプッシュする。 0F A0 PUSH FS FS をプッシュする。 0F A8 PUSH GS GS をプッシュする。 説明 スタック ・ ポインタをデク リ メントし、 次にソース ・ オペランドをプロシージャ ・ ス タックのトップにストアする。 スタック ・セグメントの現在のアドレス・サイズ属性と、 オペラン ド ・ サイズ属性によ って、 スタ ッ ク ・ ポインタをデク リ メン ト する量が決ま る ( 下記の 「操作」 を参照 )。 例えば、 32 ビッ トのアドレス指定とオペランドが使用されて いる場合は、 ESP レジスタ ( スタック ・ ポインタ ) が 4 ずつデク リ メン ト される。 16 ビッ トのアドレス指定とオペランドが使用されている場合は、 SP レジスタ (16 ビッ ト ・ アドレス指定のスタック ・ポインタ) が 2 ずつデク リ メン ト される。 スタ ッ クのア ド レ ス・サイズ属性が32 である と きに 16 ビット ・オペランドをプッシュすると、 スタッ ク・ポインタでアライメント不正が発生することがある( すなわち、 スタ ッ ク ・ ポイン タはダブルワー ド境界にアライメントが合っていない )。 PUSH ESP 命令は、 命令が実行される前に ESP レジスタの値が存在していたようにその 値をプ ッ シ ュする。 そのため、 ESP レジスタがオペランド ・アドレスの計算にベース ・ レジスタとして使用されるメモリ ・ オペランドを、 PUSH 命令が使用する と 、 ESP レジ スタがデクリ メン ト される前に、 オペランドの実効アドレスが計算される。 実ア ド レス ・ モー ド では、 PUSH 命令が実行 さ れる と き に、 ESP レジスタまたは SP レジ スタが 1 であ る場合、 プ ロ セ ッ サは ス タ ッ ク ・ スペー スの不足に よ っ てシ ャ ッ ト ・ ダ ウ ンする。 こ の状態を示す例外は生成 さ れない。 操作 IF StackAddrSize = 32 THEN IF OperandSize = 32 THEN ESP ← ESP − 4; SS:ESP ← SRC; (* push doubleword *) ELSE (* OperandSize = 16*) ESP ← ESP − 2; SS:ESP ← SRC; (* push word *) FI; 3:696 第 3 巻 : IA-32 基本命令リファレンス

PUSH—Push Word or Doubleword onto the Stack ( 続き ) ELSE (* StackAddrSize = 16*) IF OperandSize = 16 THEN FI; FI; SP ← SP − 2; SS:SP ← SRC; (* push word *) ELSE (* OperandSize = 32*) SP ← SP − 4; SS:SP ← SRC; (* push doubleword *) 影響を受けるフラグ なし。 追加の Itanium ベース・システム環境例外 Itanium アーキテクチャ ・ レジスタ ・ フォルト Itanium アーキテクチャ ・ メモリ ・ フォル ト NaT レ ジ ス タ参照アボ ー ト 。 VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、 データ TLB フォルト、 代替データTLB フォルト、 デー タ・ページ不在フォルト、 データNaT ページ参照アボー ト、 データ・キー・ ミス・フォルト、 データ・キー許可 フォルト、 データ・アクセス権フォルト、 データ・アクセ ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ ルト。 保護モード例外 #GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、 または GS セグ メ ン ト の範囲外の場合。 DS、 ES、 FS、 または GS レジスタを使用してメモリがア クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ クタであった場合。 #SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範 囲外の場合。 #PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。 #AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが イネーブルにされていて、 アライメントが合わないメモリ 参照が行われた場合。 実アドレス・モード例外 #GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、 または GS セグ メ ン ト の範囲外の場合。 #SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範 囲外の場合。 SP レジスタまたは ESP レジスタの新しい値がスタック ・ セグ メ ン ト の範囲外の場合。 第 3 巻 : IA-32 基本命令リファレンス 3:697

PUSH—Push Word or Doubleword onto the Stack ( 続き )<br />

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

IF OperandSize = 16<br />

THEN<br />

FI;<br />

FI;<br />

SP ← SP − 2;<br />

SS:SP ← SRC; (* push word *)<br />

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

SP ← SP − 4;<br />

SS:SP ← SRC; (* push doubleword *)<br />

影響を受けるフラグ<br />

なし。<br />

追加の Itanium ベース・システム環境例外<br />

Itanium アーキテクチャ ・<br />

レジスタ ・ フォルト<br />

Itanium アーキテクチャ ・<br />

メモリ ・ フォル ト<br />

NaT レ ジ ス タ参照アボ ー ト 。<br />

VHPT データ ・ フォル ト、 ネス ト された TLB フォルト、<br />

データ TLB フォルト、 代替データTLB フォルト、 デー<br />

タ・ページ不在フォルト、 データNaT ページ参照アボー<br />

ト、 データ・キー・ ミス・フォルト、 データ・キー許可<br />

フォルト、 データ・アクセス権フォルト、 データ・アクセ<br />

ス・ビット ・フォルト、 データ・ダーティ ・ビット ・フォ<br />

ルト。<br />

保護モード例外<br />

#GP(0) メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

DS、 ES、 FS、 または GS レジスタを使用してメモリがア<br />

クセスされ、 レジスタの内容が NULL セグメン ト ・ セレ<br />

クタであった場合。<br />

#SS(0) メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

#PF ( フォルト ・コード ) ペー ジ ・ フ ォ ル ト が発生した場合。<br />

#AC(0) 現行特権レベルが 3 のときに、 アライメント ・チェックが<br />

イネーブルにされていて、 アライメントが合わないメモリ<br />

参照が行われた場合。<br />

実アドレス・モード例外<br />

#GP メモリ ・ オペランドの実効アドレスが CS、 DS、 ES、 FS、<br />

または GS セグ メ ン ト の範囲外の場合。<br />

#SS メモリ ・ オペランドの実効アドレスが SS セグメン ト の範<br />

囲外の場合。<br />

SP レジスタまたは ESP レジスタの新しい値がスタック ・<br />

セグ メ ン ト の範囲外の場合。<br />

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!