在MIPS中加载和存储字节

jub*_*ean 3 mips

我明天正在读考试,我对加载/存储字节主题感到困惑.我有这个例子:

我不明白他是如何得到红色的答案的.有人可以帮我解释一下吗?

eig*_*ris 16

add    $s3, $zero, $zero
Run Code Online (Sandbox Code Playgroud)

这执行添加$s3 = 0 + 0,有效地将寄存器设置$s3为零值.

lb     $t0, 1($s3)
Run Code Online (Sandbox Code Playgroud)

这个的OAD一个b从在存储器中的位置到寄存器YTE $t0.存储器地址由1($s3),即地址给出$s3+1.这将是内存中的0 + 1 =第一个字节.由于我们有一个大端架构,我们读取4字节块"大头优先"的字节.

byte:  0   1   2   3
      00  90  12  A0
Run Code Online (Sandbox Code Playgroud)

第0个字节是00,第1个字节是90.所以我们将字节加载90$t0.

sb     $t0, 6($s3)
Run Code Online (Sandbox Code Playgroud)

š tores一个b从寄存器YTE $t0到由给定的存储器地址6($s3).这意味着地址$s3+6.

byte:  4   5   6   7
      FF  FF  FF  FF
Run Code Online (Sandbox Code Playgroud)

byte:  4   5   6   7
      FF  FF  90  FF
Run Code Online (Sandbox Code Playgroud)

现在,如果架构是little-endian怎么办?这意味着字节在内存中排列为"小端优先",因此第2和第3指令的效果会发生变化.

lb     $t0, 1($s3)
Run Code Online (Sandbox Code Playgroud)

这会将存储器地址1中的字节装入寄存器$t0.但现在地址是"小结束",所以我们读12入寄存器.

byte:  3   2   1   0
      00  90  12  A0
Run Code Online (Sandbox Code Playgroud)

下一个...

sb     $t0, 6($s3)
Run Code Online (Sandbox Code Playgroud)

这将字节存储在寄存器中$t0,该字节存储在12存储器地址6中.再次使用little-endian架构:

byte:  7   6   5   4
      FF  FF  FF  FF
Run Code Online (Sandbox Code Playgroud)

byte:  7   6   5   4
      FF  12  FF  FF
Run Code Online (Sandbox Code Playgroud)

  • 这里有几点是错误的: 1. 假设内存地址 0x01 处的数据是 0x90,则随着“lb”符号扩展,$t0 的值将是 0xFFFFFF12。如果不需要符号扩展,请使用“lbu”。2. `lb` 和 `sb` 不关心字节顺序。无论内存地址“x”处是什么字节,大端机和小端机都会以相同的方式看待。 (2认同)