我正在嘗試撰寫一個程式,但是我不明白為什么我無法找出為什么我不斷收到此錯誤“Odd FP register number”,我知道它是來自 main 中的雙倍負載,但我不知道如何解決它
#Interest Calculator
.data
STR_PRINCIPAL_INPUT: .asciiz "Enter the principal in $ (100 - 1,000,000.00): "
STR_INVALID_PRINCIPAL: .asciiz "The entered Principal is invalid."
HUNDRED: .float 100.00
NEW_LINE: .asciiz "\n"
.text
.globl main
main:
l.d $f2, HUNDRED
principal_input:
li $v0, 4 # system call no. 4
la $a0, STR_PRINCIPAL_INPUT # point to the message
syscall
li $v0, 5 # system call no. 6
syscall
c.eq.d $f1, $f0
bc1t invalid_principal_input
invalid_principal_input:
li $v0, 4 # system call no. 4
la $a0, STR_INVALID_PRINCIPAL # point to the message
syscall
uj5u.com熱心網友回復:
MIPS 有 32 個浮點暫存器,但它們每個只有 32 位寬。每個暫存器單獨可以保存一個單精度浮點數。
但是,雙精度資料型別需要 64 位。因此,當您使用雙精度時,它會占用 2 個浮點暫存器——例如,$f0 和 $f1 對來存盤一個 64 位雙精度值。對于雙精度,實際上只有 16 個暫存器。
然后,MIPS 也有一條規則,即您不能使用奇數暫存器來制作暫存器對來保存雙精度數,這是硬體必須使硬體更簡單的規則。將 1 加到偶數暫存器號意味著只需翻轉低位,而將 1 加到奇數暫存器號則需要 5 位加法器。此外,這條規則幾乎沒有施加運行時懲罰——很難創建一個這種限制會影響性能的程式。所以,唯一的缺點是那些學習組裝的人。
簡而言之:對雙精度數使用偶數暫存器,并避免使用隨后的奇數暫存器編號,因為它也用于雙精度數。
我建議在某些編程任務中堅持使用偶數暫存器——有時單浮點數不能提供足夠的精度,我們希望將該代碼加倍以查看是否有幫助——如果你不這樣做,將代碼從使用單數轉換為使用雙精度會更簡單也不必更改注冊號碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495915.html
