如何使用此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
答案 0 :(得分:1)
您的基本结构代码是正确的。您可以按照[使用基址寄存器中的硬连线偏移]的方式进行操作。
但是,在asm中,结构通常使用" equates"来定义。这些属于汇编程序指令的类别(即.text
或.data
),它们告诉汇编程序执行某些操作"但不生成代码。
这些是C&#39 {s} #define
或enum
的asm等价物。事实上,所有装配商都有某种形式。例如,某些拱门/装配工使用EQU
这些允许您按名称引用结构中的偏移量。优点是:
我经常将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