MARS MIPS和struct节点

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

假设我想用MIPS汇编语言翻译上述声明,我该怎么做呢? 除了在.text段中分配内存(使用系统调用9)之外, .data段怎么样? 对齐怎么样?

在提及代码之前,您需要澄清您要创建的结构是静态数据(数据段),本地数据(堆栈)还是动态分配的数据(堆)。 分配每种方法有不同的方法。

但在讨论之前,您需要做的第一件事就是确定struct实例的布局。 它至少可能是:

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

您是否希望实例实际保留大小字段取决于您。 通过这种方法,您可以简单地添加原型,就是这样。