【问题标题】:MIPS print float syscall only prints zeroMIPS 打印浮点系统调用仅打印零
【发布时间】:2015-11-28 11:32:41
【问题描述】:

我有一个非常不寻常的问题,我无法弄清楚,也无法在任何地方找到解决方案。

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

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

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

我尝试在 qtSpim 中调试代码,一切似乎都运行良好,即使相关寄存器中的值在系统调用时也是正确的。

样本输出:

打印结果时FP注册:

寄存器中的值似乎没问题, 4 * 4 = 十进制的“16”或十六进制的“10”。

完整代码:

.text
main:

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

li $v0, 6
syscall

mtc1 $t0, $f10
add.s $f31,$f0,$f10

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

li $v0, 5
syscall

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

jal exp
mtc1 $t0, $f10
add.s $f31, $f0, $f10 #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:
mtc1 $t0, $f10
add.s $f12,$f12,$f10 # let $f12 = x;
addu $s1,$a0,$0 # let $s1 = n

li $t1, 1
mtc1 $t1, $f11
add.s $f31, $f10, $f11 # f31=r=1;
add.s $f1, $f12, $f10 # f1=p=s0;

while:
and $t3, $s1, $t1
bne $t3,$t1,if_1
mul.s $f31, $f31, $f1
if_1:
srl $s1, $s1, $t1
bne $s1, $zero, if_2
add.s $f0, $f31,$f10
jr $ra
if_2:
mul.s $f1,$f1,$f1
j 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 但仍未打印
  • @Michael,哇,添加适当的 cvt.s.w 语句有效。非常感谢!

标签: assembly mips mips32 qtspim


【解决方案1】:

您应该注释您的代码,特别是如果您希望其他人提供帮助。目前尚不清楚您要在某些地方做什么,以及您使用特定寄存器的目的是什么。另外,如果你真的有那些寄存器值,结果应该打印正确。

例子:

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(我打算在其中添加 $0,完全没有意义)并为可怜的 cmets 道歉。整数到浮点数的转换实际上是问题所在。非常感谢,成功了。
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
相关资源
最近更新 更多