2016-12-02 16 views
-2

私はpowerと呼ばれるサブルーチンを呼び出すSPARCアセンブリプログラムで作業していました。このサブルーチンでは、ベース番号をとり、指数に基づいて自己のベース時間を掛けます。基本的には、パワー関数を計算するだけです。私の問題は、次のC言語関数をSPARCアセンブリに変換することに問題があることです。次のC関数をSPARCアセンブラに変換するのに助けが必要

power(int base, int exponent) 
{ 
    register int p, e; 
    p = 1; 

    for(int e=1; e <= exponent; e++) 
    { 
     p *= base; 
    } 
} 

これは私が持っているものであるが、私はちょうど私の答えとして49を得る:

.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⁵= 16807)を取得する:

  • Initalized %o0 with 1
  • 削除されたmov %i0,%o0(すべての繰り返し電子答えは42でなければなりませんmul結果)
  • が明らかにbl
+0

ありがとうございました – Mickey

関連する問題