在数组中选择最大值,MIPS汇编

时间:2014-01-22 04:21:04

标签: mips

您好我制作了一个MIPS汇编代码来打印数组的最大值,但它无法正常工作。

相反,它总是在数组中打印最新值。这是代码:

我希望当$a0(最大值)小于$a1(当前向量元素)$a3时,它被设置为true,因此bgtz $a3,if的计算结果为true并且执行被分支到if,其中数组值被复制到$a0。否则,当$a0大于$a1时,$a3就是0 设置为bgtz $a3,if,因此$a1的计算结果为false,因此它执行跟随它的跳转指令,其目的是执行其余代码而不将$a0值加载到{{1 }}。问题是跳转指令似乎没有被执行,因为它在每次循环迭代中将$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`

1 个答案:

答案 0 :(得分:0)

这里的问题是你说当$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 ,如下所示:

{{1}}