10

たとえば、16進数の場合: 83 E4 F0

インテルの開発者向けマニュアルを見ると、それが83意味することandFO意味することがわかり-16ます。を見るとE4、送信元/宛先レジスタがSPまたはESPのいずれかであることがデコードできます。

and $-16, %ESPしたがって、16進数はまたはのいずれかを意味すると結論付けることができますand $-16, %SP。ただし、マニュアルでは、両方ともとしてリストされてい83 /4 ibます。

これら2つをどのように区別できますか?

4

2 に答える 2

10

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

リアル モードと 16 ビット プロテクト モードでは、デフォルトのオペランド サイズは 16 ビットなので83 E4 F0and $-16, %sp.

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

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

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

于 2013-02-20T13:27:19.057 に答える
0

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

64 ビット モードでは、命令のデフォルトの操作サイズは 32 ビットです。

および 066H のリファレンス、第 2.2.1 章:

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

于 2013-02-19T16:54:55.013 に答える