typedef struct node {
int data;
struct node *next;
} nodeL;
上記の宣言を MIPS アセンブリ言語で翻訳したい場合、どのようにすればよいでしょうか? .text セグメントで行われるメモリの割り当て (syscall 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 バイトを割り当てます。
よりクリーンな方法は、プロトタイプベースの方法を使用することです。
オブジェクトのレイアウトは次のようになります。
------------------
| 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
インスタンスが実際にサイズ フィールドを保持するかどうかは、あなた次第です。このアプローチを使用すると、プロトタイプを追加するだけで済みます。