MIPS汇编lb指令执行结果及偏移量差异咨询
MIPS指令执行结果分析
前提说明
MIPS架构默认采用大端字节序(高字节存储在低内存地址),内存位置src存储的字为0x12348765,其在内存中的字节分布如下:
| 内存地址 | 存储字节 |
|---|---|
src | 0x12 |
src+1 | 0x34 |
src+2 | 0x87 |
src+3 | 0x65 |
寄存器$t1初始值为0x87654321。
指令执行过程与最终结果
la $s0, src:将src的内存地址加载到寄存器$s0,此时$s0指向src的起始地址。lb $t1, 1($s0):- 计算有效地址:
$s0的值 + 1,即src+1的内存地址。 - 从该地址读取1个字节的数据:
0x34。 - 执行符号扩展:由于
0x34的二进制最高位为0(表示正数),扩展为32位后结果为0x00000034。 - 将扩展后的值写入
$t1,覆盖初始值,因此$t1的最终值为0x00000034。
- 计算有效地址:
使用0($s0)的差异
若替换为lb $t1, 0($s0):
- 有效地址为
src的起始地址,读取的字节是0x12。 - 符号扩展后得到
0x00000012,最终$t1的值为这个结果。
关于字节选取的疑问
你纠结的0x65和0x87对应的是src+3和src+2地址的字节:
0x65在src+3位置,只有当偏移为3时才会被读取;0x87在src+2位置,偏移为2时会被读取。
偏移1对应的是src+1处的0x34,所以不会取到这两个字节。
内容的提问来源于stack exchange,提问作者worldlife
相关产品推荐
相关产品推荐

