选择数组中的最大值,MIPS程序集

选择数组中的最大值,MIPS程序集,mips,Mips,嗨,我制作了一个MIPS汇编代码来打印数组的最大值,但它不能正常工作 相反,它总是打印数组中的最新值。代码如下: 我希望当$a0(最大值)小于$a1(当前向量元素)$a3时,它被设置为true,因此bgtz$a3,if计算为true,执行被分支到if,其中数组值被复制到$a0。否则,当$a0大于$a1时,$a3为 设置为0,因此bgtz$a3,如果的计算结果为false,则它会在其后执行跳转指令,其目的是在不将$a1值加载到$a0中的情况下执行其余代码。问题在于,跳转指令似乎没有执行,因为它在每

嗨,我制作了一个MIPS汇编代码来打印数组的最大值,但它不能正常工作

相反,它总是打印数组中的最新值。代码如下:

我希望当
$a0
(最大值)小于
$a1
(当前向量元素)
$a3
时,它被设置为true,因此
bgtz$a3,if
计算为true,执行被分支到
if
,其中数组值被复制到
$a0
。否则,当
$a0
大于
$a1
时,
$a3
为 设置为
0
,因此
bgtz$a3,如果
的计算结果为false,则它会在其后执行跳转指令,其目的是在不将
$a1
值加载到
$a0
中的情况下执行其余代码。问题在于,跳转指令似乎没有执行,因为它在每个循环迭代中将
$a1
值加载到
$a0
中。我做错了什么

.text
.globl main
main:
   li $a0,0
   la $a1,$vector
   li $a2,4
   jal maior                       # maior
   li $v0,1                        # imprime o resultado
   syscall
   li $v0,10                       # termina
   syscall
maior:
   subu $sp,$sp,8                  # Abre um espaco na pilha
loop:
   subu $a2,$a2,1
   slt  $a3,$a0,$a1
   bgtz $a3,if
   j    else
if:
   lw   $a0,0($a1)
else:
   addu $a1,$a1,4
   bgtz $a2,loop
   addu $sp,$sp,8                # retira o espaco ocupado na pilha
   jr $ra
.data
$vector: .word 26, 21, 22, 24`

这里的问题是,您说
$a1
包含当前向量元素,而实际上它包含当前向量地址

为了改变这一点,我引入了一个从
$a1
加载到
$t0
的加载,如下所示:

.text
.globl main
main:
   li $a0,0
   la $a1,$vector
   li $a2,4
   jal maior                       # maior
   li $v0,1                        # imprime o resultado
   syscall
   li $v0,10                       # termina
   syscall
maior:
   subu $sp,$sp,8                  # Abre um espaco na pilha
loop:
   subu $a2,$a2,1
   lw   $t0,0($a1)
   slt  $a3,$a0,$t0
   bgtz $a3,if
   j    else
if:
   move $a0,$t0
else:
   addu $a1,$a1,4
   bgtz $a2,loop
   addu $sp,$sp,8                # retira o espaco ocupado na pilha
   jr $ra
.data
$vector: .word 21, 26, 22, 24

我测试了cody,问题没有消失,它一直显示Array的最后一个值,我不知道该告诉你什么。这对我很有效。我已经包含了上面的完整代码,以防有歧义。我的错误是,我忘了将slt指令中的$a1更改为$t0。我对这个密码有疑问。为什么我不能使用lw$a,0(t0)来代替move$a0,$t0?
lw
$t0
指向的位置的内存加载,而
move
$t0
的内容移动到
$a0
。这是非常不同的,所以当我做lw$a0,0($t0)时,它取存储在$t0的值(应该是21…24),加上零,就好像这些值是一个真实的内存地址,然后去引用它?这可以解释我在尝试使用lw代替move时收到的错误消息,因为它试图访问受保护的内存区域。