无需使用lwwhich来从记忆中提取单词。$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
Run Code Online (Sandbox Code Playgroud)
如图所示,寄存器的值$a0 仅在子例程中使用,因为它返回在jal.
还演示了调用子路由所必需的堆栈的适当扩展和收缩。您将注意到,子例程不执行此操作,因为它不调用子例程,因此不需要保存$ra. 如果要使用寄存器,则子例程中也需要堆栈操作,因为$sMIPS 调用约定将这些寄存器指定为被调用者保存的。