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