在MIPS中加载和存储字节

在MIPS中加载和存储字节,mips,Mips,我正在准备明天的考试,我不再对加载/存储字节的话题感到困惑。我举了一个例子: 我完全不明白他是怎么得到红色答案的。有人能帮我解释一下吗 add $s3, $zero, $zero 这将执行加法运算,$s3=0+0,有效地将寄存器$s3的值设置为零 lb $t0, 1($s3) 这l将b字节从内存中的某个位置加载到寄存器$t0。内存地址由1($s3)给出,这意味着地址$s3+1。这将是内存中的0+1=1字节。因为我们有一个big-endian架构,所以我们读取字节,即4字节块“

我正在准备明天的考试,我不再对加载/存储字节的话题感到困惑。我举了一个例子:

我完全不明白他是怎么得到红色答案的。有人能帮我解释一下吗

add    $s3, $zero, $zero
这将执行加法运算,
$s3=0+0
,有效地将寄存器
$s3
的值设置为零

lb     $t0, 1($s3)
lb字节从内存中的某个位置加载到寄存器
$t0
。内存地址由
1($s3)
给出,这意味着地址
$s3+1
。这将是内存中的0+1=1字节。因为我们有一个big-endian架构,所以我们读取字节,即4字节块“big-endfirst”

第0个字节是
00
,第1个字节是
90
。因此,我们将字节
90
加载到
$t0

sb     $t0, 6($s3)
sb字节从寄存器
$t0
存储到
6($s3)
给出的内存地址中。这同样意味着地址
$s3+6

byte:  4   5   6   7
      FF  FF  FF  FF
变成

byte:  4   5   6   7
      FF  FF  90  FF
byte:  7   6   5   4
      FF  12  FF  FF

现在,如果建筑是小endian呢?这意味着字节在内存中排列为“小端优先”,因此第二条和第三条指令的效果会发生变化

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:  4   5   6   7
      FF  FF  90  FF
byte:  7   6   5   4
      FF  12  FF  FF

你在以下几点上错了:1。假设内存地址0x01处的数据是0x90,$t0的值将是0xFFFF12,因为
lb
符号扩展。如果不需要符号扩展,请使用
lbu
。2.
lb
sb
不关心结尾。无论是在内存地址
x
上的哪个字节,无论大小端机都会以相同的方式看到。@Cheshar:不,我认为你的1。错误,即使
lb
do sign extend,
sb
仍将最低有效字节存储到
0x06
中。(你是怎么得到的?
0xFFFFFF12
?它不是
0xffff90