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

typedef struct node { int data; struct node *next; } nodeL; 

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

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

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

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

Если вы хотите, чтобы экземпляр фактически сохранял поле размера, зависит от вас. С помощью этого подхода вы можете просто добавить прототипы и все.