簡體   English   中英

如何在MIPS中通過$ a0傳遞浮點數?

[英]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中編譯。

我在這里有三個問題:

  1. 根本不可能通過$a寄存器傳遞浮點數嗎?
  2. 我是否應該將庫設計為通過$sp傳遞參數(使用$sp比較混亂)?
  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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM