Вопрос по c, struct, mips, assembly – MARS MIPS и структурные узлы

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

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

Что можно сделать в текстовом сегменте с этим? Это просто структура данных. byrondrossos
Можете ли вы опубликовать свой код MIPS? Jeff E
и, самое главное,what about what have you tried? hochl
Сам код в значительной степени готов (или так кажется), как я сначала написал его на C, а затем перевел на ассемблерный язык MIPS. Но я получаюRuntime exception at 0x00400080: store address not aligned on word boundary 0x00000001. markloop

Ваш Ответ

1   ответ
3

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

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

------------------
| 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

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

Вместо использования 1 байта используйте 2 при выделении данных. Типы данных - это абстракция, созданная на уровне языка.
Что бы произошло, если бы вместо int у нас был, например, double?

Похожие вопросы