2011-12-01 4 views
3

각 반복마다 RAX를 감소시키고 있습니다. RAX가 0이면 프로그램이 흐름을 변경해야합니다.cmpq 및 je를 사용할 때 무한 루프

# AT&T syntax 
start_calc_factorial: 
    decq %rax 
    cmpq $0, %rax 
    je quit_calc_factorial 
    mulq %rcx 
    jmp start_calc_factorial 

그러나 프로그램은 절대로 종료되지 않습니다. 디버거는 RAX의 값이 0xa0257c7238581842이라고 알려줍니다 (언더 플로우 일 가능성이 있지만 je 명령어로 인해 야합니다). RAX의 초기 값은 7입니다.

무엇이 문제입니까?

답변

6

나는 곱셈의 결과가 RAX 레지스터에 저장되므로 루핑을 확실히 망칠 것이라고 믿습니다.

3

문제는 동일한 레지스터 인 rax를 모두 인수와 제품으로 사용한다는 것입니다. 귀하의 코드는 다음과 C 코드에 해당 :

그것은 그렇지 않으면 영원히 오랫동안 루프 수
while (1) 
{ 
    rax = rax - 1; 
    if (rax == 0) break; 
    rax = rax * rcx; 
} 

.

while (1) 
{ 
    rcx = rcx - 1; 
    if (rcx == 0) break; 
    rax = rax * rcx; 
} 
:

은 당신이 아마 원하는 것은 이것이다