手臂反串
reverse string in arm
我试过将下面的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]的结束地址是什么,我找到了一个post写着r0存储了r1的长度,所以我写我的代码基于这个post, 这是我的手臂代码
@@@@ 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"
此 arm 代码在 CodeSourcery
中是 运行
$ arm-none-eabi-gcc j.s -T generic-hosted.ld
$ arm-none-eabi-run a.out "hi"
$ (nothing print,what I expected output : ih)
如何修复我的代码?这个问题困扰我3天
此代码完美运行。
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
我试过将下面的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]的结束地址是什么,我找到了一个post写着r0存储了r1的长度,所以我写我的代码基于这个post, 这是我的手臂代码
@@@@ 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"
此 arm 代码在 CodeSourcery
中是 运行$ arm-none-eabi-gcc j.s -T generic-hosted.ld
$ arm-none-eabi-run a.out "hi"
$ (nothing print,what I expected output : ih)
如何修复我的代码?这个问题困扰我3天
此代码完美运行。
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