Как я могу сохранить строку в MIPS, используя динамическую память? - PullRequest
0 голосов
/ 30 марта 2012

Ладно, ребята, в основном у меня проблема в следующем.

Мне поручили написать программу 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's 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

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

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

1 Ответ

3 голосов
/ 31 марта 2012

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

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

Вместо 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 

Кроме того, вы можете найти окончательное решение здесь: https://stackoverflow.com/a/9953839/1274820

Редактировать: Ну, после 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 

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

Представьте, что у меня есть блок из 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
...