LW 和 LB 结果相同

LW and LB the same result

我只想有一个数组来计算所有数字的总和。我不确定如何将每个位置存储到一个变量中,所以我尝试了 lb $t5, ($s1) 并且它起作用了,但是当我将它更改为 lw $t5, ($s1) 时它又起作用了。我知道这是不对的,lw 命令加载 4 个字节,lb 命令加载 1 个字节。我相信正确的解决方案是 lw 因为我将指针增加了 4 倍。 lb 灵魂不工作。命令是评论开始的时候。

.data

arr: .word 1, 15, 0, -3, 99, 48, -17, -9, 20, 15

.text
main:

addi $s0, 10 #size=10
addi $t0, 0 #sum =0
addi $t4, 0

la $s1, arr

Loop:
slt $t3, $t4, $s0
beq $t3, $zero, End



lb $t5, ($s1) ##########   HERE  ##############
li $v0, 1 
move $a0, $t5


add $t0, $t0, $t5

add $t4, $t4, 1 
addi $s1, $s1, 4
j Loop


End:

li $v0, 1 
add $a0, $t0, $zero
syscall

li $v0,10
syscall

根据LB的描述:

The contents of the 8-bit byte at the memory location specified by the effective address are fetched, sign-extended, and placed in GPR rt.

two's complement signed byte is -128..+127, so all the values in your array are small enough to be representable in one byte. That together with the fact that LB sign-extends and that your target "machine" (I'm guessing that you're using SPIM or MARS) is little-endian 的范围意味着当您使用 LB 从数组中加载时,您将获得与使用 LW.[=23= 时相同的结果]

例如,-17 写成十六进制字时的值是 0xFFFFFFEF。在小端系统上,该字的字节首先存储最低有效字节,即 0xEF,0xFF,0xFF,0xFF。因此,当您从该元素 lb 得到 0xEF 符号扩展为 0xFFFFFFEF.