Argument nine has to ride the stack
The register budget for integer arguments runs out at eight, r3–r10. Hand a function a ninth and there is simply no register left for it, so the caller drops that one on the stack and the callee digs it back out. To find it you lean on the EABI frame layout. The first two words of the caller's frame are spoken for, 0(r1) for the back-chain and 4(r1) for a saved LR, and the outgoing parameter area starts right after at 8(r1). Since ninth is a leaf, it builds no frame of its own, so on entry r1 is still aimed at the caller's frame. That leaves the ninth argument an easy grab at 8(r1):
lwz r3, 8(r1) # load the 9th argument from the caller's frame
blr
Notice it is still a leaf. No call means no frame, yet it reaches into r1 anyway to grab the one argument that never landed in a register. When you spot a lone lwz reading a small positive r1 offset right at the top of a function, that is the giveaway that an argument spilled onto the stack. The first eight (a–h) showed up in r3–r10, and since nobody uses them, they emit nothing.
Your task
Write ninth, taking nine ints. Reproduce the assembly above — a single lwz from 8(r1) followed by blr.