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,而它应该是用户输入的数字。我想我一定是把它们放错了。有没有比这更好的方法来引入花车?

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

syscall 6(和双精度的syscall 7(在$f0(而不是$v0(中返回他们的结果,而打印浮点数和双精度的syscall 2syscall 3则期望他们的参数在$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:

点值通常占用寄存器$f 0 到 $f 31,这些寄存器与 $0(AKA $zero(到 $31(AKA $ra(完全分开。

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

另请注意,浮点寄存器在经典 MIPS 处理器上是 32 位的,因此双精度值占用相邻寄存器(也就是说,在任何给定时间,浮点寄存器中的双精度值不得超过 16 个(。当使用 ldc1/sdc1(以及任何浮点运算指令(进行双精度时,您可以指定偶数 ($f 0, $f 2, ..., $f 30(,下一个 ($f 1, $f 3, ..., $f 31( 隐式涉及。

相关内容

  • 没有找到相关文章

最新更新