_start の直後で 0x0 番地にコピィされる割り込みベクタテーブルの記述があって、実行する時の挙動がイメージできてなかったんですが、よくよく見れば簡単な話で
_start:
ldr pc, reset_handler
ldr pc, undefined_handler
ldr pc, swi_handler
ldr pc, prefetch_handler
ldr pc, data_handler
ldr pc, unused_handler
ldr pc, irq_handler
ldr pc, fiq_handler
reset_handler: .word reset
undefined_handler: .word hang
swi_handler: .word hang
prefetch_handler: .word hang
data_handler: .word hang
unused_handler: .word hang
irq_handler: .word irq
fiq_handler: .word irq
reset:
ってなってた時に最初の ldr で reset なアドレスが pc に代入されてそのまま jmp になっちゃうんですね。頭いいなぁ。