7

私が理解している限り、ARM Cortex-M CPU は常に Thumb 状態です。つまり、次のことを意味します。

プログラム カウンタが奇数 (LSB = 1) であることによって示される Thumb 状態。ARM 状態に戻すことは許可されていないため、偶数アドレスに分岐すると例外が発生します。

ただし、CortexM0 と M4 CPU を使用している間、PC は常に偶数です。分岐するたびに、LR は PC+1 を記録し、戻るたびに PC は LR-1 を返します。

たとえば、lr = 0x0000_01D5 の場合、

実行する

BX lr

その場合、PC は 0x0000_01D5 になるはずですが、0x0000_01D4 になります。

これは不可能ではありませんか?

どんなコメントでも大歓迎です。

4

3 に答える 3

8

Cortex-M4 テクニカル リファレンス マニュアルから:

2.3.1プログラムカウンター

レジスタ R15 はプログラム カウンタ (PC) です。

ビット [0] は常に 0 であるため、命令は常にワード境界またはハーフワード境界に揃えられます。

からの読み取りはPC、奇妙なアドレスを返すべきではありません。ただし、 に書き込むとPC、値の LSB が EPSR T ビットにロードされます。Cortex -M3 Devices Generic User Guide - 2.1.3 より。コアレジスタ

親指の状態

Cortex-M3 プロセッサは、Thumb 状態での命令の実行のみをサポートします。T ビットを 0 にクリアするには、次のようにします。

instructions BLX, BX and POP{PC}

restoration from the stacked xPSR value on an exception return

bit[0] of the vector value on an exception entry or reset.

T ビットが 0 のときに命令を実行しようとすると、フォルトまたはロックアップが発生します。詳細については、ロックアップを参照してください。

PCつまり、通常の状況では、偶数の値を読み取ることはできますが、そのような値を書き込むことはできません。

于 2013-09-06T12:01:21.100 に答える
4

そんな戸惑いもありました。lsbit は、アドレスが BX によって使用される状況のために設定されます。lsbit は、PC 自体に入ると取り除かれます。単純な PC 相対アドレッシングを逆アセンブルすると、何が起こっているかがわかります。

于 2013-09-06T13:53:16.473 に答える
-2

4,294,967,296 [2^32] のメモリ ロケーションがありますが、実際のデータ バスは 8 ビット幅しかありません。

16 ビット命令の場合、命令ロードごとに 2 回のメモリ アクセスが必要です。ここから「エンディアン」に関する引数が始まります。どちらの順序でも、0 で終わるアドレスの 1 バイト目で 2 バイトが読み込まれます。

[ため息] ARM データ バスが 16 [または 32] ビット幅だった場合、PC のビットを忘れて、命令空間が 2 倍 [または 4 倍] になる可能性があります。

于 2014-08-29T07:31:05.160 に答える