2016-12-08 50 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中,結構通常使用「equates」來定義。這些屬於彙編程序指令(即類似於.text.data)的類別,它告訴彙編程序「執行某些操作」但不生成代碼。

這些是C的#defineenum的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