手臂反向弦

时间:2017-11-07 18:53:19

标签: c assembly arm gnu

我尝试将以下C代码翻译成arm语言

int main(int argc,char **argv){

    for(int i=strlen(argv[1])-1;i!=-1;i--)printf("%c",argv[1][i]);

}

C代码与argv [1]

中的字符串相反
  

$ g ++ -o reverse reverse.c

     

$ ./reverse abcd

     

$ dcba

我知道字符串argv [1]存储在r1 + 4中 和argc存储在r0

但是我不知道字符串argv [1]的结束地址是什么,我找到了一个写r0存储r1长度的帖子,所以我在这篇帖子上写了我的代码库,这是我的手臂代码

 @@@@ input : hi 
 @@@@ expected output : ih
 @@@@ if "hi" is a string named a-> string aaa="hi"
 @@@@ so r3=aaa[0],and the length of aaa is r2

    .text   
    .align 2
    .global main
    .extern printf
main:
    stmfd sp!, {r0,r1,r2,r3,fp,lr}
    ldr r3,[r1,#4] ; r3 = a pointer point to argv[1]
    mov r2,r0
    sub r2,r2,#4  ;minus the last character (terminated character) 
    b LOOP
    ldmfd sp!, {r0,r1,r2,r3,fp,lr}
    bx lr

LOOP:
    ldr r0,=string
    cmp r2,r3 
    subne r2,r2,#4 ; if r2 != r3 , r2=r2-4 (address step forward) 
    bl printf ; print one character 
    bne LOOP

string:
    .asciz "%c"

此代码在CodeSourcery中运行

  

$ arm-none-eabi-gcc j.s -T generic-hosted.ld

     

$ arm-none-eabi-run a.out" hi"

     

$(没有打印,我的预期输出:ih)

我该如何修复我的代码?这个问题打扰了我3天

1 个答案:

答案 0 :(得分:0)

此代码完美运行。

area reverseString,code
CR EQU 0x0D
 entry
 ldr r0,=data
 ldr r2,=0x40000000
 ldr r3,=0x40000020
 mov r4,#00

up ldrb r5,[r0],#1
 cmp r5,#CR
 strb r5,[r2],#1
 add r4,r4,#1
 BNE up
 sub r4,r4,#1
 sub r2,r2,#2
 BNE down

down ldrb r6,[r2]
 strb r6,[r3],#1
 sub r2,r2,#1
 subs r4,r4,#1
 BNE down


stop b stop
data dcb "Vidya",CR
 end