我正在编写一个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中编译。
我在这里有三个问题:
$a
寄存器传递浮点数?$sp
传递参数(使用$sp
比较混乱)?答案 0 :(得分:3)
是否完全不可能通过$ a寄存器传递浮点数?
有可能。但是在MIPS中,由于历史原因,FP被视为协处理器,您必须使用特定指令在处理器和协处理器之间复制移动数据:MFC
(从协处理器移动)和MTC
(移至协处理器) )。 FP单元是协处理器1,相应的指令是mfc1
和mtc1
。
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。