我正在尝试使用 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 2
和syscall 3
则期望他们的参数在$f12
中。
或从浮点寄存器复制操作数不是使用 lw
和 sw
完成的。您必须改用:
-
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( 隐式涉及。