我只想要一个数组来计算所有数字的总和。我不确定如何将每个位置存储到变量中,所以我尝试了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
答案 0 :(得分:4)
来自LB
的说明:
获取有效地址指定的存储单元位的8位字节内容,符号扩展,并放入GPR
rt
。
two's complement有符号字节的范围是-128 .. + 127,因此数组中的所有值都足够小,可以在一个字节中表示。这与LB
签署延伸的事实以及您的目标"机器" (我猜测您正在使用SPIM或MARS)little-endian表示当您使用LB
从阵列加载时,您将获得相同的结果你使用LW
。
例如,当作为十六进制字写出时,值-17
为0xFFFFFFEF
。在小端系统上,该字的字节首先以最低有效字节存储,即0xEF,0xFF,0xFF,0xFF
。因此,当您从该元素lb
获得0xEF
时,会将0xFFFFFFEF
符号扩展为{{1}}。