typedef struct node {
int data;
struct node *next;
} nodeL;
假设我想用 MIPS 汇编语言翻译上述声明,我应该怎么做?除了分配内存(使用系统调用 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
您是否希望实例实际保留大小字段取决于您。使用这种方法,您可以简单地添加原型,仅此而已。