在MIPS中有一种有效的方法可以在动态分配的数组中存储浮点数吗?

问题描述 投票:0回答:2

我正在尝试使用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,应该是用户输入的数字。我想我必须把它们存放错误。有没有比这更好的方法来引入花车?

arrays floating-point mips
2个回答
1
投票

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

syscall 6(和双打的syscall 7)在$f0(不是$v0)中返回他们的结果,而打印浮动和双打的syscall 2syscall 3期待他们在$f12的论点。

使用lwand sw无法在浮点寄存器中复制操作数。你必须使用:

  • lwc1(加载Word到协处理器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
投票

浮点值通常占用寄存器$ f0到$ f31,这些寄存器完全独立于$ 0(AKA $ 0)到$ 31(AKA $ ra)。

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

另请注意,浮点寄存器在经典MIPS处理器上为32位,因此双精度值占用相邻寄存器(即,在任何给定时间,浮点寄存器中可能不超过16个双精度值)。当使用ldc1 / sdc1(和任何浮点算术指令)进行双精度时,你指定偶数编号($ f0,$ f2,...,$ f30)和下一个($ f1,$ f3 ,. ..,$ f31)含蓄地涉及。

© www.soinside.com 2019 - 2024. All rights reserved.