如何使用大数字?

时间:2013-03-02 03:10:10

标签: assembly nasm fasm

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

mov eax,3441881739

在这种情况下,eax值为负数。怎么解决?分开了吗?怎么样? 我还需要添加/ sub / mul / div等cmp操作。

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

我标记了fasmnasm标签,但也欢迎其他人组装。 我在32位机器上。

2 个答案:

答案 0 :(得分: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

要划分,你可以像在纸上学习一样进行长时间划分。

(请记住所有那些说你必须知道数学编程的人。这是众多原因之一。你必须把事情分解成非常小的部分,以便在装配中对计算机进行编程。)

答案 1 :(得分: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