この質問に対する答えは見つかりませんでした。ARMアーキテクチャがアームモードからサムモードに切り替わるタイミングを教えてください。切り替えが機能するすべての方法を説明します。
1 に答える
答えはARMARM(ARMアーキテクチャリファレンスマニュアル)にあります。たとえば、ARM命令とThumb命令の両方でBXを見てください。これが宿題の質問である場合に備えて、より多くの指示があります。
また、例外が発生したときに何が起こるかについての擬似コードを見てください。
R14_=リターンリンク SPSR_ = CPSR CPSR [4:0]=例外モード番号 CPSR [5] = 0 ==リセットまたはFIQの場合 CPSR [6] = 1 CPSR [7] = 1 !=UNDEFまたはSWIの場合 CPSR [8] = 1 CPSR [9] = CP15_reg1_EEbit PC=例外ベクトルアドレス
上記の擬似コード(ARM ARM内)のコメントは、あなたの質問に対する別の答えを説明しています。
さて、明らかではなく、BXやその他の命令の説明で誤解を招く可能性があるのは、bxrmが常に状態を切り替えるとは限らないことです。サムBXの説明には、「ARMコードとサムコードの間の分岐」と記載されています。まるで親指を使っているかのように、常にコードを準備する必要があります。擬似コードは少し良い絵を描きますが、レジスタ内のアドレスのlsbitは、サムコードまたはアームコードのどちらに分岐しているかを示します。ただし、サムの説明にあるPCの擬似コードは誤解を招く可能性があります。サム命令は16ビットで、PCは一度に16ビット前進します0x00、0x02、0x04など。アームモードでは、命令は32ビットで、PCは0x00、0x04、0x08などになります(分岐命令ARMを参照してください)。ブランチはsigned_immed<<2、0,4,8などです。thumbブランチはsigned_immed << 1、0,2,4,6などです)
基本的に、混合モードプログラムがある場合、特にmov pc、lrの代わりにbx lrを返す場合は、Bの代わりにBXを使用します。したがって、thumb関数とarm関数の両方がbxlrを使用して戻ります。アームコーリングアーム、アームコーリングサム、サムコーリングアーム、サムコーリングサムの4つのケースすべてがカバーされています。
したがって、cpsrのTビットに影響を与える命令や、プログラムカウンターがどこかに分岐するような方法でプログラムカウンターに影響を与える命令を探してください。また、関心のある特定のファミリ/コア(ARM ARMを読む場合)、armv4t、armv6、armv6などに限定するように注意してください。おそらく、特定のコアのTRM(テクニカルリファレンスマニュアル)を入手することをお勧めします。同様に使用します。ARM ARMは非常に一般的であり、コアの数が時間の経過とともに増加するため、ARMARMの具体的な違いは明確ではありません。TRMが必要です。
ARM ARMの多くのリビジョンがあり、それらすべてにバグ/エラーが含まれています。意図的かどうかはわかりません。そのため、使用しているコアが実際にどのように機能するかを確認するには、常にハッキングが必要です。
2018年に編集
すべてのコアなどのリストを作成するつもりはありません。それがarmのドキュメントの目的です。
しかし、その答えは、ARMのWebサイトで入手できるアーキテクチャリファレンスマニュアルにあります。メールアドレスを犠牲にする必要があるかもしれませんが、それだけの価値はあります。
あなたが探しているキーワードはinterwork
、または相互作用です。古い/元のアームアームは、armv5 architectural reference manual
あなたが探して、T Flag
どの命令がそのフラグを変更するかを確認するために呼び出されます。armv7-mおよびおそらくarmv8-mARMの場合、インターワーキングサポートまたはインターワーキングアドレスを探すことができます。また、 PCに影響を与えるが、インターワーキングをサポートする、またはサポートしない命令のリストが表示されます。
armv7-a / rについては、まだインターワーキングブランチを探していますが、これまでのところセクションは表示されていません。Thumb state
との間の変更を探してくださいARM state
。親指の状態から腕の状態に移行するための手順のリストと、腕の状態から親指の状態に移行するためのリストを示すセクションがあります。
ARMv6(-Mではない)はarmv5およびarmv7 ARMにまたがっていますが、各命令/エンコーディングはそれをサポートするアーキテクチャを示しているため、相互作用する各分岐命令をウォークスルーして、armv6サポート(armv4およびarmv5)があるかどうかを確認する必要があります。も表示されます)。blx
armv6-m/armv7-mの一部ではないarmv4T/armv5Tにthumbエンコーディングがありますが、armv7のマニュアルはすべてではありませんが、そのblx
エンコーディングは現在、thumb2拡張機能の一部です。
これらすべてでサポートされる主な命令は次のとおりですBX
。他の命令は、状態を切り替えるために使用できるかどうかに関して、アーキテクチャによって異なります。エミュレーターを作成している場合は、幸運を祈ります。プログラミングをしている場合は、アーキテクチャーの調整を試みることができますが、疑わしい場合は、を使用してbx
ください。arm11-mpcore(Raspberry Piのような古いarm11ではない)には、aの後、pop pc
またはldr pc
そのデータが分岐命令に似ている場合にデータのプリフェッチを行う、文書化されていないバグがあることに注意してください。
私の推奨は、arm11 mpcoreでこれらの命令を使用するのではなく、代わりにarmv4tスタイルのポップまたは揮発性レジスタへのロードとbxを実行することです。pop {r3}; bx r3
ではなくpop {pc}
。副作用はわかりにくいです。たとえば、読み取りに作用する周辺機器に対して読み取りサイクルが発生する可能性があります。たとえば、UARTのデータレジスタから読み取り、文字が失われます。参考までに、これを見つけて確認するのに少し時間がかかりました。