2014-09-25 3 views
0

Я пытаюсь создать связанный список с распределением динамической памяти в MIPS с пользовательских входов.Динамические односвязные списки MIPS

Мне было интересно, существует ли общая структура, которая обычно используется для создания узлов (структур на C) - например, возможно, это будет подпроцесс, который будет вызываться в условном выражении.

структура Я хочу перевести это:

struct p { 
    char name[256]; 
    int phone; 
    float rating; 
    struct p *next; 
}; 

Входы каждой части структуры будут введены пользователем (эта часть, я знаю, как это сделать, и магазин), но я не конечно, как назначить значения регистров в куче для выполнения этого динамически.

В конце концов я буду сортировать эти значения на основе оценок.

Помощь приветствуется - спасибо!

+0

Что такое платформа? Динамическое распределение памяти - это то, что вы обычно просите ОС делать, а не сворачивать свои собственные. Структуры легки - просто подсчитайте общий размер и работайте с смещениями. –

+0

Я использую QtSpim для выполнения и не могу подсчитать общий размер, так как пользователь может ввести случайное число структур, которые будут оцениваться. Я просто практикую доступ к куче/стекю и застрял на этом. – ahagouel

+1

Вам понадобится использовать syscall 9 для выделения кучи памяти в Spim. – markgz

ответ

1

Если регистр $t9 содержит адрес экземпляра struct p, вы можете получить доступ к полям структуры, используя смещения от $t9.

Для загрузки первого символа name сделать lw $t0, 0($t9).

Для загрузки phone do `lw $ t0, 256 ($ t9).

Чтобы загрузить rating сделать lwc1 $f0, 260($t9) # 256 + sizeof(int)

Чтобы загрузить next сделать lw $t0, 264($t9) # 256 + sizeof(int) + sizeof(float)

+0

Может ли это быть сохранено в подпроцессе - что-то вроде «make_node», которое можно назвать, поскольку вещи читаются от пользователя? – ahagouel

+0

Да, вы можете использовать кучу инструкций хранилища в подпрограмме для хранения значений, введенных пользователем в поля структуры. – markgz

2

В связанном списке, каждый узел состоит из двух элементов:

1. Данные,

2. Адрес следующего узла

Чтобы выделить достаточное количество памяти, вам нужно найти необходимое количество байтов. В вашем случае вам понадобится 256 байт для поля массива, 4 байта для поля int, 8 байтов для поля float и 4 байта для адрес следующего узла ..

Если вы хотите создать свой кулак структуру вы можете сделать это:

addi $v0,$0,9 addi $a0,$0,272 syscall

и теперь вы можете назначить значения для структуры ...

для Например, если вы хотите сохранить номер 7 в поле телефона, вы можете d o это:

addi $t0,$0,7 
sw $t0,256($v0) 
+0

Мне не обязательно нужно 256 ... просто номер, который я выбрал. Достаточно ли 4 для ввода строки? Это будут имена (например, John Doe) – ahagouel

+0

каждый символ нуждается в 1 байте, в результате, если вы хотите получить имя John Doe, вам нужно как минимум 8 байтов. В общем, хорошо взять дело на длинное имя, так что, на мой взгляд положил 32 байта наверняка – Anastasis

Смежные вопросы