アセンブラ命令の記述(#pragma inline_asm)


アセンブリ記述関数をインライン展開します。

[機能]

-

#pragma inline_asm で宣言したアセンブリ記述関数をインライン展開します。

-

アセンブラ埋め込みインライン関数の呼び出し規則は通常関数の呼び出し規則と同様です。

[方法]

-

対象関数より前で#pragma inline_asm宣言を行います。

#pragma inline_asm  [(]関数名 [,...][)]

[制限]

-

#pragma inline_asmは,関数本体の定義の前に指定してください。

-

#pragma inline_asmで指定した関数に対しても外部定義が生成されます。

-

コンパイラは#pragma inline_asmを指定した関数内に書いた文字列を,そのままアセンブラに渡します。

-

アセンブリ記述は,プリプロセッサの処理対象となります。このため,アセンブリ言語で使用される命令やレジスタと同じ名前のマクロを#defineでマクロ定義する場合は注意してください。

アセンブリ記述関数内にラベルを書くと,インライン展開の数だけ同一名のラベルが作られます。この場合はアセンブリ記述のローカル・ラベルを使用してください。ローカル・ラベルはアセンブリ・ソースでは同一名ですが,アセンブラが自動的に別名に変換します。
ローカル・ラベルについては,「.LOCAL」を参照してください。

[使用例]

Cソースを以下に示します。

#pragma inline_asm func
void func(int x) {
        movw    !_a, ax
}
void main(void) {
          :
        func(3);
          :
}

 

コンパイラの出力アセンブリ・ソースは,以下のようになります。

        .SECTION        .textf, TEXTF
_func:
                :
        ._line_top inline_asm
        movw    !_a, ax
        ._line_end inline_asm
        ret
_main:
                :
        movw    ax,  #0x0003
        ._line_top inline_asm
        movw    !_a, ax
        ._line_end inline_asm
                :