One address, a load and a store
When a function reads a global and writes it back, the address is fetched once and kept. The pool costs a word and an ldr; paying that twice for the same variable in the same stretch of straight-line code would be waste, and the compiler does not.
tickPre increments a clock and returns the new value:
0 ldr r1, [pc, #8] (->12)
2 ldr r0, [r1, #0]
4 add r0, #1
6 str r0, [r1, #0]
8 bx lr
10 .hword 0
12 .word gClock
r1 is the address and it is never touched again. r0 carries the value out of memory, through the arithmetic, and back in. Five rows, one variable, one pool word.
Now the same increment written to hand back the old value:
0 ldr r1, [pc, #8] (->12)
2 ldr r2, [r1, #0]
4 mov r0, r2
6 add r2, #1
8 str r2, [r1, #0]
10 bx lr
12 .word gClock
The old value has to survive the increment, so it is copied into r0 before r2 is bumped. One extra instruction, and because the instruction count flipped from odd to even the .hword 0 vanished too. Both effects come from the same source-level detail, and neither is visible in the C without knowing this rule.
When the result is discarded, the two spellings compile to exactly the same five instructions — there is nothing in the listing to tell you which one was written.
Your target keeps the base in a register across a little more arithmetic than these two do.
Your task
Write func_0832dd24 to reproduce the target assembly.