【问题标题】:Loading and storing bytes in MIPS在 MIPS 中加载和存储字节
【发布时间】:2015-02-24 22:28:47
【问题描述】:

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

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

【问题讨论】:

  • 答案是红色是正确的,除了 $t0 值 big endian,它应该是 0xFFFFFF90,因为 0x90 将被解释为负字节值,并由 lb 扩展为 32-位寄存器 $t0.

标签: mips


【解决方案1】:
add    $s3, $zero, $zero

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

lb     $t0, 1($s3)

lbyte 从内存中的某个位置加载到寄存器 $t0 中。内存地址由1($s3)给出,即地址$s3+1。这将是内存中的 0+1=1st 字节。由于我们有一个大端架构,我们读取字节的 4 字节块“大端优先”。

byte:  0   1   2   3
      00  90  12  A0

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

sb     $t0, 6($s3)

s将寄存器$t0 中的一个byte 撕成6($s3) 给出的内存地址。这又意味着地址$s3+6

byte:  4   5   6   7
      FF  FF  FF  FF

变成

byte:  4   5   6   7
      FF  FF  90  FF

现在,如果架构是 little-endian 会怎样?这意味着字节在内存中被“小端优先”排列,因此第 2 条和第 3 条指令的效果会发生变化。

lb     $t0, 1($s3)

这会将内存地址 1 中的字节加载到寄存器 $t0 中。但是现在地址是“小端优先”,所以我们改为将12 读入寄存器。

byte:  3   2   1   0
      00  90  12  A0

下一步...

sb     $t0, 6($s3)

这会将寄存器$t0(即12)中的字节存储到内存地址6中。同样使用little-endian架构:

byte:  7   6   5   4
      FF  FF  FF  FF

变成

byte:  7   6   5   4
      FF  12  FF  FF

【讨论】:

  • 您在以下几点上是错误的: 1. 假设内存地址 0x01 处的数据为 0x90,当 lb 符号扩展时,$t0 的值将是 0xFFFFFF12。如果不需要符号扩展,请使用 lbu。 2. lbsb 不关心字节序。内存地址x 上的任何字节在大小端机器上都是相同的。
  • @Cheshar:不,我认为您的 1. 是错误的,即使 lb 进行符号扩展,sb 仍将最低有效字节存储到 0x06。 (你是怎么得到0xFFFFFF12的?不是0xFFFFFF90吗?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多