2015-01-10 5 views
0

Я хочу написать программу masm m86, которая вычисляет большие факториалы (результаты до 128 бит), но я не уверен, как это сделать. Я написал версию, которая вычисляет до 32 бит, как я могу ее изменить, чтобы она работала для больших чисел?Факториал для больших чисел

ответ

1

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; 
Смежные вопросы