0

コンテキストスイッチに関するインラインアセンブリ命令について別の質問があります。このコードは機能するかもしれませんが、100%かどうかわからないので、このコードをstackoverflowのプロに送信します;-)

arm7TDMIにgcc(最適化なし)を使用してコンパイルしています。ある時点で、コードはコンテキスト切り替えを実行する必要があります。

/* Software Interrupt */
/* we must save lr in case it is called from SVC mode */
#define ngARMSwi(code) __asm__("SWI %0" : : "I"(code) : "lr")
// Note : code = 0x23 

コンパイルされたコードを確認すると、次の結果が得られます。

svc 0x00000023

これをコーディングした私の前の人は「lrを保存する必要があります」と書いていますが、コンパイルされたコードでは、lrが保存されている痕跡は見当たりません。

コードが間違っている可能性があると思う理由は、リセット例外が発生する前にプログラムがしばらく実行され、コードが最後に実行するのはコンテキストスイッチであるためです...

4

2 に答える 2

0

この__asm__ステートメントはlr、破壊されたレジスターとしてリストされます。これは、必要に応じてコンパイラがレジスタを保存することを意味します。

保存が見られないので、コンパイラがそのレジスタを使用していなかったと推測できると思います(少なくともテストケースでは)。

于 2012-03-27T14:24:15.353 に答える