Assembly MIPs程序集中数组的最大值

Assembly MIPs程序集中数组的最大值,assembly,mips,mips32,Assembly,Mips,Mips32,因此,我目前正在第一次学习MIPs assembly,我的任务之一是仅使用“beq”和“slt”条件命令来查找给定数组中的最大有符号值。 然而,当我运行程序时,保存最大值的寄存器似乎总是变成零,而它应该是-4。 下面是给定的数组:{-32,-8,-4,-16,-128,-64} 这是我的密码。执行最大值的代码从L2运行到L4。忽略提供的L1和L5,我所做的只是将标签更改为它们 # local variable register # int *p $s0

因此,我目前正在第一次学习MIPs assembly,我的任务之一是仅使用“beq”和“slt”条件命令来查找给定数组中的最大有符号值。 然而,当我运行程序时,保存最大值的寄存器似乎总是变成零,而它应该是
-4
。 下面是给定的数组:
{-32,-8,-4,-16,-128,-64}
这是我的密码。执行最大值的代码从L2运行到L4。忽略提供的L1和L5,我所做的只是将标签更改为它们

# local variable    register
#   int *p      $s0            can ignore this
#   int *end    $s1            Last element in array
#   int sum     $s2            can ignore this
#   int max     $s3            name of MAX register!
#   int *q      $s4            pointer to abc
#   abc                        the name of the array


main:
    la  $s0, abc                # p = abc
    addi $s1, $s0, 24            # end = p + 6
    add $s2, $zero, $zero     # sum = 0 
L1:
    beq $s0, $s1, L2             # if (p == end) goto L2
    lw  $t9, ($s0)           # $t9 = *p
    add $s2, $s2, $t9         # sum += $t9
    addi $s0, $s0, 4             # p++
    j   L1
L2:     
    la  $s4, abc                #q = abc. This is where my portion of the code starts
    lw  $t1, ($s4)           #putting p[1] into t1
    add $s3, $zero, $t1       #setting p[1] as max by default
    j   L3  

L3:
    beq     $s4, $s1, L5        #if p goes to end, goto L5
    addi    $s4, $s4, 4     #advancing p[i]
    lw  $t8, ($s4)          #putting p[i] into t8
    add $s5, $zero, $t8
    slt $t0, $s3, $t8       #if t1 < t8, t0 becomes one
    bne $t0, $zero, L4     #if if t0 = zer0, or in other words t1 < t8, goto L4
    j   L3
L4:
    add $s3, $zero, $s5     #storing t8/s5 into max
    j   L3

L5:
    add $v0, $zero, $zero   # return value from main = 0
    jr  $ra
#局部变量寄存器
#int*p$s0可以忽略此项
#int*end$s1数组中的最后一个元素
#int sum$s2可以忽略这一点
#int max$s3最大寄存器的名称!
#int*q$s4指向abc的指针
#abc数组的名称
主要内容:
la$s0,abc#p=abc
addi$s1,$s0,24#end=p+6
加上$s2、$0、$0#和=0
L1:
beq$s0,$s1,L2#如果(p==end)转到L2
lw$t9,($s0)#$t9=*p
加上$s2、$s2、$t9#sum+=$t9
附加$s0,$s0,4#p++
j L1
L2:
la$s4,abc#q=abc。这就是我的代码部分的开始
lw$t1,($s4)#将p[1]放入t1
添加$s3、$zero、$t1#默认情况下将p[1]设置为最大值
j L3
L3:
beq$s4,$s1,L5#如果p结束,转到L5
addi$s4、$s4、4#前进p[i]
lw$t8,($s4)#将p[i]放入t8
加上$s5、$0、$t8
slt$t0,$s3,$t8#如果t1
当我一步一步地运行代码时,从L4到L3的最后一次跳转似乎将寄存器$s3设置为零。但更令人困惑的是,它在这之前持有“-64”。
所以基本上我要问的是,我的代码中有什么错误一直将$s3重置为零?为什么$s3的“-64”明显不正确?

您的数组被声明为单词数组,对吗<代码>abc:.data部分中的word-32、-8、-4、-16、-128、-64
?你应该把它作为你工作的一部分。(在MCVE上做得很好,并且实际解释了单步执行时看到的内容。)我还没有发现问题,但将p[1]放入t1是错误的:您正在加载
q[0]
,第一个元素,而不是
q[1]
=
4($s1)
。此外,您不需要在那里使用
jl3
;执行过程会自行转到下一条指令。位于L3循环底部的
j L3
上的
bne
也过于复杂,只是
beq L3
。此外,通常情况下,函数不应修改
$s
寄存器而不保存/还原它们(它们是保留调用的);对内部局部变量使用
$t0..9
;在标准的通话惯例中,他们的通话被打断了。顺便说一句,您可以对数组上第二个循环的指针重复使用相同的寄存器。或者更好的方法是,在对数组求和的同一个循环中计算max,而不是循环两次。是的,如果你可以假设数组是非空的,从max=first元素开始是好的。我认为你有一个off。你的结束指针是数组的结尾,比如C++ +开始/结束迭代器。但您可以在检查后增加并使用它。通常的方法是在循环的底部进行递增和条件分支,然后通过遍历退出循环。你的求和循环显然没有受到影响,因为数组后面的字是零,而求和+=0不会影响它。@PeterCordes感谢你的洞察力。是的,我将数组声明为单词数组。该错误是否可能源于指针超出范围?但该计划似乎一路走到了尽头,没有崩溃。只是MAX的值不正确。内存保护通常在页面边界上工作,MARS可能就是这样模拟的。通常可以从数组末尾加载一些垃圾或零,因此CPU故障/异常不是正确性的证据。查看L1中的检查/加载/增量顺序与L3中的检查/加载/增量顺序。马克斯很好(我想),你只是用错了。