Для цикла в MIPS с использованием .space

Я пытаюсь создать цикл, который будет добавлять введенные пользователем целые числа в массив, пока он не заполнит массив. Каждый раз, когда я вводил значение, QTSPIM выдает 268501016, которое, как я полагаю, является некоторым случайным значением, хранящимся в регистре.

Чтобы проверить, проходит ли моя программа весь цикл, я добавил вызов строки ascii, когда программа достигла части ветки моего beq. Программа казалась ветвящейся, даже если значения не были (по крайней мере, в моем понимании) равными.

.data
array1: .space 24
str1: .ascii "Type in numbers:"
str2: .ascii "Reached Terminate"

.text

main:

li $t2, 5
li $t3, 0 

loop1:
beq $t3, $t2, terminate #branch if equal 
la $a0, str1
syscall

ori $v0, $0, 5 #instruction to store user input in v0
syscall      #get user input and store it in v0

la $t4, array1 #load the address of the array
addu $t0, $0, $v0   #add v0 (our user input) to $t0
sw 0($t4), t0  #stores the value in $t4 to our array
addi $t3, $t3, 1  #add 1 to t3 (incrementing the counter)
addi $t4, $t4, 4  $add 4 to increment the array 4 bits to the next array slot
jal loop1 

terminate: 

la $a2, str2 #load the string to check when the program reaches terminate
syscall
ori $v0, $0, 10 # end the program
syscall

Единственное, что я могу думать, это то, что мой вызов перехода не возвращается к loop1, но если это так, я не знаю, как это исправить.

Это 32-битный код MIPS.


person Doug_Doug    schedule 14.10.2013    source источник


Ответы (1)


Вы неправильно настраиваете регистры до syscalls.

Здесь должно быть li $v0, 4 перед syscall:

la $a0, str1
syscall

Если мы предположим, что вы пытаетесь напечатать здесь str2, перед syscall должен стоять li $v0, 4, а вместо $a2 следует использовать $a0:

la $a2, str2 #load the string to check when the program reaches terminate
syscall

Это должно быть sw $t0, 0($t4), а не наоборот:

sw 0($t4), t0

Это должно быть j, а не jal (jal используется для вызовов функций):

jal loop1
person Michael    schedule 16.10.2013