2013-12-16 7 views
6

私はthe bastardのx86ディスアセンブラライブラリlibdisを使用しています。どの命令がメモリにアクセスしているかを調べようとしています。これら2つの命令を参照してメモリにアクセスしないメモリオペランドを持つx86の唯一の命令ですか?

libdis

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

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

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

+0

私はそう思っています...確かに。 – Mehrdad

答えて

9

prefetch命令ファミリ(prefetcht1、prefetcht2、prefetcht3、prefetchnta)は、すぐに必要となるため、これらのメモリラインをキャッシュに入れてプルするようプロセッサに要求します。しかし、インテルの文書によれば、不良アドレスがプリフェッチに渡されても何の不具合も生じないことが明らかになっています。これは、ソフトウェアが最初にチェックせずにプリフェッチする可能性のあるアウト・オブ・バウンド・アドレスを渡すことができるようにするためです。その結果、チェックが実行されている間にデータを飛行させることができます。

プリフェッチには、LEAとは異なり、 '出力'もありません。

7

インテルは、メモリアドレッシングオペランドを取る一連の "NOP"命令を持っています。

私は、彼らがメモリに触れるとは思いません。実際には、実際にアドレスを作成してメモリマップを介して実行し、保護をチェックするかどうかはわかりません。私はそうは思わない;私はさまざまなサイズのスペースを埋めるNOPとして様々なアドレッシングモードでこれらの広い範囲を生成するコンパイラを構築し、トラップを取得しませんでした。

+2

彼らは[Peter Ferrieによる]メモにアクセスしたようです(http://pferrie.host22.com/misc/lowlevel2.htm):興味深いことに、その名前にもかかわらず、Mod/RMバイトがそれを伝えるなら、メモリにアクセスしますこのため、この「No OPeration」はページフォルトを引き起こす可能性があります。まったくNOPではありません。 –

+0

本当ですか?うーん。私は戻ってそのコードを再訪しなければならないでしょう。キャッシュ内になければメモリへのアクセスが遅くなる可能性があります。 –

+0

私は別の話をするようです:http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2010-September/003881.html私のコードジェネレータは、EAXを含む、提案されたコードをコンテキストで生成しますEAXは任意の値とすることができる。これらが実際にメモリを読み込んだ場合、私はトラップを取得するだろうが、私はこれで何の問題も抱えていない。フェリーやダブスのいずれかが間違っています。 –

関連する問題