[英]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.