Как сохранить строку в MIPS с помощью динамической памяти?

92
9

Хорошо, ребята, в основном проблема, с которой я столкнулась, - это.

Мне было поручено написать программу MIPS, которая динамически хранит структуру.

В основном, он хранит идентификатор, год, заголовок и описание, которые должны храниться с использованием двоичного дерева поиска.

Если вы когда-либо закодировали стек в C++, вы знаете, о чем я говорю. Я успешно сохранил идентификатор и титры в памяти динамически, но у меня возникли проблемы с сохранением введенных пользователем строк.

Это сложный вопрос, и не так много информации, которую я смог найти в Интернете, так что реквизиты, если вы можете помочь мне с этим :)

Вот моя настройка памяти:

$ s5 - Магазин корневого узла

$ s7 - Сохраняет размер дерева (не обязательно)

Каждый новый элемент Содержит фрагмент из 344 байт

Байты устанавливаются как таковые:

8 байтов - [ID]

8 байт - [год]

64 байт - [Название]

256 байт - [Описание]

8 байтов - [LastNodeAddress]

8 байтов - [NextNodeAddress]

Здесь код, и вы можете увидеть проблему:

li $v0, 9           #allocate memory for new record
li $a0, 344 #enough memory for 2 addresses and all the data
syscall

move $s0, $v0 #hang onto the initial address of all our info

li $v0, 4 #prompt for ID
la $a0, addid
syscall

li $v0, 5 #enter integer
syscall

sw $v0, 0($s0) #store our ID into memory Offset: 0

li $v0, 4 #prompt for add year
la $a0, addyear
syscall

li $v0, 5 #enter integer
syscall

sw $v0, 4($s0) #store year into our memory Offset: 4

li $v0, 4 #prompt for add title
la $a0, addtitle
syscall

li $v0, 8 #read title into titlebuffer
la $a0, titlebuffer
li $a1, 64
syscall

sw $a0, 8($s0) #store title into our memory Offset: 8

li $v0, 4 #prompt for add description
la $a0, adddescription
syscall

li $v0, 8 #read from input into descriptionbuffer
la $a0, descriptionbuffer
li $a1, 256
syscall

sw $a0, 72($s0) #store description into our memory Offset: 72

bne $s7, 0, setlocations #if this isn't root node let set the locations

add $s7, $s7, 1 #add 1 to the size of the records

move $s5, $s0 #store this address as root node for now

Проблема в том, что все, что хранится, является адресом буферов. Буферы определены в моем разделе данных следующим образом:

.data
titlebuffer: .space 64
descriptionbuffer: .space 256

В итоге я просто адреса, хранящиеся в выделенной памяти, и я понятия не имею, как хранить строки в выделенной памяти.

Любая помощь будет принята с благодарностью! :)

спросил(а) 2021-01-19T19:48:42+03:00 9 месяцев, 1 неделя назад
1
Решение
79

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

Вместо этого выделите его и прочитайте значения в правильные смещения вашей динамической памяти.

Вместо la $a0, descriptionbuffer

Вместо la $a0, titlebuffer

Использование:

la $a0, 8($s0)

la $a0, 72($s0)

Здесь я перемещаю адрес памяти в $s0 используя move $s0, $v0 и считывая значения в правильные смещения.

для печати вы делаете то же самое!

Вот рабочий код:

li $v0, 9           #allocate memory for new record
li $a0, 344 #enough memory for 2 addresses and all the data
syscall

move $s0, $v0 #hang onto the initial address of all our info

li $v0, 8 #read our title into the allocated space
la $a0, 8($s0) #Offset: 8
li $a1, 64
syscall

li $v0, 8 #read our description into the allocated space
la $a0, 72($s0) #Offset: 72
li $a1, 256
syscall

Кроме того, вы можете найти окончательное решение здесь: qaru.site/questions/4746722/...

Edit: Ну, после просмотров 10k, я решил добавить дополнительную информацию здесь, поэтому вам не нужно искать через более поздний код 😉

Здесь полный код для хранения 4 разных фрагментов данных в памяти:

li $v0, 9           #allocate memory for new record
li $a0, 344 #[334 = how much memory - in bytes]
syscall

move $s0, $v0 #store the address of our allocated memory in $s0

li $v0, 5 #enter integer
syscall
sw $v0, 0($s0) #store our ID into memory Offset: 0

li $v0, 5 #enter integer
syscall
sw $v0, 4($s0) #store year into our memory Offset: 4

li $v0, 8 #read our title into the allocated space
la $a0, 8($s0) #Offset: 8
li $a1, 64
syscall

li $v0, 8 #read our description into the allocated space
la $a0, 72($s0) #Offset: 72
li $a1, 256
syscall

Это будет хранить идентификатор, год, название и описание - смещение - это место, где мы помещаем данные в динамическую память.

Представьте, что у меня есть блок из 334 байтов (например, выше):

[ 334 ]

Мы сохраняем ID целым числом (4 байта данных) со смещением 0 следующим образом:

[(ID) 330 ]

Затем мы сохраняем год рядом с ним (со смещением 4).

[(ID)(YR) 326 ]

И так далее...

Чтобы распечатать его, сделайте следующее:

li $v0, 1           #Print the ID stored at $s0     [Offset: 0]
lw $a0, 0($s0)
syscall
li $v0, 1 #Print the Year stored at $s0 [Offset: 4]
lw $a0, 4($s0)
syscall
li $v0, 4 #Print the Title stored at $s0 [Offset: 8]
la $a0, 8($s0)
syscall
li $v0, 4 #Print descript stored at $s0 [Offset: 72]
la $a0, 72($s0)
syscall

ответил(а) 2021-01-19T19:48:42+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема