下のような書き方で C 言語のソースファイル内に アセンブリコードを挿入します。

int test()
{
	volatile int i = 0;
	asm("\n\t"
		"mov r5, sp\n\t"
		"str r5, [sp, #4]\n\t"
		);
	return i;
}

\n\t という部分は、gcc を -S オプションで出力したときの、 アセンブリコードリスト内で見やすくするためのものです。 行末は \n のみでもかまいません。

この例は、スタックポインタの内容を返す関数のサンプルです。

mov r5, sp

で、スタックポインタのアドレスを r5 レジスタに代入しています。

str r5, [sp, #4]

で、スタックポインタの 4 バイト後ろ ( 変数 i ) に、 r5 の値を代入しています。

局所変数はスタックに領域が作られます。#4 という場所は、 gcc の最適化レベルによって変わる可能性があります。 最適化無しオプション ( -O0 ) でコンパイルするとうまく動くと思います。

−O2 のコードに挿入したインラインアセンブラのコードは、 −O0 では動かないくらいの感覚で書いたほうが良いと思います。

変数 i を↓このように宣言しているのは、

volatile int i = 0;

最適化によって i の場所が省略されなくするためです。 C 言語の最適化機能が、C のコードによって使われていない変数は 存在自体、削除してしまうことがあるからです。 同様に、何もしない空のループ等も省略されてしまうことがあります。

インラインアセンブラのコードから C 言語側の変数が使われているかどうかについては、 gcc はチェックしてくれません。 C 言語の方で宣言して、インラインアセンブラからのみ使う変数は、 volatile を付けて、最適化しないで! というメッセージをコンパイラに伝える必要があります。

libnds のソースファイルをダウンロードすると、 アセンブリのサンプルをたくさん見ることができます。

DevKit に入っている libnds はコンパイル済みのものなので、 ソースを見たい場合は、別途いただいてくる必要があります。

参照


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-10-27 (日) 17:45:18 (2408d)