【问题标题】:MARS MIPS and struct nodesMARS MIPS 和结构节点
【发布时间】:2012-04-20 08:20:22
【问题描述】:
typedef struct node {    
    int data;    
    struct node *next;    
} nodeL; 

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

【问题讨论】:

  • 最重要的是,你尝试了什么
  • 代码本身已经准备好了(或者看起来是这样),因为我首先用 C 编写它,然后将它翻译成 MIPS 汇编语言。但我在 0x00400080 处遇到 运行时异常:存储地址未在字边界 0x00000001 上对齐
  • 用这个可以在文本段中做什么?它只是一个数据结构。

标签: c assembly struct mips


【解决方案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

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

【讨论】:

  • 如果我们用双精度代替 int 会发生什么?
  • 在分配数据时不要使用 1 字节,而是使用 2。数据类型是在语言级别创建的抽象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多