Выведите l oop в мипс, печатая неправильные значения - PullRequest
0 голосов
/ 28 марта 2020

Довольно простая проблема. Я пытаюсь прочитать массив и распечатать его, но он не печатает то, что должен.

Например. если я прочитаю 5 элементов с клавиатуры: 1, 2, 3, 4, 5, напечатанный результат будет 5 0 0 0 0. Поэтому я могу понять, что он начинает печатать с 5-го элемента и добавляет нули, потому что остальные массив emtpy, но я не знаю, как это исправить.

#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

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Во входных данных l oop, sw $v0, array всегда сохраняется в первом элементе массива, перезаписывая предыдущее значение.

В ваших выходных данных l oop, вы правильно l oop over массив с

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

Используйте отладчик для проверки содержимого памяти - просмотр 5 0 0 0 0 в памяти сразу бы поставил вас на правильный путь, что проблема заключалась в сохранении ввода во-первых.


примечание: не используйте xor-zeroing на MIPS, только x86. Он не экономит место (MIPS имеет инструкции фиксированной ширины), и ему не разрешается нарушать зависимость от старого значения $s0, как move $s0, $zero. (Модель памяти MIPS гарантирует упорядочение зависимостей для зависимостей данных, например, C ++ 11 std::memory_order_consume).

xor $s0, $zero, $zero будет в порядке, хотя идиоматизирован c, чем addu $s0, $zero, $zero или or. Вы используете другие псевдоинструкции, такие как li и la, поэтому просто используйте move $s0, $zero. Он будет собираться до addu или or.

0 голосов
/ 28 марта 2020
#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

Благодаря Питеру Кордесу я нашел решение. Это правильный код. Проблема заключалась в том, что я не правильно сохранил значения в массиве.

 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 и l oop через него addi $t1, $t1, 4 после сохранения значения, считанного с клавиатуры sw $v0, 0($t1).

Спасибо, Питер.

...