7

私は、bastardlibdisの x86 逆アセンブラー ライブラリを使用しており、メモリにアクセスする命令を見つけようとしています。

次の 2 つの手順を参照してください。

mov eax, [ebx + 10]
lea eax, [ebx + 10]

ではlibdis、どちらも命令タイプinsn_movでリストされており、どちらの場合もアドレス オペランドのフラグは同じです。したがって、メモリがアクセスされているかどうかを知る唯一の方法は、命令ニーモニックを見ることです。

したがって、私の質問: LEA は、実際にメモリにアクセスしないメモリ オペランドを使用する唯一の命令ですか? 参照へのリンクはどれでもいいでしょう。

4

3 に答える 3

10

Intel には、メモリ アドレッシング オペランドを使用するオペコードを含むマルチバイトの「NOP」命令があります。0F 1F /0Intelのマニュアルから:

マルチバイト NOP 命令は、レジスタの内容を変更せず、メモリ操作を発行しません。

コメントでの議論は、マップされていないページの最後に a のオペコード バイトを配置するnopことと、ModR/M および変位バイトを含む完全な命令を読み取ることができない場合のコード フェッチ フォールトに関するものです。それはこの質問と直交しています。


long-NOP は次のように機能すると考えることができます。

  • 命令デコード ハードウェアは、ModRM (オプションの SIB および/または置換を意味する) を取る命令の終わりを見つける方法を知っています。
  • 特にNOPであるそのオペコードに基づいて、CPUの残りの部分は、ModRMによってエンコードされたアドレッシングモードで何もしません。

これにより、ソフトウェアは、さまざまなアドレッシング モードとプレフィックスを使用してマルチバイト NOP をエンコードできます。CPU は、もう 1 つのオペコードをnop. 全体的な命令形式は、ほとんどのものと同じです。

于 2013-12-17T00:24:48.060 に答える