1

我正在努力学习汇编语言。有人可以解释和/或举例说明如何使用寻址模式来访问以下每种数组类型中的元素吗?

  1. 数组DWORD

  2. 结构数组,其中每个结构包含两个DWORDs

  3. 数组数组,其中每个数组有 10DWORD

4

2 回答 2

3

逻辑是微不足道的。

一维数组的第i个元素的地址就是数组(或第 0 个元素)的地址加上i * element size

如果你有一个二维数组,你可以把它当作一维数组的一维数组,并将它简化为我刚刚描述的已经很熟悉的情况: a 的第i个 1-dim 子数组的地址2-dim 数组只是 2-dim 数组的地址加上i * subarray size。在第i个子数组中,我们已经知道如何计算第j个元素地址。

所以,二维数组的第(i,j)个元素的地址就是数组的地址加上i *子数组大小+ j *元素大小OR,等效地,数组的地址加上 ( i * number行中的元素数+ j ) *元素大小

您应该能够弄清楚如何用汇编语言做到这一点。

于 2012-08-12T06:50:44.623 回答
3

您没有提及您具体针对的是哪个处理器,但在 386+ 中这将起作用。我没有 MASM,但 MASM 使用 Intel 语法。

  1. 让我们假设它ebx是基址寄存器并且esi是元素的索引寄存器。标准 32 位寄存器 ( eax, ebx, ecx, edx, ebp, esi, edi) 对此处使用的寻址模式有效。esp可以用作基址寄存器,但不能用作索引寄存器。索引寄存器的值可以选择用 2、4 或 8 进行缩放。在此示例中,我们可以为 dword 数组使用缩放因子 4(在 386 个合法缩放因子中为 1、2、4 和 8)。

    将数组中的值读入eaxmov eax, [ebx+4*esi] 将值存储eax到数组中:mov [ebx+4*esi], eax

  2. 让我们保持静止ebx作为基地址。我们可以对结构数组使用比例因子 8 esi,其中每个结构由 2 个双字组成。

    将第一个 dword 的值读入eaxmov eax, [ebx+8*esi] 将 的值存储eax到第一个 dword 中:mov [ebx+8*esi], eax

    将第二个 dword 的值读入eaxmov eax, [ebx+8*esi+4] 将 的值存储eax到第二个 dword 中:mov [ebx+8*esi+4], eax

    如果无法对索引进行硬编码,则只需将 4 添加到ebx(或用于存储基地址的任何寄存器)。如果你有硬编码的基地址,那么你可以使用例如。esi解决结构和例如。ebx解决你想要的双字。请注意,在 386+ 中,您不能在间接寻址中扩展多个寄存器(索引寄存器)。

  3. 让我们仍然假设您事先不知道数组的基地址,并且您将拥有它ebxesi因为您拥有结构的索引,并且edx拥有双字的索引。

    要获取结构的地址,您可以使用lea乘法优化 (10 = 8 + 2):

    编辑:修复:lea esi,[4*esi](dword 为 4 个字节)

    lea edi,[ebx+8*esi]

    lea edi,[edi+2*esi]

    现在你有了结构体的地址edi。您只需将 dword 的索引(edx在本例中存储)乘以 4(因为每个 dword 为 4 个字节)。

    将 dword 的值读取到eax: mov eax,[edi+4*edx]

    将 的值存储eax到 dword 中:mov [edi+4*edx],eax.

于 2012-08-12T08:11:14.920 回答