web-dev-qa-db-ja.com

ESIおよびEDIレジスタの目的は?

アセンブラーのEDI&ESIレジスターの実際の目的と使用は何ですか?

私はそれらが一つのことのために文字列操作に使用されることを知っています。

誰かが例を挙げることはできますか?

111
Tony The Lion

DI/SI(または1985年にASMを学ばなかった場合は拡張版)で実行できるonly操作がいくつかあります。これらの中には

REP STOSB
REP MOVSB
REP SCASB

それぞれ、繰り返し(=大量)の保存、読み込み、スキャンの操作です。行うことは、一方または両方のオペランドを指すようにSIおよび/またはDIをセットアップし、おそらくCXにカウントを入れてからリッピングさせます。これらは一度に大量のバイトを処理する操作であり、CPUを自動的に配置します。ループを明示的にコーディングしているわけではないため、ループを手動でコーディングするよりも効率的に(通常)処理します。

念のため:操作の設定方法によっては、繰り返しの保存は値0を連続した大きなメモリブロックにパンチするような単純なものになります。 MOVSBは、あるバッファー(まあ、任意のバイト)から別のバッファーにデータをコピーするために使用されると思います。また、SCASBは、検索条件に一致するバイトを検索するために使用されます(平等で検索するだけなのか、それとも何を検索するのかわかりません:))

それが、これらのregの目的のほとんどです。

71
Carl Smotricz

ESIが指すメモリからEDIが指すメモリにデータを効率的にコピーするMOVSBやMOVSWなどのオペコード。副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example、

mov esi, source_address
mov edi, destination_address
mov ecx, byte_count
cld
rep movsb ; fast!
33
catfood

他の回答で言及されている文字列操作(MOVS/INS/STOS/CMPS/SCASB/W/D/Qなど)に加えて、次の場所で暗黙的に使用される「最新の」x86アセンブリ命令もあることを付け加えました。最小EDI/RDI:

SSE2 MASKMOVDQU(および今後リリースされるAVX VMASKMOVDQU)命令は、EDM/RDIが指すメモリにXMMレジスタから選択的にバイトを書き込みます。

12
PhiS

大量の操作に使用されるレジスタに加えて、32ビット呼び出し規約の関数呼び出し(呼び出し保存)によって保持されるというプロパティに役立ちます。 ESI、EDI、EBX、EBP、ESPはコール保存されますが、EAX、ECXおよびEDXはコール保存されません。呼び出し保存レジスタはCライブラリ関数によって尊重され、それらの値はCライブラリ関数呼び出しを通して保持されます。

アセンブリ言語の本のJeff Duntemannには、コマンドライン引数を出力するアセンブリコードの例があります。コードは、esiとediを使用して、Cライブラリ関数printfによって変更されないため、カウンターを格納します。 eax、ecx、edxなどの他のレジスタについては、Cライブラリ関数によって使用されないという保証はありません。

https://www.Amazon.com/Assembly-Language-Step-Step-Programming/dp/0470497025

See section 12.8 Cによるコマンドライン引数の見方。

64ビットの呼び出し規約は32ビットの呼び出し規約とは異なることに注意してください。これらのレジスタが呼び出し保存されるかどうかはわかりません。

5
Jay Rajput