My first program in ARM assembly

I made a crappy tic-tac-toe game in ARM.

Basically you enter in a number 1 - 9 which corresponds with one of the spots on the field, X starts first and it alternates.

The game ends with "X wins!" or "O wins!" or "Tied."

.global main

_putchar:  
    ldr r3, =STDOUT
    ldr r1, [r3]
    push {lr}
    bl putchar
    pop {lr}
    bx lr

printmap:  
    push {r4, r5}
    mov r5, #3
printmap_0:  
    mov r4, #3
printmap_1:  
    tst r0, #1
    push {r0, r1, lr}
    mov r0, #0x4F
    moveq r0, #32
    tst r1, #1
    movne r0, #0x58
    bl _putchar
    pop {r0, r1, lr}
    lsr r0, r0, #1
    lsr r1, r1, #1
    subs r4, r4, #1
    bne printmap_1
    push {r0, r1, lr}
    mov r0, #0xA
    bl _putchar
    pop {r0, r1, lr}
    subs r5, r5, #1
    bne printmap_0
    pop {r4, r5}
    bx lr

.winmaps:
    .word 0x007
    .word 0x038
    .word 0x1C0
    .word 0x124
    .word 0x092
    .word 0x049
    .word 0x111
    .word 0x054
    .word 0
checkwin:  
    ldr r1, =.winmaps
checkwin_loop:  
    ldr r2, [r1]
    cmp r2, #0
    moveq r0, #0
    bxeq lr
    bics r2, r2, r0
    beq checkwin_win
    add r1, r1, #4
    b checkwin_loop
checkwin_win:  
    mov r0, #1
    bx lr

readnum:  
    push {lr}
    bl getchar
    pop {lr}
    cmp r0, #0x31
    blt readnum
    cmp r0, #0x39
    bgt readnum
    sub r0, r0, #0x30
    bx lr

main:  
    push {r4, r5, r6, r8, r9, lr}
    mov r4, #0x00
    mov r5, #0x00
    mov r8, #0
    ldr r0, =.hello
    bl puts
loop:  
    mov r0, r4
    mov r1, r5
    bl printmap

    orr r0, r4, r5
    ldr r1, =511
    cmp r0, r1
    beq tied

    mov r0, r4
    bl checkwin
    cmp r0, #0
    movne r0, #0
    bne winner
    mov r0, r5
    bl checkwin
    cmp r0, #0
    movne r0, #1
    bne winner

    bl readnum
    sub r0, r0, #1

    mov r1, #1
    lsl r1, r1, r0

    orr r0, r4, r5
    ands r0, r0, r1
    bne invalid

    eors r8, r8, #1
    orreq r4, r4, r1
    orrne r5, r5, r1

    b loop
invalid:  
    ldr r0, =.invalid
    bl puts
    b loop
winner:  
    cmp r0, #0
    moveq r0, #0x4F
    movne r0, #0x58
    bl putchar
    ldr r0, =.wins
    bl puts
    b endgame
tied:  
    ldr r0, =.tied
    bl puts
endgame:  
    pop {r4, r5, r6, r8, r9, lr}
    mov r0, #0
    bx lr

.hello:
    .string "Hello!"
.invalid:
    .string "Invalid move."
.tied:
    .string "Tied."
.wins:
    .string " wins!"
STDOUT:  
    .word stdout