我想将一个字符作为参数传递给MIPS中的一个函数。我是通过将字符存储到寄存器$ a0,使用jal移动到函数,然后使用lw将$ a0中的内容提取到单独的寄存器中来实现的吗?
如果有人能给我一个在MIPS中传递一两个论点的例子,我真的很感激。我已经找到了很多关于MIPS调用约定的信息,但没有找到任何简单而简洁的例子。
答案 0 :(得分:3)
无需使用lw
来提取内存中的单词。您只需在子例程中使用$a0
。
看看这个“print-char”函数的例子:
.text
main:
#save $ra on stack
addi $sp $sp -4
sw $fp 0($sp)
move $fp $sp
addi $sp $sp -4
sw $ra -4($fp)
#call sub-routine
addi $a0 $zero 'A'
jal printchar
#restore and shrink stack
lw $ra -4($fp)
lw $fp 0($fp)
addi $sp $sp 8
jr $ra
#prints a char and then a new line
printchar:
#call print-char syscall
addi $v0 $zero 11
syscall
addi $a0 $zero 10
syscall
jr $ra
如上所示,$a0
寄存器的值仅在子例程中使用,因为它返回在jal
之前给出的值。
还说明了调用子路由所需的堆栈的正确扩展和收缩。正如您将注意到的,子例程不执行此操作,因为它不调用子例程,因此不需要保存$ra
。如果要使用$s
寄存器,则子例程中也需要进行堆栈操作,因为MIPS调用约定将这些指定为调用者保存。
答案 1 :(得分:0)
一个非常简单的方法是将参数加载到临时寄存器中,然后使用:
move $a0,$t0
这样存储在临时寄存器中的参数将作为参数给出