大数的阶乘:x86 asm 中 32 位 x 128 位数字的乘积
Factorial for large numbers: product of 32-bit x 128-bit numbers in x86 asm
我想编写一个计算大阶乘(结果高达 128 位)的 x86 masm 程序,但我不确定该怎么做。我已经编写了一个最多可计算 32 位的版本,我该如何更改它以使其适用于更大的数字?
128 位对于 mul 指令来说太大了,它只保存 64 位结果(EDX(32 位)+ EAX(32 位))。
所以首先你需要4个双字的内存来存储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;
我想编写一个计算大阶乘(结果高达 128 位)的 x86 masm 程序,但我不确定该怎么做。我已经编写了一个最多可计算 32 位的版本,我该如何更改它以使其适用于更大的数字?
128 位对于 mul 指令来说太大了,它只保存 64 位结果(EDX(32 位)+ EAX(32 位))。
所以首先你需要4个双字的内存来存储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;