关于从 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;
i
和 k
在 $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. "
但是因为我是初学者,还是一头雾水。
例如,
一个循环后,i == 2
(在$S3
)。
然后重新开始,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 位。
我是汇编语言的初学者,所以希望回答我的人能解释得具体一点。
问题是从 C 语言转换为汇编语言。
C代码为:
while(save[i] == k)
i += 1;
i
和 k
在 $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. "
但是因为我是初学者,还是一头雾水。
例如,
一个循环后,
i == 2
(在$S3
)。然后重新开始,
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 位。