2013-10-21 247 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

(現在,試着想象我的驚喜,這實際上工作!)

相關問題