2013-10-28 2 views
1

간단한 어셈블리 함수 (SPARC)를 테스트하고 있습니다. 이 함수는 아래에 있으며 x*str의 두 매개 변수를 사용하고 x이 발생하는 횟수를 *str에 계산합니다. 그러나이 함수는 무한 루프를 발생시킵니다. 나는 어셈블리 함수를 호출하기 위해 C를 사용하고 있는데, 이것은 아래에도있다. 무한 루프의 원인은 무엇입니까? 명확하게하기 위해 어셈블리 함수는 eq으로 반복적으로 이동하고 l0을 계속 증가시킵니다.C 코드 호출 어셈블리 : 무한 루프

어셈블리 :

 .global occurs 
occurs: mov 0, %l0   !l0 will be counter 
loop: ldsb [%o1], %o2  !get current value, store in o2 
     cmp %o2, 0   !if current value is terminating 0, end program 
     be end    
     nop 
     cmp %o0, %o2   !if two are equal, increment l0 
     be eq 
     nop 
     inc %o1    !increment o1 to check next address 
     ba loop 
     nop 

eq:  inc %l0 
     ba loop 
     nop 

end: mov %l0, %o0   !store final result in o0 
     retl     !return value 
     nop 

C 함수 호출 :

char x = 'A'; 
char str3[64] = "AaAbBbA"; 
int oc = occurs(x, str3); 
printf("%d", oc); 

답변

2

일치하는 글자를 찾을 때마다 % o1이 증가하지 않습니다. 따라서 항상 첫 경기에만 진출하게되고, 그러면 당신은 붙어 있습니다.

eq에 inc % o1이 포함되어 있으면 제대로 작동합니다.

이 함수는 "일치하지 않음"문자열을 반환합니다. 카운터 증분을 o1 증가분 위로 이동하고 "다음"으로 점프를 추가하십시오.

 cmp %o0, %o2 
     bne next 
     nop 
eq: inc %l0 
     nop 
next: inc %o1 
     ba loop 
+0

항상 가장 간단한 방법입니다. 나는 이것을 30 분 동안 꼼짝 않고 바라 보았다. 신선한 눈 세트가 엄청난 도움이됩니다. 고맙습니다! – vaindil

0
내가 SPARC 어셈블리에 능통 아니에요

,하지만 호출 매개 변수는 % 9 조 레지스터에 안?