Q:

Access ARGV Arm Assembly

I'm trying to get the contents of argv and display them. 
The program would be called like ./main 5 6 7.
r0 = argc
r1 = argv[0]
r2 = argv[1]
This program properly gets the number of command line arguments, but it doesn't work the same by using r1 and printing a string. It prints random characters that vary based on the number of args.
.text
.global main
.extern printf
main:
        push {ip, lr}
        mov r1, r0
        ldr r0, =string
        bl printf
        pop {ip, pc}

.data
string: .asciz "Argc: %d\n"

Argv:
.text
.global main
.extern printf
main:
        push {ip, lr}
        mov r1, r2
        ldr r0, =string
        bl printf
        pop {ip, pc}

.data
string: .asciz "Argv: %s\n"

A:

argv is an array, passed to main as a single argument, not a sequence of arguments.  argv[0] in C therefore translates to [r1] in ARM assembly, argv[1] to [r1,4], argv[2] to [r1,8], and so on.  The offset ticks up by four bytes per array element because argv is an array of pointers, and this is plain ARM (not AArch64), so pointers are 32 bits wide, which is 4 bytes.
If you change
    mov r1, r2

to
    ldr r1, [r1, 4]

your program should work correctly.
Note that you should also clear r0 after the call to printf, so that main returns zero, not garbage.
You might find the ARM Procedure Call Standard helpful.

