MIPS汇编中用sll对$s3左移2位实现乘4的作用是什么?
MIPS汇编中
sll指令的作用说明 这里的sll $t1, $s3, 2是数组寻址的标准操作,核心原因和MIPS的寻址规则、数组元素的存储方式有关:
- 首先明确基础约定:MIPS采用字节寻址,即每个内存地址对应1字节的存储空间。本题中的
save是int类型数组,C语言中每个int类型占4字节,因此相邻两个数组元素的内存地址差值为4。 - 数组元素的地址计算公式为:
save[i]的内存地址 = 数组首地址 + i * 单个元素的字节长度。对应题目中的寄存器约定:- 数组首地址存储在
$s6 - 下标i存储在
$s3 - 单元素占4字节,所以需要先计算
i * 4作为地址偏移量
- 数组首地址存储在
- 移位指令的优化作用:二进制数左移n位等价于数值乘以2的n次方,因此左移2位等价于乘以2^2=4,和我们需要的
i*4效果完全一致。且sll作为移位指令,执行速度远快于乘法指令,是编译器实现数组寻址时的常用优化手段。
你提到的“补四个零”是误解:左移2位是在二进制数值末尾补2个零,不是4个,补4个零是左移4位,对应乘以16,会导致寻址错误。
对应汇编代码的逐行逻辑验证:
loop: sll $t1, $s3, 2 # 计算i对应的字节偏移量:$t1 = i * 4 add $t1, $t1, $s6 # 拼接得到save[i]的实际内存地址:首地址+偏移量 lw $t0, 0($t1) # 从目标地址取出save[i]的值存入$t0 bne $t0, $s5, Exit# 比较save[i]和k,不相等就跳出循环 addi $s3, $s3, 1 # 相等则i自增1,进入下一轮循环判断 j loop Exit:
内容的提问来源于stack exchange,提问作者Ahmed Butt
相关产品推荐
相关产品推荐

