assembly 组件MIPS:无法调试浮点幂函数

cx6n0qe3  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(126)

我一直在尝试在汇编MIPS 32位中实现浮点函数,但我一直无法查明确切的错误。似乎是在穆尔.s $fd,$fsrc1,$fsrc2命令中,因为特定浮点寄存器的内容保持不变(我也用syscalls检查过,打印了每种情况下的内容),但我似乎找不到修复方法。有人有什么想法吗?下面是完整的代码:

.align 2
.data
number: .float 0.5

.text
.globl main

main:

li $a0, 3
l.s $f12, number

jal power
li $v0, 2
mtc1 $a0, $f0
syscall

li $v0, 17
syscall

power:
#Build stack
    subu $sp,$sp,56     # Stack frame is 56 bytes long
    sw $a0, 12($sp)     # Save Argument 0 ($a0)
    swc1 $f12, 8($sp)   # Save Argument 1 ($a1) (integer arg)
    
    sw $s0, 56($sp)     # Save $s0
    sw $s1, 52($sp)     # Save $s1
    swc1 $f20, 48($sp)  # Save $f20
    swc1 $f21, 44($sp)  # Save $f21
    
    sw $ra, 16($sp)     # Save return address
    sw $fp, 20($sp)     # Save frame pointer
    
    addiu $fp, $sp, 52

#-----------------------------------------------------------------------#
    move $s0, $a0       #stores value of n
    mov.s $f22, $f12    #stores value of x
    li $s1, 0           #initialize counter with 0
    
    powerLoop:
    mul.s $f20, $f20, $f20          #y=y*y
    addi $s1, $s1, 1                #increase counter
    bgtu $s0, $s1, powerLoop        #continue loop as long as counter<n
    
    mov.s $f0, $f20             #return the results     

#-----------------------------------------------------------------------#   
#Pop stack
    lw $a0, 12($sp)     #Load back $a0
    lwc1 $f12, 8($sp)   #Load back $f12
    lw $s0, 56($sp)     # Load $s0
    lw $s1, 52($sp)     # Load $s1
    lwc1 $f20, 48($sp)  # Load $f20
    lwc1 $f21, 44($sp)  # Load $f21
    lw $ra, 16($sp)     # Restore old value of $ra
    lw $fp, 20($sp)     # Restore old value of $fp
    addiu $sp, $sp, 56  # Pop stack
jr $ra
mzmfm0qo

mzmfm0qo1#

已解决:
尽管寄存器中存在一些错误,但主要错误在

li $v0, 2
mtc1 $a0, $f0
syscall

修复:

li $v0, 2
mov.s $f12, $f0
syscall

原因:由于惯例,$f12始终是浮点参数,即使是系统调用也是如此。它不会打印$a0的内容,而是打印$f12!

相关问题