6.6.1. 呼び出す SVC の決定

SVC ハンドルは起動時に、どの SVC が呼び出されているかを特定する必要があります。この情報は、Figure 6.3 に示すように命令自体の 0 〜 23 ビットに保存するか、1 つの整数レジスタに渡されます。通常、この整数レジスタには r0r3 のいずれかが使用されます。

Figure 6.3. ARM SVC 命令

ARM SVC 命令

トップレベルの SVC ハンドラでは、SVC 命令をリンクレジスタの相対アドレスにロードできます。このロードは、アセンブリ言語か、C/C++ インラインアセンブラまたは組み込みアセンブラで行います。

SVC ハンドラは、まず例外を発生させた SVC 命令をレジスタにロードする必要があります。この時点で lr_SVC には SVC 命令の次の命令のアドレスが保持されているため、この SVC 命令は以下を使用してレジスタ(この場合は r0)にロードされます。

    LDR r0, [lr,#-4]

SVC ハンドラは次にコメントフィールドビットを検査し、要求されている処理を特定します。SVC 番号は、オペコードの上位 8 ビットをクリアすることによって抽出されます。

    BIC r0, r0, #0xFF000000

Example 6.6 は、これらの命令を組み合わせてトップレベルの SVC ハンドラを形成する方法を示しています。

ARM 状態と Thumb 状態の SVC 命令を処理するハンドラの例については、プロセッサ状態の判断を参照して下さい。

Example 6.6. トップレベルの SVC ハンドラ

    PRESERVE8

    AREA TopLevelSVC, CODE, READONLY   ; Name this block of code.
    EXPORT     SVC_Handler
SVC_Handler
    STMFD      sp!,{r0-r12,lr}         ; Store registers.
    LDR        r0,[lr,#-4]             ; Calculate address of SVC instruction
                                       ; and load it into r0.
    BIC        r0,r0,#0xff000000       ; Mask off top 8 bits of instruction
                                       ; to give SVC number.
    ;
    ; Use value in r0 to determine which SVC routine to execute.
    ;
    LDMFD        sp!, {r0-r12,pc}^     ; Restore registers and return.
    END                                ; Mark end of this file.
Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0203GJ
Non-Confidential