gpt4 book ai didi

c - MARS MIPS 和结构节点

转载 作者:太空宇宙 更新时间:2023-11-04 02:13:52 25 4
gpt4 key购买 nike

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

假设我想用 MIPS 汇编语言翻译上面的声明,我应该怎么做?除了在 .text 段中分配内存(使用系统调用 9)之外,.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个字节。

更简洁的方法是使用基于原型(prototype)的方法。

您的对象布局变为:

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

对于每个结构,您创建一个原型(prototype),分配例程将使用该原型(prototype)来创建实例。

    .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

您是否希望实例实际保留大小字段取决于您。使用这种方法,您可以简单地添加原型(prototype),仅此而已。

关于c - MARS MIPS 和结构节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10242653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com