[英]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 中有sll和add ?
这来自字节可寻址,就像大多数现代机器一样。
字节寻址意味着处理器可以访问 memory 的每个单独字节——在这样的系统中,将有效字节地址值递增 1 意味着引用 memory 的下一个连续字节。
int
数据类型使用的字是 32 位宽,因此需要 4 个字节的 memory。 因此, a[0]
占用字节addr+0
、 addr+1
、 addr+2
和addr+3
,其中addr
是a
的字节地址。 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.