2013-02-19 14 views
8

は、例えば、六角を与えられた:83 E4 F0x86命令のオペランドサイズが16進数のマシンコードのみであることを確認しますか?

インテル・デベロッパーズ・マニュアルを見ることによって、私は83andを意味し、FO-16を意味することを把握することができます。 E4を見ると、ソース/デスティネーションレジスタがSPかESPかをデコードできます。

したがって、この16進数は、and $-16, %ESPまたはのいずれかを意味すると判断できます。ただし、マニュアルでは、両方とも83 /4 ibと記載されています。

どうやって区別できますか?

+2

です。実モードの場合、または現在のセグメント/セレクタのデフォルトのオペランドサイズが16ビットに設定されている場合、 'and sp、-16'として実行されます。 「通常は」32ビットバージョンです。 – harold

答えて

7

haroldが言うように、デフォルトのオペランドサイズは命令にエンコードされていませんが、現在のプロセッサモードに依存します。

リアルモードと16ビット保護モードでは、デフォルトのオペランドサイズは16ビットなので、83 E4 F0and $-16, %spにデコードされます。

32ビットモードでは、オペランドサイズのデフォルトは32ビットなので、and $-16, %espです。

x64モードでは、ほとんどの命令は、プッシュ、ポップ、コール、リターンなど、スタックを間接的に使用するブランチと分岐を除いて、32ビットオペランドサイズにデフォルト設定されているため、再びand $-16, %espにデコードされます。

接頭辞を使用してデフォルトのオペランドサイズを上書きすることは可能です。たとえば、プレフィックス66hは32ビットと16ビットのオペランドサイズを切り替えるため、66 83 E4 F0は16ビットモードでand $-16, %espにデコードし、32ビットモードまたは64ビットモードではand $-16, %spにデコードします。 64ビットオペランドサイズを取得するには、Wビットが設定されたREX prefixを使用する必要があります。したがって、48 83 E4 F0and $-16, %rspにデコードされます(ただし、64ビットモードのみ)。

+0

は、プロセッサがどのモードで動作しているかわかります。 – Hery

+2

これ以上の文脈ではありません。バイトはどこから来ますか?記憶?ファイル?洗い流されたボトルに見つかりましたか?夢の中であなたに来た? –

+0

16進文字列はファイルのものですが、ASCII文字列としてエンコードされています(この全体がコースプロジェクトなので、単純な形式です)。プロセッサの動作モードを格納するレジスタのようなものがありますか? – Hery

0

保護モードでは、それは32ビットバージョンのみになります.16ビットと64ビットバージョンの両方にプレフィックスサイズのオーバーライドバイトが必要です。この場合、16ビットバージョンでは0x66プレフィックスの上書きが必要になるため、66:83 E4 F0になります。インテルは、ANDの記述でこれを明確に述べています。

命令のデフォルト動作サイズは32ビットです。

及び066Hのための基準、章2.2.1:

オペランドサイズオーバーライドプレフィックスは、プログラムが、16〜32ビット オペランドサイズを切り替えることができます。どちらのサイズもデフォルトにすることができます。接頭辞を使用すると、デフォルト以外の サイズが選択されます。

+0

私はdownvoterではありませんが、あなたの答えはharoldのコメントとちょっと矛盾しています... – Hery

+0

@Hery:32ビットまたは64ビットプロテクトモードでhesを仮定しています(これは "標準"です。 16または64ビットバージョンを生成するには、オーバーライドプレフィックスを使用します。 haroldには全く矛盾しません。プロテクトモードの定義です(ただし、30年前の16ビットCPUを使用していない限り....)。 – Necrolis

+1

実際には、28ビットに導入された16ビットプロテクトモードも存在します。 –

関連する問題