2016-07-14 52 views
0

現在、Cortex-MコアのARMアセンブリを理解しようとしています。Cortex M4 Thumbアセンブリ関数のアドレス

Thumbモード(コアでサポートされている唯一のモード)にある関数は、そのアドレスによって呼び出され、アドレスのLSBが高く、宛先がThumbコードであることを示しています。

アセンブリで

私はラベルのデータが実行可能であるアセンブラに指示する機能「Reset_Handler」の前に、次の書き込み/機能:

.type Reset_Handler, %function 
    Reset_Handler: 
    MOV R0, R0 # just do something 

私は今、ラベル

のアドレスをロードする場合
LDR R0, =Reset_Handler 

R0のLSBが設定されています。

この.typeディレクティブを間接呼び出しの関数として使用するすべてのラベルの前に配置する必要がありますか?

また、アセンブラに正しいアドレスを自動的に決定させる方法がありますか?

関数のコードをRAMにコピーしてこの関数のアドレスをロードする場合は、データが格納されている「実際の」アドレスを取得するために自分でLSBをクリアする必要があります。

この場合、.type指令が必要ですか?私は、これがLSBを設定する必要があるので、私がベクトルテーブルにアドレスを入れたいと思うとすぐに必要であることを知っています。

+0

どのアセンブラを使用していますか(アセンブリ言語はアセンブラで定義されていますが、これは一般的ではありません) –

答えて

2

住所(ラベル)には2種類あります。 1つのタイプは呼び出すアドレス、関数のエントリーポイントのアドレス、そしてサムについてはbxまたはpopはlsbitセットが必要です。もう1つは、データ項目のアドレス、文字列の先頭、配列の先頭などで、lsbitが矛盾してしまうのを防ぐためのものです。したがって、bxを使用する前にアドレスにコードを追加する必要がないかぎり、ラベルを定義するときまたはラベルを使用するときに、アセンブラに解決策が必要になります。

gnuアセンブラでは、ラベルの前に.thumb_funcが必要です(おそらく他の方法もあります)、アセンブラにはアセンブラに必要なものが必要です。

関連する問題