2014-01-30 2 views
0

여기에 문제가 있습니다.
미리 설정된 숫자 (ebx에 저장 됨)를 취하여 그 계승을 계산하는 단일 루프를 만들어야하지만, 나에게있어서 그것을 수행하는 방법을 알 수는 없습니다. 내 제한 요소는 어떤 곱셈 명령도 사용할 수 없다는 것입니다. 이 알고리즘이 될 일에MASM x86 어셈블리 Factorials 평가를위한 반복적 인 추가

;preceding code 
mov eax, 0 ;n! will be stored in eax 
ecx = ebx ;ebx = n 

factorial: ;computes n! 
    ;some algorithm I have not figured out 
    ; 
    ; 
loop factorial 

;eax = n! 

어떤 아이디어 : 여기
은 문제가 무엇인지의 기본 형식입니다?

업데이트 : 알고리즘을 발견했습니다. x86 어셈블리보다 훨씬 유창하기 때문에 C로 작성해야했습니다.

int x = z; //z is the number we want z! from 
int y = 0; 
int n = x; 
int i, j; 

for(i = x - 1; i > 0; i--) 
{ 
    for(j = n; j > 0; j--) 
    y += i; 
    n = y; 
    y = 0; 
} 
printf("%d\n", n); 

현재 어셈블리로 변환하려고합니다.

여기에있는 모든 향후 코더에 대한 최종 번역본이 나와 있습니다. 질문이 해결되었습니다.

;FACTORIAL WITHOUT MULTIPLICATION 
mov ecx, ebx 
mov edx, 0 
mov eax, ebx 
dec ecx 
jz next 
factorial: 
    mov edi, ecx 
    mov ecx, eax 
    factorial2: 
    add edx, edi  
    loop factorial2 
    mov ecx, edi 
    mov eax, edx 
    mov edx, 0 
loop factorial 

답변

1

32 비트 정수로 저장할 수있는 가장 큰 요인은 12입니다. 루프를 사용하지 않아도됩니다. 팩토리얼을 테이블에 저장하고 찾아 보는 것이 훨씬 쉽고 빠릅니다.

범위 확인없는 코드는 다음과 다소있을 수 : 주석에 대한

; assumes n is stored in EBX 

    lea edi, [FactorialTable] 
    mov eax, [edi + ebx*4] 
    ret       ; return from subroutine 

FactorialTable: 
    dd 1 ; factorial of 0 is 1 
    dd 1 
    dd 2 
    dd 6 
    dd 24 
    dd 120 
    dd 720 
    dd 5040 
    dd 40320 
    dd 362880 
    dd 3628800 
    dd 39916800 
    dd 479001600 
+0

감사합니다! 하지만 실제로는 실제 응용 프로그램 대신 할당을 위해 계산해야합니다 (물론 테이블이 더 좋을 것입니다!) 또한 정수는 1-10이므로 32 비트는 10에 적합합니다!. – user3255385