アセンブラでのEDIおよびESIレジスタの実際の目的と使用法は何ですか?
私はそれらが文字列操作に使用されていることを知っています。
誰かも例を挙げられますか?
アセンブラでのEDIおよびESIレジスタの実際の目的と使用法は何ですか?
私はそれらが文字列操作に使用されていることを知っています。
誰かも例を挙げられますか?
回答:
DI / SIでしか実行できない操作がいくつかあります(1985年にASMを習得していなかった場合は、対応する拡張機能)。これらの中には
REP STOSB
REP MOVSB
REP SCASB
それぞれ、繰り返し(=大量に)保存、読み込み、スキャンする操作です。あなたがすることは、あなたが一方または両方のオペランドを指すようにSIおよび/またはDIを設定し、おそらくCXにカウントを入れてから、リッピングさせます。これらは一度に大量のバイトを処理する操作であり、一種のCPUを自動化します。ループを明示的にコーディングしていないため、手作業でコーディングしたループよりも(通常は)ループの方が効率的です。
念のために:オペレーションの設定方法によっては、値0を連続した大きなメモリブロックにパンチするなど、繰り返し格納するのが簡単な場合があります。MOVSBは、あるバッファー(バイトの束)から別のバッファーにデータをコピーするために使用されていると思います。そしてSCASBは、ある検索基準に一致するバイトを探すために使用されます(それが等しいか、何を検索しているだけなのかわかりません。検索できます:))
これが、これらのregの目的のほとんどです。
SI=ソースインデックス
DI=デスティネーションインデックス
他の人が示したように、文字列命令には特別な使用法があります。リアルモードのプログラミングについては、ESセグメントレジスタを一緒に使用しなければならないDIとDSしてSIのように
movsb es:di, ds:si
SIおよびDIは、汎用インデックスレジスタとしても使用できます。たとえば、Cソースコード
srcp [srcidx++] = argv [j];
コンパイルする
8B550C mov edx,[ebp+0C]
8B0C9A mov ecx,[edx+4*ebx]
894CBDAC mov [ebp+4*edi-54],ecx
47 inc edi
whereにebp+12はargv、ebxis 、 is j、およびedihas が含まれますsrcidx。3番目の命令はedi4で乗算さebpれ、0x54(の位置srcp)でオフセットが追加されることに注意してください。アドレスを囲む角括弧は間接参照を示します。
AX=アキュムレータ
DX=ダブルワードアキュムレータ
CX=カウンタ
BX=ベースレジスタ
それらは汎用レジスターのように見えますが、(予期せずに)それらの1つを使用する命令がいくつかありますが、暗黙のうちにどれを使用するかはわかりません。
一括操作に使用されるレジスタに加えて、32ビットの呼び出し規約で関数呼び出し(call-preserved)を通じて保持されるという特性に役立ちます。ESI、EDI、EBX、EBP、ESPはコール保持されますが、EAX、ECX、およびEDXはコール保持されません。呼び出し保存レジスタはCライブラリ関数によって尊重され、それらの値はCライブラリ関数呼び出しを通じて保持されます。
Jeff Duntemannは、アセンブリ言語の本で、コマンドライン引数を出力するためのサンプルアセンブリコードを持っています。これらのコードは、Cライブラリ関数printfによって変更されないため、esiおよびediを使用してカウンターを格納します。eax、ecx、edxなどの他のレジスタについては、Cライブラリ関数で使用されないという保証はありません。
https://www.amazon.com/Assembly-Language-Step-Step-Programming/dp/0470497025
See section 12.8 Cがコマンドライン引数をどう見るか。
64ビットの呼び出し規約は32ビットの呼び出し規約とは異なり、これらのレジスタが呼び出し保存されているかどうかはわかりません。