如何使用大数?像 3441881739,30000000 等
mov eax,3441881739
在这种情况下,eax 值为负数。如何解决?分吗?如何?我还需要执行 add/sub/mul/div 等cmp
操作。
有人可以解释并举例说明如何做到这一点吗?
我标记fasm
和nasm
标记,但也欢迎其他组件。我在 32 位机器上。
您在汇编中执行此操作的方式与在纸上执行此操作的方式相同(长加法、长乘法、长除法)。你把数字分成几部分,你携带,你借,等等。
如果您只能保存 0 到 9 之间的数字,您会将 32 视为 (10*3 + 2) 或“32”。要添加,您添加较低的部分,如果需要,请携带,然后添加较高的部分。要减去,您更改符号并添加。要相乘,您可以使用:
(A*X + B) (C*X + D) = AC*X^2 + (AD+BC)*X + BD
这与您执行“32 * 12”的方式相同 (3*10 + 2)(1*10 + 2) = (3*1)*100 + (2*1+3*2)*10 + 2*2 = 384
要进行除法,您可以像在纸上学到的那样进行长除法。
(记住所有那些说你必须知道数学才能编程的人。这是众多原因之一。你必须将事物分解成非常小的部分才能在组装中对计算机进行编程。)
如果要处理大于 2 32 -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