Assembly MIPS打印浮点系统调用仅打印零

Assembly MIPS打印浮点系统调用仅打印零,assembly,mips,mips32,qtspim,Assembly,Mips,Mips32,Qtspim,我有一个非常不寻常的问题,我想不出来,也找不到解决办法 我已经编写了一段代码,用于在MIPS中计算浮点数的幂。该算法工作正常,但最终当syscall应该打印返回值时,它只打印0 下面是用于打印返回值的代码,对我来说似乎很好,我不知道出了什么问题 mov.s $f12, $f31 li $v0, 2 syscall 我试着在qtSpim中调试代码,一切似乎都很好,甚至在syscall时受尊重的寄存器中的值都是正确的 样本输出: 打印结果时FP寄存器: 寄存器中的值似乎很好, 4*4=十进制中的

我有一个非常不寻常的问题,我想不出来,也找不到解决办法

我已经编写了一段代码,用于在MIPS中计算浮点数的幂。该算法工作正常,但最终当syscall应该打印返回值时,它只打印0

下面是用于打印返回值的代码,对我来说似乎很好,我不知道出了什么问题

mov.s $f12, $f31
li $v0, 2
syscall
我试着在qtSpim中调试代码,一切似乎都很好,甚至在syscall时受尊重的寄存器中的值都是正确的

样本输出:

打印结果时FP寄存器: 寄存器中的值似乎很好, 4*4=十进制中的“16”或十六进制中的“10”

完整代码:
您应该对代码进行注释,特别是如果您希望他人提供帮助的话。还不清楚您在某些地方试图做什么,以及您使用特定寄存器的目的是什么。此外,如果您确实有这些寄存器值,那么结果应该正确打印

例如:

mtc1 $t0, $f10
add.s $f12,$f12,$f10 # let $f12 = x;
我想你希望
$t0
在任何地方都是零(事实并非如此),但即使这样,也没有意义,你只需将零添加到
$f12
。为什么?

li $t1, 1
mtc1 $t1, $f11
add.s $f31, $f10, $f11 # f31=r=1;
这不会将
$f11
设置为
1
,因为您没有将其从int转换为float。另外,如果您仍然假设
$f10
为零(它不是以零开始的),那么为什么不直接加载到
$f31

我已经把它清理了一点,这似乎是正确的:

.text
main:
    addi $v0,$zero,4
    la $a0,enter
    syscall

    li $v0, 6
    syscall

    mov.s $f31,$f0

    addi $v0,$zero,4
    la $a0,enter_2
    syscall

    li $v0, 5
    syscall

    add.s $f12,$f31,$f10 # $a0 = x
    addu $a0,$v0,$zero # $a1 = n

    jal exp
    mov.s $f31, $f0  #Save returned value

    addi $v0,$zero,4
    la $a0,result
    syscall

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

    addi $v0,$zero,4
    la $a0,end
    syscall

    addi $v0,$zero,10
    syscall

exp:
    addu $s1,$a0,$0 # let $s1 = n

    li $t1, 1
    mtc1 $t1, $f0
    cvt.s.w $f0, $f0       # f0=1, the result

while:
    and $t3, $s1, $t1
    bne $t3, $t1, not_set
    mul.s $f0, $f0, $f12   # include this power
not_set:
    mul.s $f12, $f12, $f12 # next power
    srl $s1, $s1, $t1
    bne $s1, $zero, while
    jr $ra

.data

enter: .asciiz "\nPlease enter a number : "
enter_2: .asciiz "\nPlease enter an exponent : "
result: .asciiz "\nResult : "
end: .asciiz "\n\nThe End :)"

为什么您使用
$t0
时没有将其初始化为任何内容?另外,您在
mtc1
之后直接添加
add.s
而没有任何
cvt.s.w
的事实看起来很可疑。@Michael,我打算使用$0而不是$t0。我已经改变了它,相应的cvt.s.w也改变了。我没有得到的是结果存储在$f12中,但仍然没有printed@Michael哇,加上适当的cvt.s.w陈述有效。非常感谢!我承认我愚蠢地使用了$t0(我本来打算添加$0,完全没有意义),并为糟糕的评论道歉。将整数转换为浮点实际上是个问题。非常感谢,它成功了。
.text
main:
    addi $v0,$zero,4
    la $a0,enter
    syscall

    li $v0, 6
    syscall

    mov.s $f31,$f0

    addi $v0,$zero,4
    la $a0,enter_2
    syscall

    li $v0, 5
    syscall

    add.s $f12,$f31,$f10 # $a0 = x
    addu $a0,$v0,$zero # $a1 = n

    jal exp
    mov.s $f31, $f0  #Save returned value

    addi $v0,$zero,4
    la $a0,result
    syscall

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

    addi $v0,$zero,4
    la $a0,end
    syscall

    addi $v0,$zero,10
    syscall

exp:
    addu $s1,$a0,$0 # let $s1 = n

    li $t1, 1
    mtc1 $t1, $f0
    cvt.s.w $f0, $f0       # f0=1, the result

while:
    and $t3, $s1, $t1
    bne $t3, $t1, not_set
    mul.s $f0, $f0, $f12   # include this power
not_set:
    mul.s $f12, $f12, $f12 # next power
    srl $s1, $s1, $t1
    bne $s1, $zero, while
    jr $ra

.data

enter: .asciiz "\nPlease enter a number : "
enter_2: .asciiz "\nPlease enter an exponent : "
result: .asciiz "\nResult : "
end: .asciiz "\n\nThe End :)"