C代码调用程序集:无限循环

时间:2013-10-28 00:05:09

标签: c assembly sparc

我正在测试一个简单的汇编函数(SPARC)。该功能位于下方,应采用x*str这两个参数,并计算x*str出现的次数。但是,该函数导致无限循环。我正在使用C调用汇编函数,这也在下面。什么可能导致无限循环?为了澄清,汇编函数重复移动到eq并不断递增l0

大会:

        .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 个答案:

答案 0 :(得分:2)

每次找到匹配的字母时,都不会增加%o1。因此,你将始终只进入第一场比赛,然后你就被困住了。

如果你的eq将包含inc%o1,它应该可以工作。

该函数将返回“不匹配”字符串。将计数器增量移到o1增量上方并添加跳转到“next:”

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

答案 1 :(得分:0)

我不熟悉SPARC程序集,但调用参数不应该在%iX寄存器中吗?