1

単純なアセンブリ関数 (SPARC) をテストしています。x以下の関数は、との 2 つのパラメーターを取り、で発生する*str回数をカウントします。ただし、関数は無限ループになります。C を使用してアセンブリ関数を呼び出していますが、これも以下のとおりです。無限ループの原因は何ですか? 明確にするために、アセンブリ関数は に繰り返し移動し、継続的にインクリメントします。x*streql0

組み立て:

        .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);
4

2 に答える 2

2

一致する文字が見つかるたびに、%o1 をインクリメントしません。したがって、常に最初の試合にのみ進むことになり、その後スタックします。

eq に inc %o1 が含まれる場合、動作するはずです。

関数は「一致しない」文字列を返します。カウンターのインクリメントを o1 のインクリメントの上に移動し、「next:」へのジャンプを追加します。

      cmp %o0, %o2
      bne next
      nop
eq:   inc %l0
      nop
next: inc %o1
      ba loop
于 2013-10-28T00:15:18.480 に答える
0

私は SPARC アセンブリに堪能ではありませんが、呼び出しパラメーターは %iX レジスターにあるべきではありませんか?

于 2013-10-28T00:14:01.707 に答える