大数阶乘:x86 asm 中 32 位 x 128 位数字的乘积



我想编写一个x86 masm程序来计算一个大的阶乘(结果高达128位),但我不确定该怎么做。我写了一个最多计算 32 位的版本,我该如何更改它以使其适用于更大的数字?

128 位对于 mul 指令来说太大了,它只保存 64 位的结果(EDX(32 位)+ EAX (32 位))。

因此,首先您需要 4 个 DWORDS 内存来存储 128 位结果。然后,您应该在某些过程调用中替换mul ebx;,它可以处理 128 位乘法。代码可以是这样的:

.data
;...
bignum dword 1, 0, 0, 0; initial answer = 0000 0000 0000 0001h
....
call largemul; replace for mul ebx
....
largemul proc; 
 mov ebx, 10            ;EBX = multiplier
 mov eax, [bignum]  
 mul ebx                ;EDX:EAX = EAX*EBX
 mov [bignum], eax  ;save result
 mov ecx, edx           ;save carried part in ECX
 mov eax, [bignum+4]
 mul ebx
 add eax, ecx           ;add carried part from previous multiplication
 mov [bignum+4], eax
 mov ecx, edx
 mov eax, [bignum+8]
 mul ebx
 add eax, ecx
 mov [bignum+8], eax
 mov eax, [bignum+8]
 mul ebx
 add eax, ecx
 mov [bignum+12], eax
largemul endp;

最新更新