3

ワード内のバイトが 16 ビット命令または 32 ビット命令を表しているかどうかはどうすればわかりますか?
ARM ARMv7M について言及しましたが、16 ビット命令か 32 ビット命令かを区別する方法が明確ではありません。
それは言う
If bits [15:11] of the halfword being decoded take any of the following values, the halfword is the first halfword of a 32-bit instruction:
• 0b11101 • 0b11110 • 0b11111. Otherwise, the halfword is a 16-bit instruction

プロセッサは常にハーフワードをフェッチし、それらを調べて、それが 16 ビットか 32 ビットかを判断するということですか?
最初のハーフワードはどういう意味ですか? ワードのビット [31-16] またはビット [15-0] ?

32 ビットの場合、それが 32 ビット命令か 16 ビット命令かを知ることができますか?

ありがとう。

4

1 に答える 1

6

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 |
          --------------------------------
于 2015-03-04T22:00:54.067 に答える