我有这个C驱动程序
#include <stdlib.h>
#include <stdio.h>
extern void subs( char *string, char this_c, char that_cr ) ;
int main(int argc, char *argv[] )
{
char this_c= 'e' ;
char that_c = 'X' ;
char orgstr[] = "sir sid easily teases sea sick seals" ;
subs( orgstr, this_c, that_c ) ;
printf( "Changed string: %s\n", orgstr ) ;
exit( 0 ) ;
}
我必须制作一个arm程序,将String上的'e'更改为'x',到目前为止,这就是我所拥有的\
.global subs
subs:
stmfd sp!, {v1-v6, lr} //string entry
mov v1, #0 //set index to 0
mov v2, #0 // set count to 0
loop :
ldrb v3, [a1,v1] // get the first char
cmp a2,v3 //compare char if its the same to the one that has to b chang
mov v3, a3 // change the character for the new character
addeq v2, v2, #1 //increment count
add v1, v1, #1 // increment index
cmp v3,#0 //end of string
bne loop
mov a1,v2 //return value
ldmfd sp!, {v1-v6, pc}
.end
这给了我一个无限循环而且我被卡住了,任何人都可以帮我找出问题所在吗?
所以这就是我到目前为止所拥有的,
.global subs
subs:
stmfd sp!, {v1-v6, lr} //string entry
mov v1, #0 //set index to 0
mov v2, #0 // set count to 0
loop :
ldrb v3, [a1,v1] // get the first char
cmp a2,v3 //compare char if its the same to the one that has to b chang
moveq v3, a3 // change the character for the new character
addeq v2, v2, #1 //increment count
add v1, v1, #1 // increment index
cmp v3,#0 //end of string
bne loop
mov a1,v2 //return value
ldmfd sp!, {v1-v6, pc}
.end
它运行但字符永远不会改变...,输出和结尾与输入相同,由于某种原因,a2注册表为空...
答案 0 :(得分:1)
此行完全错误
mov v3, a3 // change the character for the new character
这应该是一个条件存储回到字符串中。
streqb a3, [a1, v1]
答案 1 :(得分:1)
您的代码存在一些问题。这是作业吗?
mov v3, a3
无条件地用新角色覆盖v3
并且永远不会写回内存(如Pete Fordham所说)。由于您在检查字符串结尾时也使用v3
,因此您永远不会终止循环,因为您刚刚将v3
更改为a3
。您还要为声明为void
的函数设置返回值,如果您尝试在C代码中使用返回值,则会产生问题。
我可能会做这样的事情(未经测试但应该给你一些想法):
loop:
ldrb v3, [a1], #1
cmp a2, v3
strbeq a2, [a1, #-1]
cmp v3, #0
bne loop