关于从 C 语言转换为汇编语言的字长按 4 缩放的问题

questions about scale by 4 for the word size from C converting to assembly language

我是汇编语言的初学者,所以希望回答我的人能解释得具体一点。

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

C代码为:

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

ik$s3$s5 中,数组 save[] 的基数在 $s6

答案在图中

我理解错误的是为什么$S3 multiple 2^2(==4),然后存入$t1.

我在Whosebug上查了类似的问题,有人说"You should add the base and index together, and remember to scale by 4 for the word size. "

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

例如,

  1. 一个循环后,i == 2(在$S3)。

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

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

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

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

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

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

  • save[0] 被发现超出 save.
  • 开头的 0 个字节
  • save[1] 被发现超出 save.
  • 开头的 4 个字节
  • save[2] 被发现超出 save.
  • 开头的 8 个字节
  • ...

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

寄存器大小取决于您当地的体系结构,但一般来说 examples/exercises 大多是 32 位。