I try to write a program in arm assembly, which writes whole char** argv
content.
In C it would be like so:
#include <stdio.h>
int main(int argc, char** argv) {
for (unsigned int i = 0; argv[i] != 0; i++)
puts(argv[i]);
return 0;
}
and I wrote it in assembly like this:
.global main
.data
.bss
.text
.align 4
@r0 = argc
@r1 = argv
main:
@prologue
stmfd sp!, {fp, lr}
add fp, sp, #4
sub sp, sp, #8
@i = 0
mov r0, #0
str r0, [fp, #-8]
b loop_begin
loop_content:
bl puts
ldr r0, [fp, #-8]
add r0, r0, #1
str r0, [fp, #-8]
loop_begin:
@r0 = i
ldr r0, [fp, #-8]
@i = i * 4
lsl r0, r0, #2
@r0 = argv + i
add r0, r1, r0
@r3 = argv[i]
ldr r0, [r0]
@argv[i] == 0?
cmp r0, #0
@if arvg[i] != 0 go to ...
bne loop_content
mov r0, #0
sub sp, fp, #4
ldmfd sp!, {fp, lr}
bx lr
but it gives me segfault at
str r0, [fp, #-8]
I have no idea why, do you have any ideas why does it happen?