簡體   English   中英

MARS MIPS和結構節點

[英]MARS MIPS and struct nodes

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

假設我想將以上聲明翻譯成MIPS匯編語言,該怎么辦? 除了在.text段中完成分配內存(使用syscall 9)之外, .data段又如何呢? 另外, 對齊如何?

在甚至提到代碼之前,您需要弄清楚要創建的結構是靜態數據(數據段),本地數據(堆棧)還是動態分配的數據(堆)。 有不同的分配方式。

但是在討論之前,您需要做的第一件事就是確定struct實例的布局。 至少可以是:

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

是否要讓實例實際保留大小字段取決於您。 使用這種方法,您只需添加原型即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM