2014-06-23 22 views
1

我目前正試圖乘以兩個浮點數,一個來自浮點矢量(存儲在ebx中的地址)和我存儲在ecx中的值。如何在x86程序集中移動兩個浮點數的結果?

我已經確認輸入值是正確的,但是,如果我乘以32和1,例如,EAX中的值更改爲00000000,EDX中的值更改爲105F0000。根據我對MUL的理解,發生這種情況是因爲它將結果的高位存儲在EDX中,而將低位的結果存儲在EDX中。問題是,如何將結果移動到輸出變量(returnValue)?這是有問題的代碼片段:

AddColumnsIteration: 
    cmp esi, 4 // If we finished storing the data 
    jge NextColumn // Move to the next column 
    mov eax, [ebx][esi * SIZEOF_INT] // Get the current column 
    mul ecx // Multiply it by tx 
    add [returnValue][esi * SIZEOF_INT], eax // Add the data pointed at by eax to the running total 
    inc esi // Element x, y, z, or w of a Vec4 
    jmp AddColumnsIteration // Go back to check our loop condition 

我知道,如果我使用的x87指令或SSE指令,這將是更加的簡單訂單,但問題的約束要求的純x86彙編代碼。對不起,如果這似乎有點基本,但我仍然在學習裝配的特質。

預先感謝您的幫助,並有一個愉快的一天

+0

我不知道是什麼導致了負面評價 –

+1

首先檢查你的代碼是否工作!mul似乎缺少一個操作數。對於輸出,你的C++環境是如何需要它的?你也可能有一個輸出地址,或者如果操作是「* =」 ,然後覆蓋舊的vect或與重新調整的一個。 – user877329

+0

MUL不是任務操作數,它取任何你給它的值,並將存儲在EAX中的值乘以它。什麼是浮點值的編碼或解碼(正如我所說,我是彙編的新手)?結果輸出到Vec4中,只是一個帶有4個浮點的結構,全部初始化爲零。所以基本上,代碼將4x4矩陣乘以4x1向量並將其存儲在Vec4輸出中。 –

回答

5

你乘以浮點數的表示爲整數,而不是浮點數自己:

1.0 = 0x3f800000 
32.0 = 0x42000000 

     0x3f800000 * 0x42000000 = 0x105f000000000000 

要實際進行浮點運算,需要執行以下操作之一:

  • 使用x87。
  • 使用SSE。
  • 編寫自己的軟件乘法運算,將編碼分隔爲符號位,指數位和有效位,用符號位來表示產品的符號位,添加指數並調整偏差以獲得乘積的指數,乘以有意義的和圓的來獲得產品的有效性,然後組裝它們來產生結果。

顯然,前兩種方案要簡單得多,但它聽起來好像他們不是出於某種原因或其他選項(雖然我真的不能想象爲什麼不;的x87和SSE 「純x86彙編代碼「,因爲他們現在已經是ISA的一部分了)

+0

我沒有寫它作爲答案,因爲問題是關於如何返回矢量,但值得一票,因爲張貼是錯誤的。 x87在486DX下工作,所以對於x87,是純x86組件。 – user877329

+0

是啊;不幸的是,甚至談論如何存儲結果直到提問者成功計算要存儲的結果爲止是沒有意義的。 –