ファームウェアmodを書き込もうとしています(既存のファームウェアには、ソースコードがありません) すべてのThumbコード。ファームウェアパッチのためのARM/Thumbコード... gccアセンブラ/リンカをBLへの絶対アドレスへの通知方法?
誰もが、これを行うにはどのように任意のアイデアを持っているgcc as
中(GAS)アセンブラん: 使用BL
手動でオフセットを計算することなく、BL
は「(ない私のコードでは、いくつかの既存の機能にする際に..しかし、私現在
に)そのアドレスを知っている私はBL
を使用したい場合は、...私が持っている: は私のコードに戻って - 図を-GOとのすべての前の命令をアセンブルすることから生じるすべてのバイトを追加関数私は書いています - 私の関数の最初のアドレスを追加します(私は指定します私が書いているものの開始アドレス)を とし、電話をかけたいfirmfunc関数のアドレスを差し引く
すべてこれは...できるだけオフセットを計算することです既存のファームウェア機能を呼び出すためにbl
オフセットを書き込むには? そして、私はそのBLの前にコードを変更したら、私はそれを再び手でやり直さなければなりません!
は、私が代わりにBL
の... BX
権利を使用することを学びたいはまた、私はかなりBXを理解していない理由ですに..を参照してください。私は絶対アドレスにジャンプするためにBXを使用する場合、実際のアドレスを1つ増やす必要がありますか?ThumbコードからThumbコードをキャッシングすると(lsbバイト1を維持するために)... CPUがサムコードを認識しますか?
は相対的絶対的なものではなく、あなただけのプログラムカウンタの相対アドレスに分岐することができます。これは固定語長の命令セットで、モード切替えが可能ですが、レジスタに限定されているbxを使用するか、上に示したように、または可能であればモードに基づいて使用します(アームモードでのみ動作します)ldr pc 、= function_nameは長い枝であり、別の単語(可変長語命令のような)を使用しますが、bxのように分岐リンクではありません。 –
ありがとう、良い説明のために。しかし、私はファームウェアの既存の親指機能をBLにすることができたいと思っています。そのために私はアドレスを知っています。この方法では、私はLRを混乱させる必要はありませんが、アセンブラやリンカスクリプトにこれを入れる方法がわかりません...もし私がBL LABELをしたら、アセンブラにLABELそれは私のコードではないからです...そして、それを教える方法がわからないから – vmanta
私は答えを受け入れます、それは良い情報です...誰でも知っていればまだ.. pls reply。方法があるはずです。リンカーはどのようにインポートする関数(コードが呼び出す外部関数)にリンクするのですか?asmやリンカーのスクリプトでは、その指示にどのような指令を使用しますか? – vmanta