4.4.1. ベニアを使用したアセンブリ言語のみのインターワーク

リンカによって生成されるインターワークベニアを利用する ARM/Thumb インターワークコードは、アセンブリ言語で記述できます。この場合は以下のルーチンを記述する必要があります。

一般的にこの作業は ARMv4T のみで必要となります。また、発呼側ルーチンと被発呼側ルーチンが遠く離れていたり、異なるエリアに配置されている場合にも必要となります。ARMv5T 以降では、発呼側ルーチンと被発呼側ルーチンが十分に接近していれば、ベニアは必要ありません。

ベニアを使用したアセンブリ言語のインターワークのサンプル

Example 4.6 は、レジスタ r0r2 に、1、2、3 の値をそれぞれ設定するコードを示しています。レジスタ r0r2 は ARM コードによって設定されます。r1 は、Thumb コードによって設定されます。以下の点に注意して下さい。

  • このコードは --apcs /interwork オプションを使用してアセンブルする必要があります。

  • サブルーチンからの復帰には、通常の MOV pc,lr ではなく、BX lr 命令が使用されます。

Example 4.6. 

     ; *****
     ; arm.s
     ; *****

     PRESERVE8

     AREA     Arm,CODE,READONLY   ; Name this block of code.	
     IMPORT     ThumbProg	
     ENTRY                        ; Mark 1st instruction to call.	
ARMProg
     MOV  r0,#1                   ; Set r0 to show in ARM code.	
     BL   ThumbProg               ; Call Thumb subroutine.		
     MOV  r2,#3                   ; Set r2 to show returned to ARM.	
                                  ; Terminate execution.	
     MOV  r0, #0x18               ; angel_SWIreason_ReportException	
     LDR  r1, =0x20026            ; ADP_Stopped_ApplicationExit	
     SVC 0x123456                 ; ARM semihosting (formerly SWI)
     END

     ; *******
     ; thumb.s
     ; *******
     AREA  Thumb,CODE,READONLY	    ; Name this block of code.	
     THUMB                        ; Subsequent instructions are Thumb.	
     EXPORT ThumbProg	
ThumbProg
     MOVS  r1, #2                 ; Set r1 to show reached Thumb code.	
     BX   lr                      ; Return to ARM subroutine.	
     END                          ; Mark end of this file.

このモジュールのビルドとリンクを行い、インターワークベニアを確認するには、以下の手順を実行します。

  1. 「armasm -g arm.s」と入力し、ARM コードをアセンブルします。

  2. 「armasm --thumb -g --apcs /interwork thumb.s」と入力し、Thumb コードをアセンブルします。

  3. 「armlink arm.o thumb.o -o count」と入力し、2 つのオブジェクトファイルをリンクします。

  4. 適切なデバッグターゲットで、互換性のあるデバッガ(RealView Debugger や AXD など)を使用してイメージを実行します。

Example 4.7 は、逆アセンブルされたコードで、リンカによって挿入されるインターワークベニアを示しています。ベニアは次のワード境界に挿入され、アドレス 0x0000801C から始まっています。

Example 4.7. 

   ARMProg:
   00008000 E3A00001  MOV      r0,#1
   00008004 EB000004  BL       0x801c
   00008008 E3A02003  MOV      r2,#3
   0000800C E3A00018  MOV      r0,#0x18
   00008010 E59F1000  LDR      r1,0x8018
   00008014 EF123456  SVC      0x123456
   00008018 00020026  <Data> '&' 0x00 0x02 0x00
   0000801C E28FC001  ADR      r12,{pc}+9 ; #0x8025
   00008020 E12FFF1C  BX       r12
   ThumbProg
   00008024     2102  MOV      r1,#2
   00008026     4770  BX       r14
Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0203GJ
Non-Confidential