2015-10-06 29 views
0

林試圖做muladd與兩個數(MASM 32位彙編),即它的結果將是大然後是32位。
但問題是,我不知道如何存儲結果。例如,如何把MUL 的結果添加更大然後DWORD在一個雙字寄存器或陣列(MASM)

例如,mul指令將結果放在eax(32位寄存器),但如果我想將2個數相乘,結果會大於32位,則該值在eax中壓縮,沒有真正的結果。並加上同樣的問題..

所以,我做了一個muladd兩個數字,結果是大於32位?我想創建一個數組,添加一個循環(如果我的數字是100,那麼循環將會是100次,並且在我將數字添加到它自己內部),並將數字存儲在數組中,因此該值將在陣列的所有點差,但2個問題:

  1. 當我做:mov ebx,offset arr然後mov [ebx],result
    結果不塗抹在所有陣列的,其壓縮在第一個DWORD細胞(結果 - 是mul或add的結果,arr是用於存儲結果的dword的數組)

  2. 我不知道陣列的長度Ë是,我不希望把一個大數目白白..

所以,我做MUL或兩個數字的是它的結果是更大然後32位,並存儲該導致某處,而不是在32位大小的壓縮?

謝謝!

回答

1

閱讀documentation for mul。輸出在寄存器對EDX:EAX

至於加法,你最多隻有一位溢出,它存儲在進位位中。

您可以通過分別讀取高位和低位字,然後使用兩者來計算64位數。例如,添加64位數字:

;assume eax holds low value of one pair and edx holds high value of the same pair 
add eax, [low_word_of_other_pair] 
adc edx, [high_word_of_other_pair] 
;register pair EDX:EAX now holds sum of addition 

adc指令增加了另一個值以及進位值。

+0

嘿,從我的理解來看,最大的結果是64位大小。但我的程序需要顯示任何結果,甚至比64位大。所以如果結果大於64位,並且進位位打開,那麼我該如何處理這些信息呢?它不能幫助我,因爲我需要mul的確切結果。 (也許我不明白你的意思嗎?你可以舉一個例子來說明如何放入數組或者註冊2個數的乘法結果,甚至大於64位?)謝謝! –

+0

哦,等等,你製作的兩行代碼正在處理任何結果?甚至比64位更大?我所理解的是,你將'eax'作爲結果的一部分,並且'edx'結果的第二部分+攜帶標誌的結果的其餘部分保持不變?你可以再解釋我,因爲我有點困惑你在那裏做了什麼......再次感謝:) –

+0

@RoyKuper - 如果你想要超過64位產品,你必須自己實現乘法。就像你在學校做的那樣做。至於加法,'adc'指令允許你鏈接任意數量的加法,所以你可以根據需要添加(或減去,使用'sbb')儘可能多的「部分」。只需添加更多'adc'說明! – owacoder

相關問題