我正在努力学习汇编语言。有人可以解释和/或举例说明如何使用寻址模式来访问以下每种数组类型中的元素吗?
数组
DWORD结构数组,其中每个结构包含两个
DWORDs数组数组,其中每个数组有 10
DWORD秒
我正在努力学习汇编语言。有人可以解释和/或举例说明如何使用寻址模式来访问以下每种数组类型中的元素吗?
数组DWORD
结构数组,其中每个结构包含两个DWORDs
数组数组,其中每个数组有 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.