如何使用大數字?像3441881739,30000000等如何使用大數字?
mov eax,3441881739
在這種情況下,eax值是一個負數。如何解決它?拆分它?怎麼樣? 我還需要添加/ sub/mul/div等cmp
操作。
有人可以解釋並給出一個例子如何做到這一點?
我標記爲fasm
和nasm
標籤,但其他組件也歡迎。 我在32位機器上。
如何使用大數字?像3441881739,30000000等如何使用大數字?
mov eax,3441881739
在這種情況下,eax值是一個負數。如何解決它?拆分它?怎麼樣? 我還需要添加/ sub/mul/div等cmp
操作。
有人可以解釋並給出一個例子如何做到這一點?
我標記爲fasm
和nasm
標籤,但其他組件也歡迎。 我在32位機器上。
如果您想要處理大於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
你可以像裝在紙上一樣進行裝配(長添加,長倍增,長劃分)。你把這個數字分成幾部分,你隨身攜帶,借錢等等。
如果你只能容納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」
要劃分,你需要像在紙面上學習一樣進行長時間的劃分。
(記住所有的人誰說過你必須知道的數學編程。這是衆多原因之一。你必須打破的東西分解成非常小的部分程序組裝電腦。)
除非你在談論[多精度算術(HTTP:// EN .wikipedia.org/wiki/Arbitrary-precision_arithmetic),*符號*由指令解釋。在2的補碼運算中,'add/adc','sub/sbb'是相同的操作,而'imul/mul','idiv/div'的操作不同。 – 2013-03-02 03:31:25
@BrettHale:不,add和adc是*不同*('sub'與'sbb'不一樣)。無論您是處理正數還是負數(或組合),並且與子處理相同,add都是一樣的,但是'add'和'sub'忽略進位位,其中'adc'和'sbb'沒有。 – 2013-03-02 03:37:38
@JerryCoffin - 我剛剛意識到我的評論措辭不妙。我的意思是,'add/adc'對於假設的'符號'位不會有不同的表現。 – 2013-03-02 03:45:18