私はC言語で書かれたライブラリと、ARM用のアセンブリが混在しています。以前はarmv6用にコンパイルされていました。今私はそれをarmv7にアップグレードしようとしています。ただし、ARMv7では許可されていない命令stmdb sp!, {pc}
を持つ割り込みハンドラがあります。 armv7に相当する命令は何でしょうか?私はstr r15, [sp, #-4]!
を試しましたが、それは動作しません。armv7:stmbはPCを持っていません
2
A
答えて
2
PUSH
とPOP
手順については、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モードの両方で頻繁に必要とされる。しかし、実際にははで、プログラムカウンタをスタックに保存する目的はありますか?他の方法で達成できないだろうとしていることは、何をすることができますか?
2
「armv7」はやや一般的です。実際のチップは何ですか? ARMv7-M用にコンパイルしていますか?次にPUSH {PC}
を試してください。私はそれが唯一の問題ではないことを期待していますが、あなたが走る唯一の問題です。私はあなたがいくつかのスニペットを投稿して、あなたが移植している特定の環境をより詳細に記述するべきだと思います。
関連する問題
- 1. armv7はビルドに含まれていません
- 2. ARMv7にクロスコンパイルできません
- 3. なぜUnixはfork()を持っていますが、CreateProcess()は持っていませんか?
- 4. DD Android to PCはコピーされていません
- 5. なぜ私はDJIMissionManagerDelegateを持っていませんか?
- 6. ActiveRecord specific selectはpaperclip urlを持っていません
- 7. DocumentBuilderFactoryはJDK 1.8.0_121でsetFeatureを持っていませんか?
- 8. windows RabbitMQはsbinフォルダにrabbitmqadminを持っていません
- 9. 私はgitからプロジェクト全体を持っていません
- 10. ユーザーはdjango形式のプロフィールを持っていません
- 11. System.Net.WebRequestはMonotouchでAcceptプロパティを持っていません
- 12. 私はAirPlayFeatureを持っていません
- 13. 私はUltimate IntelliJでJava Enterpriseを持っていません
- 14. Eclipseは私の持っているモジュールをインポートしません
- 15. 私のページはスクロールバーを持っていません
- 16. Herokuはrails4のプリコンパイル資産を持っていません
- 17. ユーザーはdcf_profileを持っていません:RelatedObjectDoesNotExist
- 18. sinatraとHerokuはRAILS_ROOTやRail.rootを持っていません
- 19. asyncは反復でオブジェクト全体を持っていません
- 20. あなたは許可ポリシーを持っていません
- 21. VS2010プロジェクトはx64プラットフォームターゲットを持っていません
- 22. Autowired ApplicationContextはメソッドgetBeanを持っていません
- 23. 私はインテリジェントにsbtコンソールを持っていません
- 24. 私はgradle.buildを持っていません、なぜですか?
- 25. ng:areq fnは関数を持っていませんobjectService angularjs es6
- 26. Android sdk manager私はAndroidサポートライブラリを持っていません
- 27. タイプオブジェクトは 'get_or_create'属性を持っていません
- 28. Genymotion "仮想デバイスはIPアドレスを持っていません"
- 29. pkg-configはパスに入っていても.pcファイルを見つけることができません
- 30. 画像をデバイスからPCにプルできませんが、画像はPC内で表示できません
私はなぜ割り込みハンドラでスタックにPCを押し込むのかわかりません。 push文が実行されると、pcはpush文をポイントします(実際には4バイト後)。 – Sven
@Svenそれはまさに私が言ったことですか?これは_porting artifact_かもしれません。 32bit x86上では、プログラムカウンタを読み込む唯一の方法はスタックにプッシュすることです(次の命令への 'call 'を介して)、その後すぐにそれをレジスタにポップします。そのような奇妙なことはARMには必要ありませんでした。したがって、私は「確かにそれはタイプミスではありませんか?」と尋ねました。 –