MIPS汇编中sll的作用、sll与srl的用法及代码应用疑问
B[8] = A[i − j]转MIPS汇编的疑问解答 先看对应的MIPS汇编代码:
sub $t0, $s3, $s4 sll $t0, $t0, 2 add $t1, $s6, $t0 lw $t2, 0($t1) sw $t2, 32($s7)
1. 为什么代码里需要用sll指令?
在MIPS架构中,int类型数据占4个字节,数组在内存中是连续存储的,每个元素之间间隔4字节。C语句里的A[i-j]用的是元素索引,但内存寻址需要的是字节偏移量——也就是从数组基地址到目标元素的字节数。
这里sub $t0, $s3, $s4算出的是元素索引i-j,要把它转换成字节偏移就得乘以4。而左移2位(sll $t0, $t0, 2)等价于乘以2²=4,移位操作比乘法指令执行速度更快,所以MIPS汇编里常用左移2位来实现int数组的索引到字节偏移的转换。
2. sll和srl指令的具体用法
sll(Shift Left Logical,逻辑左移)
格式:sll $dst, $src, shamt
功能:把$src寄存器内的二进制内容左移shamt位,右侧空出的位补0。操作后的值相当于原数乘以2^shamt,适合无符号数或正数的快速乘法,也常用在数组偏移计算中(比如前面的乘4操作)。
示例:若$src中是0x00000003(十进制3),左移2位后,$dst中就是0x0000000C(十进制12),正好是3×4的结果。srl(Shift Right Logical,逻辑右移)
格式:srl $dst, $src, shamt
功能:把$src寄存器内的二进制内容右移shamt位,左侧空出的位补0。操作后的值相当于无符号数除以2^shamt,该指令不处理符号位,只做纯逻辑移位,适合无符号数的快速除法。
示例:若$src中是0x0000000C(十进制12),右移2位后,$dst中就是0x00000003(十进制3),正好是12÷4的结果。
内容的提问来源于stack exchange,提问作者chris

