1

我是汇编语言的初学者,所以我希望任何给我答案的人都可以解释得更具体。

问题是从 C 语言转换为汇编语言。

C代码是:

while(save[i] == k)
    i += 1;

iand kare in $s3and $s5and and 数组save[]的基数在$s6

答案就在图中。

数字

我的误解是,为什么$S3 multiple 2^2(==4),然后存储到$t1

我在stackoverflow上查看了类似的问题,有人说“你应该把基数和索引加在一起,记住要按4来缩放字长。”

但是因为我是初学者,所以我还是一头雾水。

例如,

  1. 一个周期后,i == 2(in $S3)。

  2. 然后重新开始,i == 2乘以$S34,我们在这里得到 8,然后写入$t1.

那么有一个问题,为什么是8?我认为我们需要的save[2]不是save[8].

我想我可能会对价值和地址感到困惑。

另一个问题是:这些寄存器有多少$S1$t1?我认为是 32 位,所以应该是 1 个字。

4

2 回答 2

4

lw将提供要加载的字的第一个字节的地址。

如果 的每个元素save大小为 32 位或 4 字节,则

  • save[0]save.
  • save[1]save.
  • save[2]save.
  • ...
于 2018-02-26T00:03:08.510 回答
1

中的每个条目save都是 32 位长。这意味着,i 条目的偏移量为 i * 32 位 = i * 4 字节,从基地址 $s6 C 开始实际上非常聪明,并在内部为您计算。所以在 C 代码中,save[i] 和 *(save + i) 是一样的。对指针的加法将乘以它的大小,因此 C 会将其转换为 save + 4 * i

寄存器大小取决于您的本地架构,但一般来说,示例/练习主要是 32 位。

于 2018-02-26T00:09:24.413 回答