Everything
3.5 ASM文

CA78K0Rでは__asm()関数や#asm~#endasmを用いて関数中にアセンブリ記述をしますが,CC-RLでは#pragma inline_asmで宣言したアセンブリ記述関数をインライン展開します。CcnvCA78K0Rでは,__asm()や#asm~#endasm内のアセンブラ命令を実行するinline_asm関数をファイル先頭に作成し,アセンブラ命令の記述箇所ではこの関数を呼び出すように変換します。

 

CA78K0Rの書式は以下の通りです。

#asm
  :    /* アセンブリ記述 */
#endasm
__asm(“アセンブリ記述”);

CC-RLの書式は以下の通りです。

#pragma inline_asm [(] 関数名 [, … ] [)]
関数宣言 {
  :    /* アセンブリ記述 */
}

 

-

inline_asm関数内のアセンブリ記述に,インデントとしてタブ文字を追加します。

-

作成する関数名は__inline_asm_func_00000~__inline_asm_func_99999とし,関数の数が100000件を超える場合は,エラーとなります。

-

#asm~#endasmまたは__asmの中にラベルがある場合には,メッセージを出力します。CC-RLにて,#pragma inline_asm を指定した関数の中にラベルを書くと,コンパイル時にエラーとなります。このためCcnvCA78K0Rでは,#asm~#endasmまたは__asmの中にラベルがある場合には,メッセージを出力します。コンパイル・エラーを回避するには,アセンブリ記述のラベルをローカル・ラベルに変更する必要があります。詳細は,CC-RLのユーザーズ・マニュアルを参照してください。

-

以下のようにダブルクォートを含めて#defineマクロの変換対象とする場合は,__asm( )関数からinline_asm関数を生成できません。このような場合は,メッセージを出力し,入力ファイルの内容を変換せずそのまま出力します。予めマクロを展開した状態に修正してから変換してください。

例) #define MAC “nop”

  __asm(MAC);

-

__asm( )内の文字列に'\n'や'\t'といった制御文字を含む場合は,変換後にアセンブル・エラーとなります。予め制御文字を削除してから変換してください。

-

#asm~#endasm内のアセンブリ記述のコメント(“;”)にC記述のコメント(“/*”)を含む場合は,変換後にコメントの範囲が不正となります。予めコメントを削除してから変換してください。

 

[例]

パターン1

変換前

void func(void)
{
  __asm("nop");
}

変換後

#pragma inline_asm __inline_asm_func_00000
static void __inline_asm_func_00000(void)
{
    nop
}
 
void func(void)
{
    __inline_asm_func_00000();
}

パターン2

変換前

void func(void)
{
  #asm 
    nop
  #endasm
}

変換後

#pragma inline_asm __inline_asm_func_00001
static void __inline_asm_func_00001(void)
{
    nop
}
 
void func(void)
{
    __inline_asm_func_00001();
}

パターン3

変換前

#define ASM_NOP __asm("nop");

変換後

#pragma inline_asm __inline_asm_func_00002
static void __inline_asm_func_00002(void)
{
  nop
}
#define ASM_NOP __inline_asm_func_00002();

パターン4

(変換後にエラー)

変換前

void func()
{
  __asm("\tnop");
}

変換後

#pragma inline_asm __inline_asm_func_00003
static void __inline_asm_func_00003(void)
{
    \tnop
}
 
void func()
{
    __inline_asm_func_00003();
}