2013-03-02 15 views
0

如何使用大數字?像3441881739,30000000等如何使用大數字?

mov eax,3441881739 

在這種情況下,eax值是一個負數。如何解決它?拆分它?怎麼樣? 我還需要添加/ sub/mul/div等cmp操作。

有人可以解釋並給出一個例子如何做到這一點?

我標記爲fasmnasm標籤,但其他組件也歡迎。 我在32位機器上。

+0

除非你在談論[多精度算術(HTTP:// EN .wikipedia.org/wiki/Arbitrary-precision_arithmetic),*符號*由指令解釋。在2的補碼運算中,'add/adc','sub/sbb'是相同的操作,而'imul/mul','idiv/div'的操作不同。 – 2013-03-02 03:31:25

+1

@BrettHale:不,add和adc是*不同*('sub'與'sbb'不一樣)。無論您是處理正數還是負數(或組合),並且與子處理相同,add都是一樣的,但是'add'和'sub'忽略進位位,其中'adc'和'sbb'沒有。 – 2013-03-02 03:37:38

+0

@JerryCoffin - 我剛剛意識到我的評論措辭不妙。我的意思是,'add/adc'對於假設的'符號'位不會有不同的表現。 – 2013-03-02 03:45:18

回答

1

如果您想要處理大於2 -1的數字,則需要執行多精度算術。例如,添加對64位的數字,你可以做這樣的事情:

mov eax, A_1 ; essentially C = A + B 
mov edx, B_1 
add eax, edx ; note that for the low word, we just add 
mov C_1, eax 
mov eax, A_2 
mov edx, B_2 
adc eax, edx ; but for the high word, we add with carry 
mov C_2, eax 

能夠直接訪問進位意味着這是比大多數高級語言要簡單得多。還有一個減法與借用,以減少多字減法。乘法和除法取決於一點。正常的32x32位乘法產生64位結果(eax中的低位字,edx中的高位字)。如果你想要64x64位乘法(給出128位結果),你需要自己實現。

例如,乘法(不使用內置的MUL/IMUL指令)可以做這樣的事情:

mult proc 
; multiplies eax by ebx and places result in edx:ecx 
    xor ecx, ecx 
    xor edx, edx 
mul1: 
    test ebx, 1 
    jz mul2 
    add ecx, eax 
    adc edx, 0 
mul2: 
    shr ebx, 1 
    shl eax, 1 
    test ebx, ebx 
    jnz mul1 
done: 
    ret 
mult endp 
3

你可以像裝在紙上一樣進行裝配(長添加,長倍增,長劃分)。你把這個數字分成幾部分,你隨身攜帶,借錢等等。

如果你只能容納0到9之間的數字,你會認爲32爲(10 * 3 + 2)或「32」。要添加,請添加較低部分,如果需要,請添加較高部分。要減去,您更改標誌並添加。相乘,可以使用這樣的:

(A * X + B)(C * X + d)= AC * X^2 +(AD + BC)* X + BD

這是同樣的方式,你(3 * 10 + 2)(1 * 10 + 2)=(3 * 1)* 100 +(2 * 1 + 3 * 2)* 10 + 2 * 2 = 384來做「32 * 12」

要劃分,你需要像在紙面上學習一樣進行長時間的劃分。

(記住所有的人誰說過你必須知道的數學編程。這是衆多原因之一。你必須打破的東西分解成非常小的部分程序組裝電腦。)