创建MIPS二进制搜索树结构

时间:2016-12-08 00:59:57

标签: mips

如何使用此C代码在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 个答案:

答案 0 :(得分:1)

您的基本结构代码是正确的。您可以按照[使用基址寄存器中的硬连线偏移]的方式进行操作。

但是,在asm中,结构通常使用" equates"来定义。这些属于汇编程序指令的类别(即.text.data),它们告诉汇编程序执行某些操作"但不生成代码。

这些是C&#39 {s} #defineenum的asm等价物。事实上,所有装配商都有某种形式。例如,某些拱门/装配工使用EQU

这些允许您按名称引用结构中的偏移量。优点是:

  1. 它节省了一些苦差事
  2. 可以防止无意中使用错误偏移的错误(例如,代码中的结构偏移不会与您提供的C结构的偏移相匹配)
  3. 使代码更自我记录和可读。
  4. 我经常将C结构作为asm代码中的顶级注释块。以下是如何使用equates。我已经包含了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