繁体   English   中英

sll 的目的是什么,并在翻译后的 MIPS 代码中添加?

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

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

C 交换代码 function 如下:

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。 交换 function 采用 arguments k = 3 并假设 v 的基地址为 2000。

简化的 MIPS 版本如下:

swap:

    sll $2, $5, 2
    add $2, $4, $2
    lw  $15, 0($2)
    lw  $16, 4($2)
    sw  $16, 0($2)
    sw  $15, 4($2)

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

这来自字节可寻址,就像大多数现代机器一样。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM