我正在尝试使用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,而应该是用户输入的数字。我认为我一定把它们存储错了。有没有比这更好的引入花车的方法了?
答案 0 :(得分:1)
浮点数和双精度数不在普通整数寄存器中。他们有自己的寄存器$f0..$f31
。
syscall 6
(和syscall 7
代表双打)以$f0
(而不是$v0
)返回其结果,而syscall 2
和syscall 3
则显示float和double期望它们在$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:
答案 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)隐式涉及。