内存地址的2d阵列计算(MIPS汇编代码)

时间:2013-11-05 12:41:20

标签: arrays assembly mips

我在理解如何计算二维数组的内存地址时遇到了问题。 (对于MIPS汇编代码)

这是我在网上找到的计算2d数组内存地址的方法: int base [x] [y] address = base [index1] [index2] 内存地址=(基地址)+(index1 * x * sizeOf(int))+(index2 * sizeOf(int))

假设我有一个int数组[5] [5],基地址为0x100。 我想找到[4] [3]和[2] [5]的内存地址。

任何人都可以告诉我一个例子是什么样的?或者有没有其他方法来计算内存地址?但请告诉我一个如何计算的例子。

感谢。

1 个答案:

答案 0 :(得分:1)

  

假设我有一个int数组[5] [5],基地址为0x100。我想找到[4] [3]和[2] [5]的内存地址。

让我们首先对价值贴值做出一些假设。由于您的语言是汇编语言,因此存储阵列的方式没有限制。您可以按行或按列存储它们,它们可以是基于0或基于1或基于17。它们甚至可能是锯齿状的(内部指针数组)。但我们假设最自然的情况 - 2D数组按行存储,基于0。这是C约定,也是最容易在汇编中实现的。

也就是说,你的行的大小是5 * sizeof(int)= 20个字节。因此,元素[4] [3]的偏移量将是base + sizeof(row)* 4 + sizeof(int)* 3 = 0x100 + 20 * 4 + 4 * 3 = 256 + 80 + 12 = 348。

类似地,[2] [5]的偏移量将是0x100 + 20 * 2 + 4 * 5 = 316,除了[2] [5]是用词不当 - 在基于零的数组5中最顶层合法指数为4. [2] [5]与[3] [0]相同。

编辑:sizeof(int)在大多数现代系统上是4个字节。 MIPS有一个64位模式,但它很奇特;你会提到你是否会将其作为目标。

sizeof(row):数组包含5个元素的行,每个元素都是一个int。问题的措辞强烈暗示数组是int的数组。