web-dev-qa-db-ja.com

ARM、Thumb、およびThumb 2の命令エンコーディングの違いは何ですか?

命令セットについて少し混乱しています。 Thumb、ARMおよびThumb 2があります。私が読んだものから、Thumb命令はすべて16ビットですが、ARMv7Mユーザーマニュアル(ページvi)にはThumb上記の16ビットおよびThumb 32ビット命令。

今、私はこの混乱を克服しなければなりません。 Thumb 2は16ビットおよび32ビットの命令をサポートすると言われています。実際、ARMv7MはThumbだけでなくThumb 2命令をサポートしていますか?

もう一つ。 Thumb(32ビット)はARM 32ビットの命令と同じですか?

31
71GA

ああ、ARMとその愚かな命名...

これはよくある誤解ですが、公式には「Thumb-2命令セット」というものはありません。

ARMv8を無視すると(すべての名前が変更され、AArch64が事態を複雑にします)、ARMv4TからARMv7-Aまで、2つの命令セット:ARMとThumbです。両方とも32 「ビット」は、32ビットアドレスの32ビット幅のレジスタで最大32ビット幅のデータを操作するという意味で使用されます。実際、それらが重複する場合、まったく同じ命令を表します。命令エンコード異なり、CPUは事実上、パイプラインに切り替え可能な2つの異なるデコードフロントエンドを持っています。明確にするために、「32ビット」と「 16ビット」...

ARM命令には、4バイトのアライメントを必要とする固定幅の4バイトエンコーディングがあります。 Thumb命令には、2バイトのアライメントを必要とする可変長(2または4バイト、現在「ナロー」および「ワイド」として知られている)エンコードがあります-ほとんどの命令には2バイトのエンコードがありますが、blおよびblxには常に4バイトのエンコーディングがあります*。 「Thumb-2テクノロジー」を導入したARMv6T2には、本当に混乱する部分がありました。 Thumb-2には、より多くの命令をThumbに追加して(ほとんど4バイトエンコーディングで)ARMとほぼ同等にするだけでなく、実行状態を拡張してほとんどのThumb命令の条件付き実行を可能にし、最後に以前の個別のARMおよびThumb構文を置き換え、コードを1回記述し、修正せずにいずれかの命令セットにアセンブルできるようにするまったく新しいアセンブリ構文(UAL、 "Unified Assembly Language")。

Cortex-MアーキテクチャはThumb命令セットのみを実装します。ARMv7-M(Cortex-M3/M4/M7)は、VFP命令の条件付き実行とエンコードを含む「Thumb-2テクノロジ」のほとんどをサポートしますが、ARMv6-M(Cortex- M0/M0 +)は、少数の4バイトシステム命令の形式でThumb-2のみを使用します。

したがって、新しい4バイトエンコーディング(およびARMv7リビジョンで後から追加されたエンコーディング)は、まだThumb命令です。それらの「Thumb-2」の側面は、4バイトエンコーディングを使用でき、itを介して(ほとんど)条件付きで実行できます(そして、それらのメンモニックはUALでのみ定義されていると思います)。

* ARMv6T2より前は、bl(またはblx)が4バイト命令として実行されるか、2バイト命令のペアとして実行されるかについて、実際には複雑な実装の詳細でした。アーキテクチャの定義は後者でしたが、ペアで順番に実行することしかできなかったため、パフォーマンス上の理由でそれらを単一の命令に融合することで失うものはほとんどありませんでした(途中で割り込みを取る能力を除く)。 ARMv6T2は、融合された単一命令の実行に関して、物事を再定義しました。

53
Notlikethat

Notlikethat's answer に加えて、それが示唆するように、ARMv8は混乱を減らすためにいくつかの新しい用語を導入します(もちろん、さらに新しい用語を追加します)。

32ビットの実行状態(AArch32)と64ビットの実行状態(AArch64)があります。

32ビットの実行状態は、T32( "Thumb")とA32( "ARM")の2つの異なる命令セットをサポートします。 64ビットの実行状態は、A64の1つの命令セットのみをサポートします。

すべてのA64は、すべてのA32と同様に、サイズが32ビット(4バイト)であり、4バイトのアライメントが必要です。

多くの/ほとんどのA64命令は、32ビットと64ビットの両方のレジスターで動作することができます(または、基本となる64ビットの同じレジスターのおそらく32ビットまたは64ビットのビュー)。

すべてのARMv8プロセッサ(すべてのARMv7プロセッサと同様)は、T32命令セットでThumb-2命令をサポートしています。

13
unixsmurf