0

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

这是我在网上找到的计算二维数组的内存地址: int base[x][y] address = base[index1][index2] Memory Address = (base address) + (index1 * x * sizeOf(int)) +(index2 * sizeOf(int))

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

任何人都可以告诉我一个例子,它是什么样的?还是有任何替代方法来计算内存地址?但请给我看一个如何计算它的例子。

谢谢。

4

1 回答 1

1

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

让我们首先对价值定位做一些假设。由于您的语言是汇编语言,因此对存储数组的方式没有任何限制。您可以按行或按列存储它们,它们可以是基于 0 或基于 1 或基于 17。它们甚至可能是锯齿状的(内部指针数组)。但我们将假设最自然的情况 - 二维数组按行存储,从 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 的。

于 2013-11-05T15:31:04.817 回答