The GBA BIOS was designed to allow passing interrupt handling directly
to GCC or ARM SDT C procedures by following the APCS (Arm Procedure Call
Standard). As a result, the BIOS saves registers r0-r3 & r12 for you.
You should preserve all other registers yourself when writing custom
assembly interrupt drivers. Here is the actual ARM
IRQ handler code used by the BIOS. Notice that the address that is
stored at 0x3007ffc must be a branch to ARM (not Thumb) code:
stmdb r13!,{r0-r3,r12,r14}
mov r0,#0x4000000
adr lr,IntRet
ldr pc,[r0,#-4] @ pc = [0x3007ffc]
IntRet:
ldmia r13!,{r0-r3,r12,r14}
subs pc,r14,#4