Разве нельзя передавать поплавки через регистры $ 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, если ваша функция вызывает другую функцию.