因为大数量的因子

时间:2015-01-10 20:58:39

标签: assembly x86 factorial largenumber

我想写一个x86 masm程序来计算一个很大的阶乘(结果高达128位),但我不知道该怎么做。我写了一个计算高达32位的版本,我怎么能改变它以便它适用于更大的数字?

1 个答案:

答案 0 :(得分:1)

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

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

.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;