0

如何使用大数?像 3441881739,30000000 等

mov eax,3441881739

在这种情况下,eax 值为负数。如何解决?分吗?如何?我还需要执行 add/sub/mul/div 等cmp操作。

有人可以解释并举例说明如何做到这一点吗?

我标记fasmnasm标记,但也欢迎其他组件。我在 32 位机器上。

4

2 回答 2

3

您在汇编中执行此操作的方式与在纸上执行此操作的方式相同(长加法、长乘法、长除法)。你把数字分成几部分,你携带,你借,等等。

如果您只能保存 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

要进行除法,您可以像在纸上学到的那样进行长除法。

(记住所有那些说你必须知道数学才能编程的人。这是众多原因之一。你必须将事物分解成非常小的部分才能在组装中对计算机进行编程。)

于 2013-03-02T03:11:18.857 回答
1

如果要处理大于 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
于 2013-03-02T03:17:00.270 回答