Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MARS MIPS和struct节点_C_Assembly_Struct_Mips - Fatal编程技术网

MARS MIPS和struct节点

MARS MIPS和struct节点,c,assembly,struct,mips,C,Assembly,Struct,Mips,假设我想用MIPS汇编语言翻译上述声明,我该怎么做?除了在.text段中分配内存(使用syscall 9)外,那么.data段呢? 另外,对齐如何?在提到代码之前,您需要澄清要创建的结构是静态数据(数据段)、本地数据(堆栈)还是动态分配的数据(堆)。有不同的方法来分配每种资源 但在讨论这个问题之前,首先需要确定struct实例的布局。至少可以是: typedef struct node { int data; struct node *next; } no

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

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

但在讨论这个问题之前,首先需要确定struct实例的布局。至少可以是:

typedef struct node {    
    int data;    
    struct node *next;    
} nodeL; 
要静态创建实例,只需执行以下操作:

------------------
| data - 32-bits |
------------------
| next - 32-bits |
------------------
在堆上:

    .data
    .align 2
anInstance:     .word   0,0
如果放在堆栈上,只需为其分配8个字节

更干净的方法是使用基于原型的方法

对象布局将变为:

    .text
Allocator.newNode:
    li $a0, 8           #allocate 8 bytes
    li $v0, 9
    syscall             #returns word-aligned ptr
    jr $ra
对于每个结构,您将创建一个原型,分配例程将使用该原型创建实例

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

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

最重要的是,您尝试过什么呢?代码本身已经准备好了(或者看起来是这样),因为我首先用C编写它,然后用MIPS汇编语言翻译它。但我在0x00400080处遇到运行时异常:存储地址未在字边界0x00000001上对齐。在文本段中可以使用此项做什么?它只是一个数据结构。如果我们使用双精度而不是int,会发生什么情况?在分配数据时使用2,而不是使用1字节。数据类型是在语言级别创建的抽象。
    .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