typedef struct node {
int data;
struct node *next;
} nodeL;
上記の宣言をMIPSアセンブリ言語で翻訳したいと仮定して、どうすればよいでしょうか? .textセグメントで行われるメモリの割り当て(syscall 9を使用)とは別に、.dataセグメントについてはどうでしょうか? また、アライメントについてはどうですか?MARS MIPSおよび構造体ノード
typedef struct node {
int data;
struct node *next;
} nodeL;
上記の宣言をMIPSアセンブリ言語で翻訳したいと仮定して、どうすればよいでしょうか? .textセグメントで行われるメモリの割り当て(syscall 9を使用)とは別に、.dataセグメントについてはどうでしょうか? また、アライメントについてはどうですか?MARS MIPSおよび構造体ノード
コードを記述する前に、作成する構造体が静的データ(データセグメント)、ローカルデータ(スタック)、または動的に割り当てられたデータ(ヒープ)かどうかを明確にする必要があります。それぞれを割り当てるにはさまざまな方法があります。
しかし、最初に行う必要があることは、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
実際にサイズフィールドを保持するかどうかはあなた次第です。このアプローチでは、プロトタイプを追加するだけで済みます。
intの代わりに、例えばdoubleがあったらどうなりますか? – Korpel
1バイトを使用する代わりに、データを割り当てるときに2を使用します。データ型は、言語レベルで作成された抽象です。 – blackcompe
そして最も重要なのは、**あなたは何を試しましたか?** – hochl
私は最初にCで書いたように、コード自体はかなり準備が整っています(またはそう思われます)。そしてMIPSアセンブリ言語で翻訳しました。しかし、**ランタイム例外が0x00400080にあります:ストアアドレスがワード境界0x00000001 **に揃えられていません。 – markloop
これでテキストセグメントで何ができるのですか?単なるデータ構造です。 – byrondrossos