【问题标题】:Infinite array loop MIPS无限阵列循环 MIPS
【发布时间】:2021-06-03 00:49:06
【问题描述】:

所以我是 MIPS 的新手,我正在尝试在 Assembly MIPS 中构建一个程序,它会在数组中找到最大值:

    .data 
    A: .word 11 100 3 5 8 13 1 16  #array of integers
    N: .word 8  # array length
    output_max: .asciiz "The max value is: "
    
    .text
    .globl main
    
main:
    la $a0 N
    la $a1 A
    
    jal max
    move $s0 $v0
    
    
    li $v0 4
    la $a0 output_max
    syscall
    
    li $v0 1
    move $a0 $s0
    syscall
    j exit
    
    
exit:
    li $v0 10
    syscall

max:
    
    move $t0 $a0  
    move $t1 $a1  
    lw $v0 0($t1)  
    li $t2 0  
    j maxLoop
    
maxLoop:
    addi $t2 $t2 1 
    beq $t2 $t0 maxEnd  
    addi $t1 $t1 4 
    lw $t3 0($t1)
    slt $t4 $v0 $t3 
    beq $t4 1 changeMax
    j maxLoop
    
changeMax:
    move $v0 $t3
    j maxLoop
        

maxEnd:
    jr $ra

max 函数应该返回输入数组中的最大值。所以编译后就进入了无限循环。我不太清楚问题出在哪里..

【问题讨论】:

  • 你试过调试了吗?

标签: assembly mips


【解决方案1】:

问题是您正在使用N 的地址而不是N 的值运行循环。 main 的第一行将N 的地址加载到$a0 中,这在您的max 函数中变为$t0。但是,然后您使用该地址,就好像它在您的循环中使用 N 的值(即 8)与 beq $t2 $t0 maxEnd

要么直接将值加载到开头的$a0

main:
    li $a0 8 # Length of A

或者首先取消引用max中的参数:

max:
    lw $t0 0($a0) # Get value of N from pointer to N

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多