【发布时间】:2015-02-24 22:28:47
【问题描述】:
我正在准备明天的考试,我对加载/存储字节主题感到困惑。我有这个例子:
我完全不明白他是如何得到红色答案的。有人可以帮我解释一下吗?
【问题讨论】:
-
答案是红色是正确的,除了 $t0 值 big endian,它应该是 0xFFFFFF90,因为 0x90 将被解释为负字节值,并由
lb扩展为 32-位寄存器 $t0.
标签: mips
我正在准备明天的考试,我对加载/存储字节主题感到困惑。我有这个例子:
我完全不明白他是如何得到红色答案的。有人可以帮我解释一下吗?
【问题讨论】:
lb 扩展为 32-位寄存器 $t0.
标签: mips
add $s3, $zero, $zero
这将执行加法$s3 = 0 + 0,有效地将寄存器$s3 设置为零值。
lb $t0, 1($s3)
这l将 byte 从内存中的某个位置加载到寄存器 $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
【讨论】:
lb 符号扩展时,$t0 的值将是 0xFFFFFF12。如果不需要符号扩展,请使用 lbu。 2. lb 和 sb 不关心字节序。内存地址x 上的任何字节在大小端机器上都是相同的。
lb 进行符号扩展,sb 仍将最低有效字节存储到 0x06。 (你是怎么得到0xFFFFFF12的?不是0xFFFFFF90吗?)