传递参数:MIPS

时间:2014-02-13 00:49:59

标签: function arguments mips

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

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

2 个答案:

答案 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

这样存储在临时寄存器中的参数将作为参数给出