Сохраните введенную пользователем строку целых чисел в сборку mips целочисленного массива - PullRequest
0 голосов
/ 18 марта 2019

так же, как в заголовке, я пытаюсь написать программу в сборке MIPS, которая будет принимать строку, введенную пользователем из 4 целых чисел от 0 до 9, разделенных пробелами, и сохранять каждое из этих чисел как целое число в массиве,Вот что у меня есть:

screen shot of first half

screen shot of second half

.data
input1: asciiz "Input Row 1: "
row1: .asciiz "Row 1: "
array: .space 16
list: .space 8
.text
la $s0, array              #load address of array to s0
li $s1, 0                  #index of array
li $v0, 4                  #call for print string
la $a0, input1             #load string to be printed
syscall
li $v0, 8                  #call for user input
la $a0, list               #address of where the input will be stored
li $a1, 8                  #space allowed for input
syscall
loop:
la $t0, list               #load address of the string
add $t2, $zero, $zero      #index of the string
load:
sll $t3, $t2, 1            #multiply string index by 2 to skip spaces
sll $t4, $s1, 2            #multiply index of array by 4 for size of word
addu $t0, $t0, $t3         #position string
addu $s0, $s0, $t4         #position array
lbu $t1, 0($t0)            #load byte of the string to t1
addiu $t1, $t1, -48        #convert char to integer
sb $t1, 0($s0)             #store byte into the array
addi $t2, $t2, 1           #increment index of string by 1
addi $s1, $s1, 1           #increment index of array by 1
blt $t2, 4, load           #if the index of the string is less than 4, load the next character
li $v0, 11                 #printing first input as integers from here
addi $a0, $zero, 0xA       #new line ascii character
syscall
li $v0, 4                  #call for print string
la $a0, row1               #load string to be printed
syscall
li $v0, 1                  #print integer call
lb $a0, -24($s0)           #load first number input
syscall
li $a0, 32
li $v0, 11                 # syscall number for printing character
syscall
li $v0, 1
lb $a0, -20($s0)           #load second number input
syscall
li $a0, 32
li $v0, 11                 # syscall number for printing character
syscall
li $v0, 1
lb $a0, -16($s0)           #load third number input
syscall
li $a0, 32
li $v0, 11                 # syscall number for printing character
syscall
li $v0, 1
lb $a0, -12($s0)           # load fourth number input
syscall
exit:
li $v0, 10
syscall

У меня есть две проблемы: ожидание смещения массивабыть в -12 (4 слова x 4 байта - 4 для начальной точки 0), но он начинается в -24, и для 3-го ввода, независимо от того, что это, int 0 сохраняется.Я запускаю эту программу в MARS 4.5.Пример выходных данных ниже:

Input Row 1: 1 2 3 4
Row 1: 1 2 0 4
-- program is finished running --

В конечном итоге я собираюсь ввести пользовательские 4 строки для создания матрицы 4x4 и сохранить все эти строки в одном массиве.

1 Ответ

1 голос
/ 18 марта 2019

Шут указал мне в комментариях, что я делал неправильно.Вместо того, чтобы каждый раз увеличивать адрес массива на 4, я добавлял на 4 больше, чем последний шаг.Таким образом, я добавлял 0 в первый раз, затем 4, затем 8 к этому, ставя меня на 12, а затем еще на 12, поэтому я закончил со смещением 24 вместо ожидаемых 12. Я переместил объявление la $s0, array и la $t0, list в цикл, так что он продолжает устанавливать его обратно на базовый адрес.

Новый цикл выглядит следующим образом:

loop:
add $t2, $zero, $zero     #index of the string
load: 
la $s0, array              #load address of array to s0
la $t0, list               #load adress of the string
sll $t3, $t2, 1            #multiply string index by 2 to skip spaces
sll $t4, $s1, 2            #multiply index of array by 4 for size of word
addu $t0, $t0, $t3         #position string
addu $s0, $s0, $t4         #position array
lbu $t1, 0($t0)            #load byte of the string to t1
addiu $t1, $t1, -48        #convert char to integer
sb $t1, 0($s0)             #store byte into the array
addi $t2, $t2, 1           #increment index of string by 1
addi $s1, $s1, 1           #increment index of array by 1
blt $t2, 4, load           #if the index of the string is less than 4, load the next character
li $v0, 11                 #printing first input as integers from here
addi $a0, $zero, 0xA
syscall
li $v0, 4                  #call for print string
la $a0, row1               #load string to be printed
syscall
li $v0, 1
lb $a0, -12($s0)
syscall
li $a0, 32
li $v0, 11                 # syscall number for printing character
syscall
li $v0, 1
lb $a0, -8($s0)
syscall
li $a0, 32
li $v0, 11                 # syscall number for printing character
syscall
li $v0, 1
li $a0, 32
li $v0, 11                 # syscall number for printing character
syscall
li $v0, 1
lb $a0, 0($s0)
syscall
exit:
li $v0, 10
syscall

Кредит для Шута длянаправляя меня в правильном направлении.

...