MIPS指令lw与sw的含义、offset_value及处理器执行细节问询
MIPS
lw 和 sw 指令详解 核心概念:offset_value 是什么?
offset_value 是指令内嵌的16位有符号立即数,取值范围为 -32768 到 32767。它必须和基址寄存器(此处为 $t2)中的数值相加,计算出实际要访问的内存有效地址——这种「基址+偏移量」的寻址方式,是MIPS中访问数组元素、结构体成员的常用手段。
1. lw $t1, offset_value($t2):加载字到寄存器
这条指令的作用是从内存读取一个32位字,存入目标寄存器$t1,执行流程分3步:
- 计算有效内存地址:
有效地址 = $t2 存储的数值 + offset_value - 从上述有效地址对应的内存位置,读取一个完整的32位字(MIPS为32位架构,一个字占4个连续字节,标准要求地址必须是4的倍数,否则会触发对齐异常)
- 将读取到的32位数值写入寄存器
$t1,覆盖其原有内容
举个实际场景:如果$t2存的是数组首地址0x10000000,offset_value设为8,那么有效地址就是0x10000008,对应数组的第3个元素(每个元素占4字节,8/4=2,下标从0开始),执行lw后该元素的值就会被放到$t1中。
2. sw $t1, offset_value($t2):存储寄存器内容到内存
这条指令的作用是把寄存器$t1中的32位字,写入指定内存位置,执行流程分3步:
- 和
lw一样计算有效地址:有效地址 = $t2 存储的数值 + offset_value - 取出寄存器
$t1中存储的32位数值 - 将该数值写入上述有效地址对应的内存位置(同样要求地址4字节对齐)
沿用之前的例子:$t2为0x10000000,offset_value为8,$t1的值是0x12345678,执行sw后,内存地址0x10000008到0x1000000B的4个字节会被写入对应数值(MIPS默认大端模式,高字节存低地址)。
补充细节
- 基址寄存器
$t2通常用来存储数组首地址、结构体起始地址这类固定基准,offset_value用来定位具体元素或成员,无需频繁修改基址,仅调整偏移量就能访问不同位置 - 由于
offset_value是16位有符号数,可访问基址前后32KB范围内的内存(32767字节≈32KB)
内容的提问来源于stack exchange,提问作者shree
相关产品推荐
相关产品推荐

