如何在MIPS中通过$ a0传递浮点数?

时间:2019-03-28 22:22:17

标签: assembly mips subroutine

我正在编写一个MIPS库,其中打算将所有参数通过$aX寄存器传递,并通过$vX寄存器返回所有值。

我编写了以下函数:

# PrintFloat - prints a float
# arguments:
#   $a0 = arress of the float
# return value:
#   n/a
PrintFloat: 
    move $f12, $a0
    li $v0, 2
    syscall
    # return 
    jr $ra 

此功能未在MARS中编译。

我在这里有三个问题:

  1. 是否完全无法通过$a寄存器传递浮点数?
  2. 我是否应该将库设计为通过$sp传递参数(使用$sp比较混乱)?
  3. 我是否需要在每个这样的琐碎函数中创建堆栈框架,以使其成为非叶子安全的?

1 个答案:

答案 0 :(得分:3)

  

是否完全不可能通过$ a寄存器传递浮点数?

有可能。但是在MIPS中,由于历史原因,FP被视为协处理器,您必须使用特定指令在处理器和协处理器之间复制移动数据:MFC(从协处理器移动)和MTC(移至协处理器) )。 FP单元是协处理器1,相应的指令是mfc1mtc1

mfc1 rt, fs  # copy data from fp register fs to gp register rt

要复制到fp寄存器,请使用mtc1

mtc1 rs, ft  # copy data from gp register rs to fp register ft

所以您只需要使用

mfc1 $a0, $f12

将$ f12放入$ a0。

  

我是否应该将库设计为通过$ sp传递参数(使用$ sp比较混乱)?

不,它没有用,除非您有大量参数。

  

我是否需要在每个这样的琐碎函数中创建堆栈框架,以使其安全无虞?

不。但是,如果您需要将寄存器保存在调用者或被调用者中,则当然需要堆栈帧。如果您的函数调用另一个函数,则可以节省$ ra。