我正在努力学习汇编语言。有人可以解释和/或举例说明如何使用寻址模式来访问以下每种数组类型中的元素吗?
数组
DWORD
结构数组,其中每个结构包含两个
DWORD
s数组数组,其中每个数组有 10
DWORD
秒
我正在努力学习汇编语言。有人可以解释和/或举例说明如何使用寻址模式来访问以下每种数组类型中的元素吗?
数组DWORD
结构数组,其中每个结构包含两个DWORD
s
数组数组,其中每个数组有 10DWORD
秒
逻辑是微不足道的。
一维数组的第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 ) *元素大小。
您应该能够弄清楚如何用汇编语言做到这一点。
您没有提及您具体针对的是哪个处理器,但在 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
,其中每个结构由 2 个双字组成。
将第一个 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
解决你想要的双字。请注意,在 386+ 中,您不能在间接寻址中扩展多个寄存器(索引寄存器)。
让我们仍然假设您事先不知道数组的基地址,并且您将拥有它ebx
,esi
因为您拥有结构的索引,并且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
.