プロセッサがアーム モードの場合、Ax エンコーディングはアームであり、これらのエンコーディングを使用して検出したビットをデコードします。複数の A1、A2 がある場合、別の機能または理由があることは明らかです。これらの 2 つの命令は別個のものと見なすことができます (たとえば、x86 での mov 命令の乱用を見てください。多くのエンコーディングがあります)。各エンコーディングを個別の「命令」として扱います。
それから、Tx バリアントがあります。これらは、thumb および thumb2 拡張機能です。サムはすべて 16 ビット (bl は 2 つの別個の 16 ビット命令としてデコードできます) であり、その下の説明は、「すべてのサム バリアント」または「現在までの armv4t」またはそのような言語を示しています。thumb2 拡張機能はすべて 32 ビットで、最初の 16 ビットは Thumb の世界では未定義の命令です。これらには、どのアーキテクチャがそれらをサポートするかについて、より多くの制限があります。
これらのプロセッサの 1 つに対して逆アセンブラを完全に作成することはできません。同じ理由で、x86 または他の多くのプロセッサ (すべて?) に対して逆アセンブラを作成することはできません。すべての命令が 1 つのモード (腕または親指または親指 + 親指 2) であるがモードの混合 (腕 + 親指) ではない場合、すべてが固定命令長であり、すべてのデータとコードを単純に逆アセンブルできるため、実行することはできません。どんな問題にも。混合モードを逆アセンブルするには、基本的に命令をエミュレート/実行し、命令フローに従って (可変語長命令セットの逆アセンブラーのように) 遷移を見つけようとする必要があります。もちろん、遷移は最小負荷で複数の命令です。レジスタ、次にそのレジスタを bx します。命令の計算に数学が関係する場合があります。また、アドレス計算またはロードが bx の前の命令で発生するという保証はありません。したがって、その一部を実行して、プログラムを逆アセンブルすることで長い道のりを歩むことができます。
使用しているプロセッサでthumb2がサポート/許可されている場合、thumbコードへのエントリポイントを検出する際に可変命令長の問題が発生します。そして、すでにこれを行っていない限り、コードの実行に従って命令の開始位置を決定する必要があります (基本的な可変命令長の逆アセンブリ)。
テクニカル リファレンス マニュアルとアーキテクチャ リファレンス マニュアルを組み合わせると、アーキテクチャとそのアーキテクチャの実装 (trm) でアーム モードとサム モードが許可されているかどうかがわかります。A9 は、腕の親指と親指 2 の 3 つすべてをサポートしていると思います。
これまでのところ、アームをサポートしないことに限定されているのは cortex-m ファミリーだけであり、その thumb2 は、cortex-m0 (および m1) が armv6m であり、m3 および m4 が armv7m (数ダース (armv6m) の命令) であるため、大きく異なります。 armv7m の数十の thumb2 拡張機能に)。-m バリアント専用の個別のアーキテクチャ リファレンス マニュアルがあります。たとえば、armv7-m と armv7-ar のマニュアルがあります。