2012-02-16 14 views
-5

pushadは32ビットレジスタをスタックにプッシュしますが、最終的にスタックに格納されるレジスタはEDIだけです。フラグの値は影響を受けませんので、押しボタンを使用するポイントは何ですか?さらに、私はpushfdがすべてのフラグ値をダブルフォーマットでプッシュすることを知っています。フラグの値が通常0または1の場合、pushfd操作は00000A46などの値をスタックにどのようにプッシュしますか?PushfdとPushad:ポイントは何ですか?

+2

「スタックに格納される唯一のレジスタはEDIです」 - その結論にどうやって到達しましたか? – interjay

+0

どこにいるのか分かりません。 pushaとpushfは16ビットコードでpushadとpushfdは32ビットコードで使用します。 A46は12ビットです。 –

+0

この質問は意味がありません。 EDIビットが真ではない、その部分の説明を与えてください。フラグは何の影響を受けませんか? 「ダブルフォーマット」とは何ですか?あなたは旗やEFLAGSの登録について話していますか?また、32ビットまたは16ビットコードですか? Etc. – Simon

答えて

19

...最終的にスタックに格納されるレジスタはEDIだけです。

いいえPUSHAD命令は常に全て 8汎用レジスタスタックにプッシュします。単一PUSHAD命令は、書き込みにequivilentある:

Push EAX 
Push ECX 
Push EDX 
Push EBX 
Push ESP 
Push EBP 
Push ESI 
Push EDI 

POPADは、このように全てのレジスタ値を復元する、逆順でバックスタックから値をポップ。

PUSHADとPOPADは、各レジスタを順番にPUSHとPOPすることなく、汎用レジスタの保存と復元を簡単に実行するのに便利です。

同様に、PUSHFDとPOPFDは、EFLAGSレジスタの保存と復元に使用されます。通常のプログラムではあまり使用されていませんが、(たとえば)プロセスコンテキストスイッチが実行されたとき(またはフラグレジスタの値を復元する必要がある場合など)に役立ちます。

pushfd操作は、00000A46などの値をスタックにどのようにプッシュしますか?

データがどのように解釈されるかだけです。 EFLAGSレジスタは32ビットのセットです。ビットを4つの8つのグループ(8 * 4 = 32)に分割する場合は、各4ビットチャンクを16進文字(0..9、A〜F)にマップできます。同様に、16進数の値を一連のビットに変換することができます。

00000A46 = 0000(0)0000(0)0000(0)0000(0)0000(0)1010(A)0100(4)0110 (6)

これらは、EFLAGSレジスタに格納されたビットの値です。

関連する問題