6.2. プロセッサ状態の判断

例外ハンドラによって、例外発生時にプロセッサが ARM 状態と Thumb® 状態のどちらにあったかを判断しなければならない場合があります。

特に、SVC ハンドラでプロセッサ状態を読み出す必要がある場合があります。プロセッサ状態は、SPSR の T ビットを検査することで参照できます。このビットは、Thumb 状態ではセットされ、ARM 状態ではクリアされます。

ARM と Thumb のどちらの命令セットにも SVC 命令があります。Thumb 状態から SVC を呼び出す場合には、以下の点に注意する必要があります。

Figure 6.1. Thumb SVC 命令

Thumb SVC 命令

Example 6.1 は、両方のソースからの SVC を処理する ARM コードを示しています。

以下に注意して下さい。

Example 6.1. SVC ハンドラ

T_bit   EQU    0x20                     ; Thumb bit of CPSR/SPSR, that is,
                                        ; bit 5.
        :
        :
SVCHandler
        STMFD   sp!, {r0-r3,r12,lr}     ; Store registers.
        MRS     r0, spsr                ; Move SPSR into
                                        ; general purpose register.
        TST     r0, #T_bit              ; Occurred in Thumb state?
        LDRNEH  r0,[lr,#-2]             ; Yes: load halfword and...
        BICNE   r0,r0,#0xFF00           ; ...extract comment field.
        LDREQ   r0,[lr,#-4]             ; No: load word and...
        BICEQ   r0,r0,#0xFF000000       ; ...extract comment field.

            ; r0 now contains SVC number

        CMP     r0, #MaxSVC             ; Rangecheck
        LDRLS   pc, [pc, r0, LSL#2]     ; Jump to the appropriate routine.
        B       SVCOutOfRange
svctable
        DCD     do_svc_1
        DCD     do_svc_2
        :
        :
do_svc_1
        ; Handle the SVC.
        LDMFD   sp!, {r0-r3,r12,pc}^   ; Restore the registers and return.
do_svc_2
        :
Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0203GJ
Non-Confidential