アセンブリ言語を勉強しようとしています。アドレッシングモードを使用して次の各配列タイプの要素にアクセスする方法について、誰かが説明および/または例を挙げてもらえますか?
の配列
DWORD構造体の配列。各構造体には 2 つ
DWORDのが含まれます配列の配列。各配列には 10 個
DWORDの sがあります
アセンブリ言語を勉強しようとしています。アドレッシングモードを使用して次の各配列タイプの要素にアクセスする方法について、誰かが説明および/または例を挙げてもらえますか?
の配列DWORD
構造体の配列。各構造体には 2 つDWORDのが含まれます
配列の配列。各配列には 10 個DWORDの sがあります
論理は簡単です。
1次元配列のi番目の要素のアドレスは、配列(または0番目の要素)のアドレスにi *要素のサイズを加えたものです。
2次元配列がある場合は、それを1次元配列の1次元配列として扱い、今説明したすでにおなじみのケースに減らすことができます。 2次元配列は、2次元配列のアドレスにi *サブ配列サイズを加えたものです。そのi番目のサブ配列内で、j番目の要素アドレスを計算する方法をすでに知っています。
したがって、2次元配列の(i、j)番目の要素のアドレスは、配列のアドレスにi *サブ配列サイズ+ j *要素サイズを加えたもの、または同等に、配列のアドレスに(i *数値を加えたもの)になります。行内の要素の数+ j)*要素のサイズ。
アセンブリ言語でこれを行う方法を理解できるはずです。
具体的にターゲットにしているプロセッサについては言及していませんが、386+ではこれが機能します。私は MASM を持っていませんが、MASM は Intel 構文を使用しています。
ebxが要素のベース レジスタでesiあり、インデックス レジスタであると仮定しましょう。ここで使用するアドレッシング モードでは、標準の 32 ビット レジスタ ( eax、ebx、ecx、edx、ebp、) が有効です。ベース レジスタとして使用できますが、インデックス レジスタとしては使用できません。インデックス レジスタの値は、オプションで 2、4、または 8 にスケーリングできます。この例では、dword 配列にスケーリング係数 4 を使用できます (386 では、有効なスケーリング係数は 1、2、4、および 8 です)。esiediesp
配列の値を に読み込む: の値を配列に
格納するeax:mov eax, [ebx+4*esi]eaxmov [ebx+4*esi], eax
ebxベースアドレスとしてじっとしていましょう。esi各構造体が 2 つの dword で構成される構造体配列には、倍率 8 を使用できます。
最初の dword の値を に読み込みます: の値を最初の dwordeaxにmov eax, [ebx+8*esi]
保存しますeax:mov [ebx+8*esi], eax
2 番目の dword の値を に読み込みます: の値を 2 番目の dwordeaxにmov eax, [ebx+8*esi+4]
保存しますeax:mov [ebx+8*esi+4], eax
インデックスをハードコーディングできない場合は、4 を追加するだけですebx(または、ベース アドレスを格納するために使用する任意のレジスタ)。また、ベースアドレスをハードコーディングしている場合は、たとえば次のように使用できます。esi構造体に対処するなど。ebx必要なdwordに対処します。386+ では、間接アドレッシングで複数のレジスタ (インデックス レジスタ) をスケーリングできないことに注意してください。
ebx配列のベースアドレスを事前に知らないと仮定しましょう.esi構造体edxのインデックスと dword のインデックスがあります.
lea構造体のアドレスを取得するには、乗算の最適化 (10 = 8 + 2)を使用できます。
編集:修正:lea esi,[4*esi](dwordは4バイトです)
lea edi,[ebx+8*esi]
lea edi,[edi+2*esi]
これで、構造体のアドレスがedi. dword のインデックス (この例では に格納されています) を 4 倍して追加するだけですedx(各 dword は 4 バイトであるため)。
dword の値をeax:に読み取りますmov eax,[edi+4*edx]。
eaxの値を dwordに保存するには: mov [edi+4*edx],eax.