[英]How can I pass floating point numbers through $a0 in MIPS?
我正在編寫一個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
比較混亂)? 根本不可能通過$ 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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.