На "C" такие вещи как-то вообще делать не стоит. Вот мой asm-обработчик:
Код
INCLUDE arm.inc
; ***************************************************************************
; *
EXPORT prefetch_abort_handler
IMPORT prefetch_abort_handler_c
; ***************************************************************************
; *
AREA code0, CODE, READONLY
; ***************************************************************************
; *
prefetch_abort_handler
sub r14, r14, #0x04
stmfd r13!, {r14}
stmfd r13!, {r0-r3, r12}
ldr r0, =regs_temp
str r14, [r0], #0x04
mov r14, r0
ldr r0, [r13]
stmia r14!, {r0-r12}
mov r0, r14
mrs r14, SPSR
stmfd r13!, {r14}
orr r14, r14, #F_BIT :OR: I_BIT
msr CPSR_c, r14
stmia r0!, {r13-r14}
mov r0, #F_BIT :OR: I_BIT :OR: ARM_MODE_ABORT
msr CPSR_c, r0
ldr r0, =regs_temp
bl prefetch_abort_handler_c
ldmfd r13!, {r0}
msr SPSR_c, r0
ldmfd r13!, {r0-r3, r12, pc}^
; ***************************************************************************
; *
AREA code1, DATA, READWRITE
regs_temp
SPACE 0x40
END
Вызывает prefetch_abort_handler_c и передает ему указатель на структуру (LR_abt-4, R0-R14).