MARS MIPS和结构节点(MARS MIPS and struct nodes)

2019-06-23 18:56发布

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

假设我想要翻译在MIPS汇编语言上面的声明,我应该怎么办呢? 除了分配内存(使用系统调用9),这是在.text段完成, 何谈。数据段 ? 另外,怎么样定位

Answer 1:

即使提的代码之前,你需要明确是否要创建将静态数据(数据段),本地数据(栈),或者动态分配数据(堆)的结构。 有不同的方式来分配每个。

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

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

无论您希望实例实际上保持大小字段是你。 有了这种方法,你可以简单地添加的原型,就是这样。



文章来源: MARS MIPS and struct nodes