【问题标题】:2d array computing of memory address(MIPS assembly code)内存地址的二维数组计算(MIPS汇编代码)
【发布时间】:2013-11-05 12:41:19
【问题描述】:

我无法理解如何计算二维数组的内存地址。 (对于 MIPS 汇编代码)

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

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

谁能给我举个例子来说明它是怎样的?还是有任何替代方法来计算内存地址?但请给我看一个如何计算它的例子。

谢谢。

【问题讨论】:

  • 我想这取决于编程语言。
  • 对于 MIPS 汇编代码?这有帮助吗?

标签: arrays assembly mips


【解决方案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 的。

【讨论】:

  • 如果是这样,是不是意味着[3][0]会是320,[3][1]会是324,[3][2] - 328,[3][ 3] 332, [3][4] 336, [3][5] 340, [4][0] 344 [4][1] 348?但是那个[4][3]已经是348了??我很困惑。以及如何确定 sizeOf(row) 或 sizeof(int)?我不明白你实际上是如何得出答案的。
  • 没有[3][5](不合法)。索引从 0 到 4,因此每行/列有 5 个元素。 [3][5] 与 [4][0] 是相同的元素。
  • 即便如此,[4][2] 还是 348?
  • [4][2] 将是 344. 256 + 20*4 + 4*2。
猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多