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