2011-10-21 8 views
2

私はC言語で書かれたライブラリと、ARM用のアセンブリが混在しています。以前はarmv6用にコンパイルされていました。今私はそれをarmv7にアップグレードしようとしています。ただし、ARMv7では許可されていない命令stmdb sp!, {pc}を持つ割り込みハンドラがあります。 armv7に相当する命令は何でしょうか?私はstr r15, [sp, #-4]!を試しましたが、それは動作しません。armv7:stmbはPCを持っていません

答えて

2

PUSHPOP手順については、REGリストでPCの使用に関する具体的な制限事項があります、動作モードに応じて、以下を参照してください。

ARM Instruction Set Reference, PUSH/POP

具体的には、親指で[2]がありますpush {pc}操作(これはの操作がstmfd sp!, {pc}であると同じです)はstmfd sp!にマップされています。

あなたが(なぜ他のあなたは/持っている、それはコードをカーネルいない場合割り込みハンドラが必要です)カーネル・コードをコンパイルしているのであれば、あなたはThumb-2のカーネルをコンパイルしているかどうかを確認してください。

つまり、あなたはstmfd sp!,{pc}命令が発生したと言っていますが、それは誤植ではないと思いますか? stmfd sp!,{lr}(およびその兄弟、ldmfd sp!, {pc} - ここではPC)は、通常の/完全な正当なものであり、ARMモードとThumb-2モードの両方で頻繁に必要とされる。しかし、実際にはで、プログラムカウンタをスタックに保存する目的はありますか?他の方法で達成できないだろうとしていることは、何をすることができますか?

+0

私はなぜ割り込みハンドラでスタックにPCを押し込むのかわかりません。 push文が実行されると、pcはpush文をポイントします(実際には4バイト後)。 – Sven

+0

@Svenそれはまさに私が言ったことですか?これは_porting artifact_かもしれません。 32bit x86上では、プログラムカウンタを読み込む唯一の方法はスタックにプッシュすることです(次の命令への 'call 'を介して)、その後すぐにそれをレジスタにポップします。そのような奇妙なことはARMには必要ありませんでした。したがって、私は「確かにそれはタイプミスではありませんか?」と尋ねました。 –

2

「armv7」はやや一般的です。実際のチップは何ですか? ARMv7-M用にコンパイルしていますか?次にPUSH {PC}を試してください。私はそれが唯一の問題ではないことを期待していますが、あなたが走る唯一の問題です。私はあなたがいくつかのスニペットを投稿して、あなたが移植している特定の環境をより詳細に記述するべきだと思います。

関連する問題