MIPS中是否有一种有效的方法将浮点数存储在动态分配的数组中?

时间:2019-04-08 01:46:02

标签: arrays floating-point mips

我正在尝试使用MIPS在动态数组中存储浮点数列表。该程序提示用户输入要输入的浮点数,然后在接收到输入时循环。

我知道如何使用整数,但是我很难使它与浮点数一起使用。这就是我现在所拥有的。

这将获取要输入的浮点数并相应地分配内存:

#get number of floats to be entered
li $v0, 5
syscall
move $t0, $v0      #t0 is number of floats

#allocate the memory required
sll $a0, $v0, 2
li $v0, 9
syscall

这是我收集花车的循环:

move $t1, $zero #idx for loop
move $t2, $v0 #t2 is address of dynamic memory

loop:
    bge $t1, $t0, done #idx check 

    li $v0, 4
    la $a0, prompt #prompt user input
    syscall

    # read in and store int
    li $v0, 6
    syscall
    sw $v0, 0($t2)

    addi $t1, $t1, 1   # ++idx
    addi $t2, $t2, 4   #add four to move to next memory location
    j loop

done:

对于任何输入的浮点数,此处的输出仅为0.0,而应该是用户输入的数字。我认为我一定把它们存储错了。有没有比这更好的引入花车的方法了?

2 个答案:

答案 0 :(得分:1)

浮点数和双精度数不在普通整数寄存器中。他们有自己的寄存器$f0..$f31

syscall 6(和syscall 7代表双打)以$f0(而不是$v0)返回其结果,而syscall 2syscall 3则显示float和double期望它们在$f12中的论点。

使用lwsw不能将操作数与浮点寄存器进行复制。您必须改用:

  • lwc1(将字加载到协处理器1)lwc1 ft, offset(base reg)
  • ldc1(将双倍加载到协处理器1)ldc1 ft, offset(base reg)
  • swc1(存储协处理器1的字)swc1 ft, offset(base reg)
  • sdc1(将双倍存储到协处理器1)sdc1 ft, offset(base reg)

因此您的代码应为:

move $t1, $zero #idx for loop
move $t2, $v0 #t2 is address of dynamic memory

loop:
    bge $t1, $t0, done #idx check 

    li $v0, 4
    la $a0, prompt #prompt user input
    syscall

    # read in and store floats
    li $v0, 6
    syscall
    swc1 $f0, 0($t2)  # read float is in $f0 

    addi $t1, $t1, 1   # ++idx
    addi $t2, $t2, 4   #add four to move to next memory location
    j loop

done:

答案 1 :(得分:1)

浮点值通常占用寄存器$ f0至$ f31,它们与$ 0(AKA $零)至$ 31(AKA $ ra)完全分开。

您可以使用lwc1 / swc1(用于单精度)和ldc1 / sdc1(用于双精度)指令来加载和存储那些浮点寄存器。这与使用lw / sw指令非常相似。

还要注意,浮点寄存器在传统MIPS处理器上是32位的,因此双精度值会占用相邻的寄存器(也就是说,在任何给定时间,浮点寄存器中的双精度值都不得超过16个) 。当使用ldc1 / sdc1(和任何浮点算术指令)进行双精度处理时,请指定偶数个($ f0,$ f2,...,$ f30)和下一个($ f1,$ f3 、.)。 ..,$ f31)隐式涉及。