以 mips 打印循环打印错误的值

Print loop in mips printing wrong values

相当简单的问题。我正在尝试读取一个数组并打印它,但它没有打印它应该打印的内容。

例如。如果我从键盘读取 5 个元素:1、2、3、4、5,打印结果为 5 0 0 0 0。所以我可以理解它从第 5 个元素开始打印,并且它添加了零,因为其余的数组是空的,但我不知道如何修复它。

#bubblesort

.data
    array:
        .space 100
    message1:
        .asciiz "Number of elements: "
    message2:
        .asciiz "The elements:\n"
    space:
        .asciiz " "
    message3:
        .asciiz "Result: \n"
.text
    main:

        li $v0, 4
        la $a0, message1
        syscall

        li $v0, 5
        move $t0, $v0
        syscall

        li $v0, 4
        la $a0, message2
        syscall

        xor $s0, $s0, $s0

    readarray:
            beq $s0, $t0, afterread
            li $v0, 5
            syscall
            sw $v0, array
            addi $s0, $s0, 1
            j readarray

    afterread:
        xor $s0, $s0, $s0

        li $v0, 0
        la $t1, array


        li $v0, 4
        la $a0, message3
        syscall

    print:
        beq $s0, $t0, afterprint
        lw $t2, 0($t1)
        addi $t1, $t1, 4

        li $v0, 1
        move $a0, $t2
        syscall

        li $v0, 4
        la $a0, space
        syscall

        addi $s0, $s0, 1
        j print

    afterprint:


    li $v0, 10
    syscall

在您的输入循环中,sw $v0, array 总是存储到数组的第一个元素,覆盖之前的值。

在你的输出循环中,你使用

正确地遍历了数组
    lw $t2, 0($t1)
    addi $t1, $t1, 4

使用调试器检查内存内容 - 在内存中看到 5 0 0 0 0 会让您马上走上正轨,问题在于将输入存储在第一名。


旁注:不要在 MIPS 上使用异或归零,只能在 x86 上使用。它不保存 space(MIPS 有固定宽度的指令)并且不允许像 move $s0, $zero 那样打破对 $s0 旧值的依赖。 (MIPS 的内存模型保证数据依赖的依赖顺序,如 C++11 std::memory_order_consume)。

xor $s0, $zero, $zero 可以,尽管不如 addu $s0, $zero, $zeroor 惯用。您正在使用其他伪指令,例如 lila,因此只需使用 move $s0, $zero。它会 assemble 到 adduor.

#bubblesort

.data
    array:
        .space 100
    mesaj1:
        .asciiz "Numarul de componente: "
    mesaj2:
        .asciiz "Componentele:\n"
    spatiu:
        .asciiz " "
    mesaj3:
        .asciiz "Rezultatul: \n"
.text
    main:

        li $v0, 4
        la $a0, mesaj1
        syscall

        li $v0, 5
        move $t0, $v0
        syscall

        li $v0, 4
        la $a0, mesaj2
        syscall

        xor $s0, $zero, $zero

        li $v0, 0
        la $t1, array
    readarray:
            beq $s0, $t0, afterread
            li $v0, 5
            syscall
            sw $v0, 0($t1)
            addi $t1, $t1, 4
            addi $s0, $s0, 1
            j readarray

    afterread:
        xor $s0, $zero, $zero

        li $v0, 0
        la $t1, array
        li $v0, 4
        la $a0, mesaj3
        syscall

    print:
        beq $s0, $t0, afterprint
        lw $t2, 0($t1)
        addi $t1, $t1, 4

        li $v0, 1
        move $a0, $t2
        syscall

        li $v0, 4
        la $a0, spatiu
        syscall

        addi $s0, $s0, 1
        j print

    afterprint:


    li $v0, 10
    syscall

感谢 Peter Cordes,我找到了解决方案。这是正确的代码。 问题是我没有正确保存数组中的值。

 readarray:
            beq $s0, $t0, afterread
            li $v0, 5
            syscall
            sw $v0, array
            addi $s0, $s0, 1
            j readarray

正确的方法是:

readarray:
            beq $s0, $t0, afterread
            li $v0, 5
            syscall
            sw $v0, 0($t1)
            addi $t1, $t1, 4
            addi $s0, $s0, 1
            j readarray

在$t1la $t1, array中加载数组的首地址,并在存储从键盘sw $v0, 0($t1)读取的值后循环addi $t1, $t1, 4

谢谢彼得。