問題の正確な性質に応じて
、あなたは新しい命令の一握りに大きく依存しているかどうか、別の可能性は ARMv4Tでは用にコンパイルするかもしれません。 ARMv5Tより前のバージョンでは、ldm
がPCにインタワーキングされていないため、コンパイラはv4Tターゲットに対してその形式のリターン命令を発行しません。いくつかの簡単なテストコードのため、-march=armv5t
してコンパイルすると、このようにしてスタックフレームを生成する:
8: e92d4070 push {r4, r5, r6, lr}
...
4c: d8bd8070 pople {r4, r5, r6, pc}
-march=armv4t
と同じことをコンパイルする同じプロローグを使用するが、間接的な復帰シーケンスで(上記のループ内から条件付きリターンたのに対し今、それはまた、関数の最後に出て移動しています):もちろん
48: da000006 ble 68 <func+0x68>
...
68: e8bd4070 pop {r4, r5, r6, lr}
6c: e12fff1e bx lr
、それは、2つの別々のポップと同じ効果は、システムの根本的なバグが何であるかに依存しているかどうか - それはのようなものだ場合ldm
とinのデータフェッチの間のタイミングジャンプ自体の命令フェッチは、これは十分に同等かもしれません。 AHBバーストが一定のサイズを超えて切り捨てられるような壊れたメモリシステムのように、おそらく全く異なるものになる可能性があるので、単一のldm
で転送されるレジスタの数が問題になりますが、 memcpy
のように簡単に修正することはできません。
いいえ、あなたはできません。どうしてあなたはそれをやりたいのですか? –
あなたはもちろん組み立てることができますし、gccはオープンソースなので変更することができます。しかし、C言語そのものに特有のターゲットはありません。コンパイラにはいくつかの機能がありますが、必ずしも1つのツールチェーンから別のツールチェーンに移動する必要はありません。 –
コンパイラはそれらを翻訳しない命令を生成しています。アセンブラはそれらを翻訳し、オープンソースであるため、gnuアセンブラで問題を攻撃することができます。一般的ではありません。 –