You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MIPS汇编中sll的作用、sll与srl的用法及代码应用疑问

关于C语句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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:36:11