Function 传递参数:MIPS
我想将一个字符作为参数传递给MIPS中的函数。我是否将字符存储到寄存器$a0中,使用jal移动到函数,然后使用lw将$a0中的内容提取到单独的寄存器中Function 传递参数:MIPS,function,arguments,mips,Function,Arguments,Mips,我想将一个字符作为参数传递给MIPS中的函数。我是否将字符存储到寄存器$a0中,使用jal移动到函数,然后使用lw将$a0中的内容提取到单独的寄存器中 如果有人能给我举一个在MIPS中传递一两个论点的例子,我将非常感激。我找到了很多关于MIPS调用约定的信息,但没有任何简单简洁的示例。无需使用lw,它用于从内存中提取单词。您只需在子程序中使用$a0 请看“打印字符”函数的示例: .text main: #save $ra on stack addi $sp $sp -4
如果有人能给我举一个在MIPS中传递一两个论点的例子,我将非常感激。我找到了很多关于MIPS调用约定的信息,但没有任何简单简洁的示例。无需使用
lw
,它用于从内存中提取单词。您只需在子程序中使用$a0
请看“打印字符”函数的示例:
.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调用约定将这些寄存器指定为被调用方已保存,则子例程中还需要进行堆栈操作。一种非常简单的方法是将参数加载到临时寄存器中,然后使用:
move $a0,$t0
这样,存储在临时寄存器中的参数将作为参数给出为什么要对堆栈进行操作?它是必需的吗?@AsafFisher当调用子例程时,
$ra
的值必须存储在某个地方,因为jal
会覆盖它。这可以通过使用$s
寄存器来完成,但是我只是演示了通过操纵$sp
和$fp
在堆栈上保存$ra
的一般方法。那么为什么不只使用sp呢?为什么还要使用fp?@AsafFisher使用帧指针$fp
,允许在函数内的堆栈上进行动态分配。我听说,$fp
很少在手写汇编中使用,您当然可以省略它——在本例中没有必要。如果您必须传入大量参数,该怎么办?