2016-12-08 9 views
1

このCコードを使用してMIPSで構造体を作成するにはどうすればよいですか?私は何かを書きましたが、それがどのように行われているかわかりません。バイナリ検索ツリーを作成しようとしていますが、構造体を作成する方法を理解できないようです。誰か助けてくださいMIPSバイナリ検索ツリー構造を作成する

struct BSTNode 
{ 
struct BSTNode *left; 
struct BSTNode *right; 
int val; 
}; 

このようにしますか?

node: 
subu $sp, $sp, 32 
sw $ra, 28($sp) 
sw $fp, 24($sp) 
sw $s0, 20($sp) 
sw $s1, 16($sp) 
sw $s2, 12($sp) 
sw $s3, 8($sp) 
addu $fp, $sp, 32 
# capture the parameters: 

addi $s0, $a0, 0 # $s0 = value 
addi $s1, $a1, 0 # $s1 = left 
addi $s2, $a2, 0 # $s2 = right 

li $a0, 12 # it needs 12 bytes for a new node. 
li $v0, 9 # sbrk is syscall 9. 
syscall 
addi $s3, $v0, 0 

beqz $s3, main_TESTCASE_ERR_MSG1 

sw $s0, 0($s3) # node->number = number 
sw $s1, 4($s3) # node->left = left 
sw $s2, 8($s3) # node->right = right 

move $v0, $s3 # put return value input into v0. 
# release the stack frame: 
lw $ra, 28($sp) # restore the Return Address. 
lw $fp, 24($sp) # restore the Frame Poinputer. 
lw $s0, 20($sp) # restore $s0. 
lw $s1, 16($sp) # restore $s1. 
lw $s2, 12($sp) # restore $s2. 
lw $s3, 8($sp) # restore $s3. 
addu $sp, $sp, 32 # restore the Stack Poinputer. 
jr $ra # return. 
## end of node 

答えて

1

基本的な構造コードは正しいです。あなたはあなたが[ベースレジスタからの固定配線されたオフセットで]持っているようにすることができます。

しかし、asmでは、構造体は通常 "等価"を使用して定義されます。これらは、カテゴリの下にあり、アセンブラに「何か」を実行するがコードを生成しないように指示するアセンブラディレクティブ(つまり、.textまたは.dataなど)に該当します。

これらは、Cの#defineまたはenumのasmに相当します。事実上、すべてのアセンブラには何らかの形があります。たとえば、いくつかのアーチ/アセンブラが使用されます。EQU

これらを使用すると、構造体内のオフセットを名前で参照できます。利点は以下のとおりです。

  1. それはドラッジ
  2. の一部が相殺間違っが誤って使用されているミスを防ぐことができます保存されます(コード内の例えば構造体のオフセットが指定したC構造体のオフセットと一致しません)
  3. コードを文書化して読みやすくします。

私はしばしば、C構造体をasmコードのトップコメントブロックとして含めます。等価物を使用する方法は次のとおりです。私はmarsspimの両方に同じ定義を含めました。どちらか一方を使用する[互換性がない]:

# C struct: 
# struct BSTNode { 
#  struct BSTNode *left; 
#  struct BSTNode *right; 
#  int val; 
# }; 

# BSTNode struct (if using mars) 
    .eqv left   0 
    .eqv right   4 
    .eqv val    8 
    .eqv sizeof_node  12 

# BSTNode struct (if using spim) 
    left   =  0 
    right   =  4 
    val    =  8 
    sizeof_node  =  12 

    # ... 

    li  $a0,sizeof_node   # number of bytes for new node 
    li  $v0,9     # sbrk is syscall 9. 
    syscall 
    addi $s3,$v0,0 

    beqz $s3,main_TESTCASE_ERR_MSG1 

    sw  $s0,val($s3)   # node->val = number 
    sw  $s1,left($s3)   # node->left = left 
    sw  $s2,right($s3)   # node->right = right 
関連する問題