Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays x86-访问阵列中元素的寻址模式_Arrays_Assembly_X86_Addressing Mode - Fatal编程技术网

Arrays x86-访问阵列中元素的寻址模式

Arrays x86-访问阵列中元素的寻址模式,arrays,assembly,x86,addressing-mode,Arrays,Assembly,X86,Addressing Mode,我正在努力学习汇编语言。有人能解释和/或举例说明如何使用寻址模式访问以下每种数组类型中的元素吗 DWORD的数组 结构数组,其中每个结构包含两个DWORD 数组数组,其中每个数组有10个DWORD 逻辑是琐碎的 一维数组的第i个元素的地址就是数组(或第0个元素)的地址加上i*元素大小 如果你有一个二维数组,你可以把它当作一个一维数组的一维数组,并把它简化成我刚才描述的已经很熟悉的情况:二维数组的第I个1维子数组的地址就是2维数组的地址加上I*子数组的大小。在第i子数组中,我们已经知道如何计算第j

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

  • DWORD的数组

  • 结构数组,其中每个结构包含两个DWORD

  • 数组数组,其中每个数组有10个DWORD

  • 逻辑是琐碎的

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

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

    因此,二维数组的第(i,j)-th个元素的地址就是数组的地址加上i*子数组大小+j*元素大小,或者等效地,数组的地址加上(i*行中元素的数量+j)*元素大小

    您应该能够找出如何用汇编语言实现这一点。

    逻辑很简单

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

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

    因此,二维数组的第(i,j)-th个元素的地址就是数组的地址加上i*子数组大小+j*元素大小,或者等效地,数组的地址加上(i*行中元素的数量+j)*元素大小


    您应该能够在汇编语言中找到如何做到这一点。

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

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

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

  • 让我们将ebx作为基址。对于每个结构由2个DWORD组成的结构数组,我们可以对esi使用比例因子8

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

    要将第二个dword的值读入
    eax
    mov-eax,[ebx+8*esi+4]
    要将
    eax
    的值存储到第二个dword中:
    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字节)

    leaedi[ebx+8*esi]

    leaedi[edi+2*esi]

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

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

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


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

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

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

  • 让我们将ebx作为基址。对于结构数组,我们可以使用比例因子8表示
    esi
    ,其中每个结构