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

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

4

1 に答える 1

5

コードについて言及する前に、作成する構造体が静的データ (データ セグメント)、ローカル データ (スタック)、または動的に割り当てられたデータ (ヒープ) のいずれになるかを明確にする必要があります。それぞれに分け方があります。

しかし、それについて説明する前に、最初に行う必要があるのは、構造体インスタンスのレイアウトを決定することです。少なくとも次のようになります。

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

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

于 2012-04-20T23:22:17.973 に答える