Почему MIPS печатает ячейки памяти во второй раз - PullRequest
0 голосов
/ 22 октября 2019

[решено] Нам было поручено написать пузырьковую сортировку в MIPS и напечатать как несортированные, так и отсортированные массивы

Я написал следующий код, чтобы выполнить это.

Но когда я запускаю его, исходный массив печатается так, как я ожидал

Original Array

[34, 23, -1, -2, 0]

Но затем он печатает этодля отсортированного массива.

Sorted Array

[173496791, 1818324585, 1920090400, 686433, 1919898378]

(печатаются квадраты Unicode)

array: .word 34, 23, -1, -2, 0, 89
length: .word 6
original: .asciiz "Original Array\n"
sorted: .asciiz "\nSorted Array\n"
.text
# main()
main:
la $a2, length
lw $a2, 0($a2) # a2 <= n_element
add $t9, $0, $0 # t9 : counter
la $a1, array # a1 = &array[0]
addi $t0, $0, 0 # for t0=0 to
addi $a2, $a2, -1 # because we do [i+1]
#says prints original array
la $a0, original
li $v0, 4
syscall 
#prints array
jal print
#printing the string saying sorted
la $a0, sorted
li $v0, 4
syscall
#after printing original we reset the values?
la $a2, length
lw $a2, 0($a2) # a2 <= n_element
add $t9, $0, $0 # t9 : counter
add $t8, $0, $0 # t10 : counter 2
la $a1, array # a1 = &array[0]
addi $t0, $0, 0 # for t0=0 to
addi $a2, $a2, -1 # because we do [i+1]
#see if that worked it did
li $s0, 1 #boolean swapped = false 0=false 1=true
outerLoop:
    beqz $s0, exit #if flag is false exit
    li $s0, 0 
    addi $a1, $a1, 4 # next array offset
    addi $t9, $t9, 1 # counter++
    move $t8 $0
    sub $s2, $a2, $t9
    innerLoop:
        bge $t8, $s2, exitInner
        lw $t7, 0($a1) # t7 = array[i]
        lw $t8, 4($a1) # t8 = array[i+1]
        ble $t7, $t8, skip #if array[i]<= arr[i+1] skip the swapping
        sw $t8, 0($a1) #a[i+1] = a[1]
        sw $t7, 4($a1) #a[i] = a[i+1]
        li $s0, 1#flag update
        skip:
        addi $t8, $t8, 1 #count  
        addi $a1, $a1, 4
        j innerLoop
    exitInner:
        j outerLoop
exit:

la $a2, length
lw $a2, 0($a2) # a2 <= n_element
add $t9, $0, $0 # t9 : counter
addi $a2, $a2, -1 # because we do [i+1]
jal print
j quit#end Program
#print array 

print:
lw $t7,0($a1) # t7 = array[i]
lw $t8,4($a1) # t8 = array[i+1]

add $a0, $t7, 0
addi $v0, $0, 1 #print int using system call the value stored in a0
syscall
addi $a0, $0, 0x20 # ascii 0x20 = ' '
addi $v0, $0, 11
syscall

addi $a1, $a1, 4 # next array offset
addi $t9, $t9, 1 # counter++
beq $t9, $a2, return #return to the where we were we were at beforehand 
j print
return:
jr $ra
quit:
addi $v0, $0, 10
syscall

Я думаю, что это области памяти? Я не уверен, почему он печатает так, как есть, потому что я сбрасываю значения счетчика, прежде чем пытаться печатать. Так что вопрос в том. Почему я печатаю места памяти? если это то, что происходит

Я сортировал на месте, поэтому мне пришлось сбросить массив перед функцией печати. ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...