MARS MIPS и структурные узлы

<code>typedef struct node {    
    int data;    
    struct node *next;    
} nodeL; 
</code>

Если я хочу перевести вышеуказанное объявление на ассемблер MIPS, как мне это сделать? Помимо выделения памяти (используя syscall 9), что делается в сегменте .text,what about the .data segment? Also, what about alignment?

 hochl20 апр. 2012 г., 11:15
и, самое главное,what about what have you tried?
 Jeff E20 апр. 2012 г., 20:14
Можете ли вы опубликовать свой код MIPS?
 markloop20 апр. 2012 г., 11:19
Сам код в значительной степени готов (или так кажется), как я сначала написал его на C, а затем перевел на ассемблерный язык MIPS. Но я получаюRuntime exception at 0x00400080: store address not aligned on word boundary 0x00000001.
 byrondrossos20 апр. 2012 г., 13:37
Что можно сделать в текстовом сегменте с этим? Это просто структура данных.

Ответы на вопрос(1)

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

Но прежде чем обсуждать это, самое первое, что вам нужно сделать, это определить макет экземпляра структуры. По крайней мере это может быть:

------------------
| data - 32-bits |
------------------
| next - 32-bits |
------------------

Чтобы создать экземпляр статически, достаточно просто:

    .data
    .align 2
anInstance:     .word   0,0

И в кучу

    .text
Allocator.newNode:
    li $a0, 8           #allocate 8 bytes
    li $v0, 9
    syscall             #returns word-aligned ptr
    jr $ra

При размещении в стеке просто выделите для него 8 байтов.

Более чистый способ - использовать метод на основе прототипа.

Ваше расположение объекта становится:

------------------
| size - 32-bits |
------------------
| atr 1 - 32-bits|
------------------
| atr 2 - 32-bits|
------------------
.
.
.
------------------
| atr n - 32-bits|
------------------

Для каждой структуры вы создаете прототип, который подпрограмма размещения будет использовать для создания экземпляра.

    .data
ListProto:      .word   8,0     #size, head ptr
NodeProto:      .word   12,0,0  #size, data, next ptr    

    .text
main:
    la $a0, ListProto
    jal Allocator.newObject     #create new list instance

    la $a0, NodeProto
    jal Allocator.newObject     #create new node instance

Allocator.newObject:
    lw $a0, 0($a0)      #a0 = object size
    li $v0, 9
    syscall
    jr $ra

Хотите ли вы, чтобы экземпляр действительно сохранял поле размера, решать только вам. При таком подходе вы можете просто добавлять прототипы и все.

 06 янв. 2016 г., 17:46
Вместо использования 1 байта используйте 2 при выделении данных. Типы данных - это абстракция, созданная на уровне языка.
 15 окт. 2015 г., 13:24
Что бы произошло, если бы вместо int у нас был, например, double?

Ваш ответ на вопрос