我在复习准备考试,但有一点我不明白
如果我们有这样的代码:
if (B[2] >= 0)
X = A[B[2]] * 2;如何获取b2和a[b2] *2
此时,A和B是一个数组
发布于 2021-10-17 16:32:35
开始地址(
A[0])是相同的地址时,我们通过单个地址来引用整个阵列:其最小元素的地址。该地址通常也被称为阵列的基地址。(在32位机器的情况下,地址只是32位的数字,它可以保存在单个MIPS寄存器中。)baseAddress + index * sizeof(element). 乘法是由于必要的缩放,并将index转换为字节偏移量。然后,加法计算数组中第index个元素的字节地址。给定计算出的地址,我们可以使用加载(或存储)指令,然后该指令将完成索引操作,例如... = ... C[i] ...; (或C[i] = ...;).
index是一个常数,如2,我们可以在头脑中执行上述通式中的乘法,例如,如果元素大小是4字节整数,则为2*4=8,因此我们知道A[2]位于A+8.如果执行A[i],则位移没有任何帮助(对某些优化进行取模,例如循环展开),因此使用零(加法恒等式)作为位移,但是在执行A[2]时,可以使用位移跳过原本是公式baseAddress + index * sizeof(element). 一部分的add指令(该公式在任何一种情况下都同样适用:我们可以在乘法和加法运行时使用与A[i]相同的方法进行A[2],但在寻址模式下,可以使用常量index * sizeof(element)的位移。)。
为了计算A[B[2]],我们将表达式分解为可单独消化的较小部分:
temp = B[2];
valueOfInterest = A[temp];上面的每一行都应该是可访问的。. 它只是两个数组引用(一个是通过常量/已知索引,一个是通过变量/未知索引). 这两个都是读,所以每个数组引用应该有一个lw。
如果我们在赋值的右侧找到一个数组引用=,那么它需要一个存储来写入内存,而不是一个加载来读取内存。
如果我们有一个赋值运算符A[i] += ...; (或递增/递减运算符:A[i]++),这意味着我们必须同时加载到读内存和存储到写内存,并将读和写都写入相同的地址。
https://stackoverflow.com/questions/69605800
复制相似问题