2016-12-02 34 views
-2

power이라는 서브 루틴을 호출하는 SPARC 어셈블리 프로그램에서 작업하고 있습니다.이 서브 루틴은 기본 숫자를 취하고 기본 시간에 지수를 기반으로 자체 시간을 곱합니다. 근본적으로 힘 함수를 계산하는 것. 내 문제는 다음 C 함수를 SPARC 어셈블리로 변환하는 데 문제가 있습니다.C 함수를 SPARC 어셈블러로 변환하는 데 도움이 필요합니다.

.global main 

main: save %sp,-96,%sp 
     mov 7,%i0 
     mov 5,%i1 
     mov 1,%l2 
loop: mov %i0,%o0 
     mov %i0,%o1 
     call .mul 
     nop 
     cmp %l2,%i1 
     ble loop 
     dec %i1 
+2

에 의해 ble을 대체 스매싱은 - 당신이 주로 사각형 및 큐브를 할 경우, 그것을 원하지만 덧붙여, 즉 ', 특히 좋은 지수 알고리즘 아니다 많은 문제. 더 높은 힘을 얻으려면 선형이 아닌 힘이 로그 인 알고리즘을 사용해야합니다. –

+0

https://en.wikipedia.org/wiki/Exponentiation_by_squaring –

답변

0
.global main 

main: save %sp,-96,%sp 
     mov 7,%i0  ! base 
     mov 5,%i1  ! exponent 
     mov 1,%l2  ! p 
     mov %l2,%o0 ! %o0 = p = 1 
     cmp %i1,0  
     ble end  ! if (exponent <= 0) -> end 
loop: mov %i0,%o1 ! %o1 = base 
     call .mul  ! %o0 = %o0 * %o1 -> p = p * base 
     nop 
     cmp %l2,%i1 
     bl loop 
     dec %i1 
end: 

변경 사항 결과 (7⁵ = 16,807)을 얻을 :

  • Initalized %o0
    power(int base, int exponent) 
    { 
        register int p, e; 
        p = 1; 
    
        for(int e=1; e <= exponent; e++) 
        { 
         p *= base; 
        } 
    } 
    

    내가 가지고 있지만 난 그냥 내 대답으로 49를 얻을 것입니다 with 1
  • 제거됨 mov %i0,%o0 (반복 될 때마다 전자 대답은 42 있어야 mul 결과)
  • 은 분명히 bl
+0

정말 고맙습니다. – Mickey