4

現在、ARMv7 命令セットを実装する ARM Cortex A9 用の逆アセンブラを実装しようとしています。

そのために、ここからダウンロードできるマニュアル「DDI0406C_b_arm_architecture_reference_manual.pdf」を使用しています(arm Webサイトに登録した後):

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.set.architecture/index.html

このマニュアルでは、命令の詳細を含む A8.8 の部分で、1 つの命令に対して複数のエンコーディング (A1、A2 など) があり、すべてが ARMv7 で実装されているように見える理由がわかりません。

また、ARM Cortex A9 は Thumb-2 を使用していたため、A1/A2/... エンコーディングも実装していますか、それとも T1/T2... のみを実装していますか?

このマニュアルのすべての部分がエンコーディングに関連していることを本当に読みましたが、どのエンコーディングがプログラムに使用されているかを知る方法をまだ理解していません。

4

3 に答える 3

3

命令の異なるエンコーディングは、機能的に異なることを行います。

異なるエンコーディングの使用例の 1 つは、次のとおりです。A8.9.12 ADR

この命令は、即値を PC 値に加算して PC 相対アドレスを形成し、その結果をデスティネーション レジスタに書き込みます。

命令が としてエンコードされている場合A1、オフセットはゼロまたは正として解釈される必要があります。 としてエンコードされている場合A2、オフセットは負です。

別の例はA8.8.132 POP

リストに複数のレジスタが含まれている場合、命令はエンコード A1 にアセンブルされます。リストに含まれるレジスタが 1 つだけの場合、命令はエンコード A2 にアセンブルされます。

POPおそらくパフォーマンス上の理由から、さまざまなマイクロコードを作成するために、さまざまなエンコーディングが作成されると想像できます。

質問の 2 番目の部分については、Cortex-A9 は ARMv7-A アーキテクチャの CPU であり、指摘したマニュアルで指定されているすべての命令をサポートしています。Cortex™-A9 Technical Reference Manualもお読みください。

于 2013-04-19T19:57:36.043 に答える
1

命令ストリーム内で ARM と Thumb を実際に区別する方法はありません。関数が呼び出される方法に基づいてのみ決定できます (最下位ビットが 1 に設定されている場合は親指、それ以外の場合はアーム)。

ARM-Encoding は非常に「安定」しています。いくつかの A1 エンコーディングしか見つかりません。BLX は A2 エンコーディングが指定されている例ですが、これは主に、新しい ARM-ARM が古いものとは異なる構造になっているためです。BL と BLX は 2 つの異なる命令であり、BLX は追加の命令空間に追加されました (通常、条件に使用される上位 4 ビットは 1111 に設定されます。これは、v5 より前の ARM では「決して実行しない」ことを意味していました。

Thumb-Encodings の場合は異なります。より圧縮された命令空間に配置する必要があったため、多数あります。ページ A6-220 には、2 つまたは 1 つのハーフワードで構成される Thumb 命令を決定する方法に関する情報があります。 .

于 2013-04-19T16:13:09.560 に答える
1

プロセッサがアーム モードの場合、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 のマニュアルがあります。

于 2013-04-19T17:59:10.200 に答える