アセンブリ言語を勉強しようとしています。アドレッシングモードを使用して次の各配列タイプの要素にアクセスする方法について、誰かが説明および/または例を挙げてもらえますか?
の配列
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 です)。esi
edi
esp
配列の値を に読み込む: の値を配列に
格納するeax
:mov eax, [ebx+4*esi]
eax
mov [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
.