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的数组
您应该能够在汇编语言中找到如何做到这一点。您没有提到具体针对哪个处理器,但在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
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
esi
,其中每个结构