2013-10-21 248 views
0

我真的很难搞清楚如何解决这个问题。我得到,我想要采取整数和分数的二进制表示,将它们合并为尾数,并将符号位分配给开始,但我不知道如何在MIPS中实际实现它。MIPS - 如何将一组整数转换为单精度浮点数

任何人都可以帮助我至少开始?

假设您的MIPS硬件没有浮点寄存器和浮点ALU。如果您想要执行浮点数加法,您将不得不使用整数寄存器($ 0 - $ 31)和整数ALU来完成工作的MIPS整数指令。在此作业问题中,您将编写MIPS代码(仅使用整数指令和整数寄存器)来实现 过程,以添加两个浮点数并编写一个调用该过程的主函数。

  1. 写MIPS程序toFloat把一个浮点数为IEEE单精度格式。 该过程需要三个整数作为输入:$ a0,$ a1,$ a2,以这种方式表示浮点数 :如果$ a0包含0,则浮点数为正,否则如果$ a0包含1 , 浮点数是负数。存储在寄存器$ a1中的数字是浮点数 的整数部分,存储在寄存器$ a2中的数字是浮点数 的小数部分。例如,要显示浮点数-5.25,三个输入寄存器应包含 这些数字:$ a0 = 1,$ a1 = 5和$ a2 = 25. 对于小数部分,您可以使用指令将25除以100。分数将存储在HI寄存器中,您可以使用mfhi指令来检索分数。 该过程将返回v0,其中包含与由三个输入数字表示的 浮点数对应的IEEE单精度模式。 一旦你有这个程序,你可以用它来将输入数字2.5和7.5转换成它们的IEEE单精度格式的 。

  2. 编写一个MIPS程序printFloat打印一个IEEE单精度格式的数字。 该过程的输入是$ a0,这是一个IEEE单精度格式的数字。 程序将简单地打印存储在$ a0中的位模式。您可以使用循环打印每一位。 一旦你有了这个程序,你就可以用它来以浮点格式打印输入数字2.57.5

  3. 写一个MIPS程序来实现主函数来调用你的程序。在这个程序中,你将会调用

    to浮点(0,2,5)产生浮点格式为2.5;

    toFloat(0,7,5)生成7.5的浮点格式;

    printFloat to print 2。5

    printFloat打印7.5

下面是我到目前为止的代码:

http://s7.postimg.org/v39ufikaj/code.png

+0

“刚刚帮我开始”走多远?我可以建议使用“sll $ t0,$ a0,31”将符号位移动到正确位置做“或者$ t1,$ t1,$ t0” - 或者您需要一个更类似于“什么是向左移位并按位或?“ – RobertB

+0

这绝对有帮助。所以很明显,我们将符号位置移动到第一位,但我对如何从这些值确定指数和尾数感到困惑。 – Nimbus

+0

对于代码片段,您可能会有更多的运气发布到https://gist.github.com/ - 从.png图像读取汇编代码有点太痛苦! – RobertB

回答

0

好吧,第一步(如在评论中所指出)是花费一些质量时间与显示位的转换器,像这里:binaryconvert.com floating point converter

然后,容易的部分是取$ a0并将位0转储到我们结果的位1。例如:

add $v0, $zero, $zero # initialize our result 
sll $t0, $a0, 31 # shift the lsb to the msb 
or $v0, $v0, $t0 # set the sign bit in the result 

但现在我们必须做数学。我希望$ a1是一个整数部分,$ a2是一个二进制的小数部分。但它不是那样的......他们说$ a1是整数(仍然是二进制的整数),但$ a2实际上是美分。 (如果25/100 = 0.25十进制,则$ a2包含美分。)

这里是我变得困惑的地方,我自己。这些指令说“使用div指令将25除以100.这个小数部分将存储在HI寄存器中”。但是当我读到divMIPS Instruction Reference)时,它表示它将$ LO中的商数和余数置于$ HI中。因此,将25除以100将会给你... 25.这是一个放弃大于100的数值的好方法,但它不会让我们得到数字的二进制分数表示。实际上,我只是花了一整课加午餐试图找出一个优雅的方式来取0到99之间的一个数字,除以100,然后将结果转换为二进制而不使用FPU。我快到了。所以我会让你问问那个部分的教授。但是,一旦我们在$ a1中有整数部分,并且一个1和0的字符串表示小数部分(让我们把它放在$ s2中),我们只需要对它进行归一化。我们在$a1有一个号码。 $s2,我们需要它是这种格式:

1.nnnnnnn 

...在这里我们用1开始,然后小数部分然而,许多二进制数字。

下面是一些可能工作的伪代码。

  • 将$ a1左移直到msb为“1”。以$ t0存储班次数。 (注意:假设整数部分不为零)
  • (31 - $ t0)给出指数。通过偏置进行调整,填入浮点结果的位30-23。
  • $ t0也告诉你你有多少空间用于小数位。将$ s2移位一个适当的数量(取决于它的编码方式),然后or它填充$ a1的最低有效位
  • Shift $ a1左移一位,因为前导的“1”被丢弃在IEEE FP
  • 东西$ A1顶部23位转换成位浮点结果22-0

让我们来看看,在一个示例工作。 $ a1具有0x0000C000的整数部分,和$ S2具有以某种方式被装入0.75(1×2^-1 + 1×2^-2)

$a1: 0000 0000 0000 0000 1100 0000 0000 0000 
$s2: 1100 0000 0000 0000 0000 0000 0000 0000 

我必须转移$ A1 16倍:

$a1: 1100 0000 0000 0000 0000 0000 0000 0000 

这应该给我一个31 - 16 = 15的指数。添加127的偏差,我得到142(0x8E)。这在指数部分。

我需要右相同的量(16)到移位$ S2,

$s2: 0000 0000 0000 0000 1100 0000 0000 0000 

or那些一起:

$a1: 1100 0000 0000 0000 1100 0000 0000 0000 

可视化带小数点:

original: 1100 0000 0000 0000.1100 0000 0000 0000 
normaliz: 1.100 0000 0000 0000 1100 0000 0000 0000 

因为我们省略了小数点左边隐含的'1',所以将其移出并且我们有:

$a1: 100 0000 0000 0000 1100 0000 0000 0000 0 

取23位。所以,如果我有这个权利,高于转换应该说49152.75店在IEEE FP为:

01000111 01000000 00000000 11000000 

注册= 0

指数= 10001110(为0x8E)

尾数= 1000 0000 0000 0001 1000 000

(现在,试着想象我的惊喜,这实际上工作!)

相关问题