传递参数:MIPS

Vic*_*ell 5 arguments function mips

我想将一个字符作为参数传递给 MIPS 中的函数。我是否通过将字符存储到寄存器 $a0 中,使用 jal 移动到该函数,然后使用 lw 将 $a0 中的内容提取到单独的寄存器中来做到这一点?

如果有人能给我一个在 MIPS 中传递一两个参数的例子,我真的很感激。我找到了很多关于 MIPS 调用约定的信息,但没有找到任何简单明了的例子。

Kon*_*ach 4

无需使用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 调用约定将这些寄存器指定为被调用者保存的。