2015-01-10 4 views
0

큰 factorials (최대 128 비트 결과)를 계산하는 x86 masm 프로그램을 작성하고 싶지만 그 방법을 모르겠습니다. 최대 32 비트를 계산하는 버전을 작성했습니다. 어떻게하면 더 큰 숫자에서 작동하도록 변경할 수 있습니까?큰 숫자의 요인

답변

1

128 비트가 mul 명령에 비해 너무 커서 64 비트 결과 (EDX (32 비트) + EAX (32 비트)) 만 저장됩니다.

우선, 128 비트 결과를 저장하려면 4 DWORDS의 메모리가 필요합니다. 그런 다음 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;