.data

.balign 4
red: .word 0
green: .word 0
blue: .word 0

.text
.global grayscale
.func grayscale

grayscale:
assign:
  /* some comment */
  ldr ip, addr_red
  str r3, [ip]
  ldr ip, addr_green
  ldmfd r13!, {r3}
  str r3, [ip]
  ldr ip, addr_blue
  ldmfd r13!, {r3}
  str r3, [ip]
  stmfd r13!, {r4-r8}
  ldr ip, addr_red
  ldr r3, [ip]
  ldr ip, addr_green
  ldr r4, [ip]
  ldr ip, addr_blue
  ldr r5, [ip] /* another comment */
grayscale_loop:
  ldrb r6, [r1]
  mul r6, r3, r6
  add r1, r1, #1
  ldrb r7, [r1]
  mul r7, r4, r7
  add r1, r1, #1
  ldrb r8, [r1]
  mul r8, r5, r8
  add r1, r1, #1
  add r6, r6, r7
  add r6, r6, r8
  asr r6, r6, #8
  str r6, [r2]
  add r2, r2, #1
  sub r0, r0, #1
  cmp r0, #0
  bne grayscale_loop
  ldmfd r13!, {r4-r8}
  stmfd r13!, {r0-r1}
  bx lr

addr_red: .word red
addr_green: .word green
addr_blue: .word blue