Thumb では、「32 ビット」命令は依然として 2 つの別個のハーフワードで構成されているため、「最初のハーフワード」はencodingの最初のハーフワードであり、メモリ内のレイアウトについては何も述べていません。Thumb 命令はハーフワードでアラインされているため、任意のメモリ ワードに 2 つの 16 ビット命令、16 ビット命令と 32 ビット命令の半分、2 つの異なる 32 ビット命令の 2 つの半分、または 32 ビット命令全体を格納できます。 -ビット命令。
概念的には、プロセッサは一度に 1 つのハーフワードをデコードするため、上記のビット パターンのいずれかを検出すると、この命令を実際に実行する前に、次のハーフワードもデコードする必要があることがわかります。実際には、Cortex-M3/M4はメモリから 32 ビット ワード全体を実際にフェッチするだけなので、これは多少複雑になります。そのため、「命令フェッチ」の数と実際にデコードおよび実行された命令の数との相関関係は、コード自体に依存します。これらのフェッチが、パイプラインが個々のハーフワードを丸呑みする 4 バイトのバッファーを補充することであると想像してみてください (これは、私が知る限り、真実からそれほど離れていない可能性があります)。
したがって、上位ビットにこれらの値の 1 つを含むハーフワードがある場合、それが 32 ビット エンコーディングの前半であることがわかり、次のハーフワードと組み合わせて解釈する必要があります。逆に、上位ビットに他の値を持つハーフワードがある場合、前のハーフワードが何であったかに応じて、16 ビット エンコーディングか、32 ビット エンコーディングの後半のいずれかになります。
命令は常にリトル エンディアンであるため、32 ビット エンコーディングの実際のメモリ内レイアウトは次のようになります。アドレス A は偶数です。
--------------------------------
address A | bits 7:0 of first halfword |
--------------------------------
A+1 | bits 15:8 of first halfword |
--------------------------------
A+2 | bits 7:0 of second halfword |
--------------------------------
A+3 | bits 15:8 of second halfword |
--------------------------------