ARM程序集 - 替换字符串上的字符的代码

时间:2012-11-06 18:41:46

标签: assembly arm inline-assembly

我有这个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注册表为空...

2 个答案:

答案 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