Function 传递参数:MIPS

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中的函数。我是否将字符存储到寄存器$a0中,使用jal移动到函数,然后使用lw将$a0中的内容提取到单独的寄存器中


如果有人能给我举一个在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
很少在手写汇编中使用,您当然可以省略它——在本例中没有必要。如果您必须传入大量参数,该怎么办?