2016-12-08 4 views
1

Как создать структуру в MIPS с помощью этого кода на C? Я что-то написал, но не знаю, как это делается. Я пытаюсь создать двоичное дерево поиска, но не могу понять, как создать структуру. Кто-то, пожалуйста, помогитеСоздать MIPS Binary Search Tree Struct

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 #define или enum. Практически все ассемблеры имеют такую ​​форму. Например, некоторые арки/сборщики используют EQU

Они позволяют ссылаться на смещения внутри структуры по имени. Преимущества:

  1. Это экономит некоторый Drudge
  2. Может предотвратить ошибки, когда неправильное смещение непреднамеренно используются (например, Struct смещение в вашем коде не совпадают смещения С структурой вы предоставили)
  3. Делает код немного более самодокументируемым и читаемым.

Я часто включаю структуру C как верхний блок комментариев в коде asm. Вот как использовать equates. Я включил равные определения как для mars, так и для spim. Использовать один или другой [поскольку они несовместимы]:

# 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