4.2.3. ARM ヘッダのサンプル

Example 4.2 には 4 つのコードセクションが含まれています。サンプルの後に、各コードセクションについて説明します。

Example 4.2. 

     PRESERVE8

     AREA     AddReg,CODE,READONLY  ; Name this block of code.
     ENTRY                          ; Mark first instruction to call.

; SECTION 1
start
     ADR r0, ThumbProg + 1          ; Generate branch target address
                                    ; and set bit 0, hence arrive
                                    ; at target in Thumb state.
     BX  r0                         ; Branch exchange to ThumbProg.

; SECTION 2
     THUMB                          ; Subsequent instructions are Thumb code.
ThumbProg
     MOVS r2, #2                    ; Load r2 with value 2.
     MOVS r3, #3                    ; Load r3 with value 3.
     ADDS r2, r2, r3                ; r2 = r2 + r3
     ADR r0, ARMProg
     BX  r0		                         ; Branch exchange to ARMProg.

; SECTION 3
     ARM                            ; Subsequent instructions are ARM code.
ARMProg
     MOV r4, #4
     MOV r5, #5
     ADD r4, r4, r5

; SECTION 4
stop MOV r0, #0x18                  ; angel_SWIreason_ReportException
     LDR r1, =0x20026               ; ADP_Stopped_ApplicationExit
     SVC 0x123456                   ; ARM semihosting (formerly SWI)
     END                            ; Mark end of this file.

SECTION 1 には、プロセッサを Thumb 状態に切り替える、ARM コードの短いヘッダセクションが実装されています。このヘッダコードには以下の命令が使用されています。

SECTION 2 にある ThumbProg という名前のラベルの前には、THUMB ディレクティブが配置されています。このディレクティブは、後続のコードを Thumb コードとして処理するようアセンブラに指定しています。この Thumb コードによって、2 本のレジスタの内容が加算されます。

このコードでは、再度 ADR 命令を使用してラベル ARMProg のアドレスを取得しますが、このとき最下位ビットはクリアされたままです。次の BX 命令で ARM 状態に戻ります。

SECTION 3ARMProg という名前のラベルでは、2 本のレジスタの内容が加算されます。

SECTION 4stop という名前のセクションでは、正常なアプリケーションの終了を通知するセミホスティングを使用します。セミホスティングの詳細については、RealView Compilation Tools v3.0 Compiler and Libraries Guideを参照して下さい。

Note

Thumb セミホスティングで使用する SVC 番号は、ARM セミホスティングとは異なります(0x123456 ではなく 0xAB が使用されます)。

シンボルのエクスポート

Thumb 命令を参照するシンボルをエクスポートすると、リンカによって Thumb コードの任意のラベルのアドレスに 1 が自動的に加算されます。

シンボルをエクスポートしなかった場合は、Thumb 命令を参照するシンボルに手動で 1 を加算する必要があります。Example 4.2 では、ThumbProg+1 がこれに当たります。この作業は、すべての参照がアセンブラによって解決され、リンカによってシンボルが検出されないため必要となります。

サンプルのビルド

サンプルをビルドおよび実行するには

  1. テキストエディタを使用してコードを入力し、addreg.s というファイル名で保存します。

  2. コマンドプロンプトで「armasm -g addreg.s」と入力し、このソースファイルをアセンブルします。

  3. 「armlink addreg.o -o addreg」と入力し、このファイルをリンクします。

  4. 適切なデバッグターゲットで、互換性のあるデバッガ(RealView® Debugger や AXD など)を使用してイメージを実行します。このプログラムを 1 命令ずつステップスルーすると、プロセッサが Thumb 状態に移行するのがわかります。この切り替えがどのように通知されるかについては、使用するデバッガのマニュアルを参照して下さい。

Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0203GJ
Non-Confidential