2012-04-20 19 views
1
typedef struct node {  
    int data;  
    struct node *next;  
} nodeL; 

上記の宣言をMIPSアセンブリ言語で翻訳したいと仮定して、どうすればよいでしょうか? .textセグメントで行われるメモリの割り当て(syscall 9を使用)とは別に、.dataセグメントについてはどうでしょうか? また、アライメントについてはどうですか?MARS MIPSおよび構造体ノード

+2

そして最も重要なのは、**あなたは何を試しましたか?** – hochl

+0

私は最初にCで書いたように、コード自体はかなり準備が整っています(またはそう思われます)。そしてMIPSアセンブリ言語で翻訳しました。しかし、**ランタイム例外が0x00400080にあります:ストアアドレスがワード境界0x00000001 **に揃えられていません。 – markloop

+0

これでテキストセグメントで何ができるのですか?単なるデータ構造です。 – byrondrossos

答えて

2

コードを記述する前に、作成する構造体が静的データ(データセグメント)、ローカルデータ(スタック)、または動的に割り当てられたデータ(ヒープ)かどうかを明確にする必要があります。それぞれを割り当てるにはさまざまな方法があります。

しかし、最初に行う必要があることは、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 

実際にサイズフィールドを保持するかどうかはあなた次第です。このアプローチでは、プロトタイプを追加するだけで済みます。

+0

intの代わりに、例えばdoubleがあったらどうなりますか? – Korpel

+0

1バイトを使用する代わりに、データを割り当てるときに2を使用します。データ型は、言語レベルで作成された抽象です。 – blackcompe

関連する問題