我正在测试一个简单的汇编函数(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);
答案 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寄存器中吗?