翻译后的 MIPS 代码中 sll 和 add 的目的是什么?

What is the purpose of sll and add in the translated MIPS code?

我正在阅读一些关于将 C 语句转换为 MIPS 的 MIPS 注释。

交换函数的C代码如下:

swap ( int v[], int k) {
    int temp;
    temp = v[k];
    v[k] = v[k + 1];
    v[k + 1] = temp;
}

有人告诉我 k 映射到 $5,v[ ] 的基地址映射到 $4,temp 映射到 $15。 交换函数接受参数 k = 3 并假设 v 的基地址为 2000.

下面是简化的 MIPS 版本:

swap:

    sll , , 2
    add , , 
    lw  , 0()
    lw  , 4()
    sw  , 0()
    sw  , 4()

这里的困惑是为什么在翻译的MIPS中有slladd

这来自 byte addressable,就像大多数现代机器一样。

字节寻址意味着处理器可以访问内存的每个单独字节——在这样的系统中,将有效字节地址值递增 1 意味着引用内存的下一个顺序字节。

int 数据类型使用的字为 32 位宽,因此需要 4 个字节的内存。因此,a[0]占用addr+0addr+1addr+2addr+3字节,其中addra的字节地址. a[1]a[0] 偏移 4 个字节,在 addr+4!

C 知道“int 的数组”的元素每个需要 4 个字节,因此需要 4 个字节分隔,因此它知道 a+i 在幕后意味着 a + i * 4,这将为数组的每个元素引用 4 个连续地址,从 i*4 开始,为所有较低的元素留出空间。

计算 i * 4 有时称为“缩放”。而在 C 中我们可以直接引用索引位置 a[i],在汇编中我们必须显式缩放索引。

sll 是乘以 4 的有效方法 — sll 中的常量 2 表示向左移动 2 位(又名:* 1002, 即 * 二进制 100).

add 将数组基数与缩放索引相加,得出数组引用所需字的实际地址。

我们还可以看到使用常量 0 或 4 生成的代码。因为这些常量也是按比例缩放的,所以 4 指的是数组中超出计算值的下一个元素。也就是说,如果 0() 指的是 a[k],那么 4() 指的是 a[k+1]