4.4.2. ベニアを使用した C、C++、およびアセンブリ言語のインターワーク

一方の状態で実行するようにコンパイルされた C および C++ コードでは、他方の状態で実行するように設計されたアセンブリ言語コードを呼び出すことが可能であり、またこの逆も可能です。このようなインターワークを行うには、非インターワークルーチンとして発呼側ルーチンを記述して呼び出しを行います。アセンブリ言語からの呼び出しを行う場合には、BL 命令を使用してこの呼び出しを行います(Example 4.8参照)。次に、以下の手順を実行します。

Note

この方法で使用されるアセンブリ言語コードまたはユーザライブラリコードは、必要に応じて AAPCS に準拠させる必要があります。

Example 4.8. 

     /**********************
     *       thumb.c      *
     **********************/
     #include <stdio.h>
     extern int arm_function(int);
     int main(void)
     {
          int i = 1;
          printf("i = %d\n", i);
          printf("And now i = %d\n", arm_function(i));
          return (0);
     }

     ; *****
     ; arm.s	
     ; *****	
     PRESERVE8
     AREA  Arm,CODE,READONLY ; Name this block of code.	
     EXPORT arm_function	
arm_function
     ADD   r0,r0,#4           ; Add 4 to first parameter.	
     BX    lr                 ; Return	
     END

このモジュールのビルドとリンクを行うには、以下の手順を実行します。

  1. 「armcc --thumb -g -c --apcs /interwork thumb.c」と入力し、Thumb コードをコンパイルします。

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

  3. 「armlink arm.o thumb.o -o add --info veneers」と入力し、2 つのオブジェクトファイルをリンクしてインターワークベニアのサイズを表示します。

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

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