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

问题描述 投票:0回答:2

相当简单的问题。我正在尝试读取一个数组并打印出来,但是它没有打印出应有的样子。

例如如果我从键盘上读取了5个元素:1、2、3、4、5,则打印结果为5 0 0 00。所以我可以理解,它从第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
assembly mips
2个回答
0
投票

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

在输出循环中,您可以使用以下命令正确遍历数组:>

    lw $t2, 0($t1)
    addi $t1, $t1, 4

[使用调试器检查内存内容

-看到内存中的5 0 0 0 0会让您马上走上正确的轨道,这是问题首先存储了输入。

旁注:请不要在MIPS上使用异或归零,而只能使用x86。它不能节省空间(MIPS具有固定宽度的指令),并且不允许像$s0那样破坏对move $s0, $zero的旧值的依赖性。 (MIPS的内存模型保证了对数据依赖项的依赖项排序,例如C ++ 11 std::memory_order_consume。)>

xor $s0, $zero, $zero可以,尽管比addu $s0, $zero, $zeroor少一些。您正在使用其他伪指令,例如lila,因此只需使用move $s0, $zero。它将组装为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

将数组的第一个地址加载到$ t1 la $t1, array中,并在存储从键盘addi $t1, $t1, 4读取的值之后遍历sw $v0, 0($t1)

谢谢彼得。


0
投票
#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
© www.soinside.com 2019 - 2024. All rights reserved.