MIPS如何将双值加载到寄存器中?

时间:2016-04-22 12:53:55

标签: mips

在mips程序集中有指令(addi)将整数值放入寄存器,我的问题是:

addi $t1,$zero,8.9 #MIPS ERROR

如果我想将一个double值放入MIPS的寄存器中,我必须使用哪个指令?

2 个答案:

答案 0 :(得分:4)

加载浮点即时的最简单方法是从内存中加载它们。

在数据部分中,您可以定义浮点常数,例如

.data
doubleValue: .double 123.456
floatValue: .float 123.456

然后使用pseudoinstructions l.s(用于浮点数)和l.d(用于双精度)将它们加载到浮点寄存器上。例如

.text
  l.s $f1, floatValue   # Loads constant 123.456 onto $f1
  l.d $f2, doubleValue  # Loads constant 123.456 onto $f2-$f3

或者,您可以将编码浮点数的immediates加载到通用寄存器中,然后使用mtc1 / mtc1.d将它们移动到浮点寄存器。在你必须编码浮点常数的意义上,这很棘手。

例如,假设您要将123.456加载到浮点寄存器上,您可以这样做:

  li $t1, 0x42f6e979  # 0x42f6e979 is the encoding for 123.456 single precision float
  mtc1 $t1, $f1       # move that float to $f1

如果您要将123.456加载到双精度数上,则会发出:

  li $t2, 0x1a9fbe77  # 0x405edd2f1a9fbe77 is the encoding for 123.456 double
  li $t3, 0x405edd2f
  mtc1.d $t2, $f2     # move that double to $f2-$f3

答案 1 :(得分:0)

它非常类似于编写操作数的搁浅方式。  第一个区别是应该使用$ f(操作数)而不是$ t(操作数)。

值不能作为立即值加载,必须在.data部分声明。

您使用的浮点寄存器应为偶数。

然后,当您加载浮点值时,操作码应为l.s

应使用add.d命令,因为这些是双值

例如添加10和2.5

.data 
    float1 : .float 2.5 # declaring the floating values
    float2 : .float 10.0 # declaring the floating values
.text 
 main :

 l.s $f0 , float1 # loading the floating values to regester
 l.s $f2 , float2 # loading the floating values to regester
 add.d $f4 , $f0 , $f2