MARS MIPS et nœuds de structure

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

En supposant que je veuille traduire la déclaration ci-dessus en langage assembleur MIPS, comment suis-je censé le faire? Mis à part l’allocation de mémoire (à l’aide de syscall 9), effectuée dans le segment .text, qu’en est-il du segment .data ? Aussi, qu’en est-il de l’ alignement ?

Avant même de mentionner du code, vous devez préciser si la structure que vous souhaitez créer sera une donnée statique (segment de données), une donnée locale (stack) ou une donnée allouée dynamicment (tas). Il y a différentes façons de les affecter.

Mais avant de discuter de cela, la toute première chose à faire est de déterminer la disposition de l’instance de struct. À tout le moins, cela pourrait être:

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

Pour créer une instance de manière statique, il suffit simplement de:

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

Et sur le tas:

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

Si vous placez sur la stack, allouez-lui simplement 8 octets.

Une méthode plus propre consiste à utiliser une méthode basée sur un prototype.

Votre mise en page d’object devient:

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

Pour chaque structure, vous créez un prototype que la routine d’allocation utilisera pour créer l’instance.

  .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 

Que vous souhaitiez que l’instance conserve réellement un champ de taille dépend de vous. Avec cette approche, vous pouvez simplement append des prototypes et c’est tout.