https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101422
--- Comment #5 from Simon Willcocks <simon.willcocks at gmx dot de> --- (In reply to Andrew Pinski from comment #4) > (In reply to Simon Willcocks from comment #2) > > That's not an accurate description of the problem; the value of the variable > > is being passed, not its address. As a register variable, it doesn't have an > > address. > > It is the address of the array that is being passed (I was copying and > pasting from another bug). > register uint32_t *cap_and_join asm( "r5" ) = cap_and_join_style; > Is the same as: > register uint32_t *cap_and_join asm( "r5" ) = &cap_and_join_style[0]; > > Because array decays to pointers :). I know. I've been doing this for a while, now. *That* register variable and the array it pointed to were correctly initialised. r0-r3 are clobbered by any function call, although I didn't program a function call, the compiler did.