2

私はこの組立ラインを持っています:

01000AD8: 979FF103      LDRLS    PC,[PC,R3,LSL #2]

PC = 0x01000AD8 の場合

R3 = 0x00000008

CDPS = 800000D3 (つまり、C=0、Z=0)

この行を実行すると、PC の新しい値は (LDRLS を正しく理解している場合*)

PC = 0x01000AD8 + 0x00000008 * 4 = 0x01000AF8

しかし代わりに、結果は 0x00000BAC です

なんで?

この行コードが実行されると、MMU がアクティブになることを追加できます。

PS * 私の研究では LDRLS の「LS」の意味がわかりませんでした...

編集:CPSR値を追加

4

2 に答える 2

3

最初の問題: ページ A2-11:

ARM 命令を実行する場合、PC は現在の命令のアドレス + 8 として読み取ります。

PC に 8 を追加するのを忘れました。

2 番目の問題: ページ A8-124:

Load Register は、ベース レジスタ値とオフセット レジスタ値からアドレスを計算し、メモリからワードをロードして、レジスタに書き込みます。

「メモリから単語をロードする」ステップを忘れました。

(ページ番号は ARMv7-A の ARM アーキテクチャ リファレンス マニュアルからのものです。実際のページ番号は異なる場合があります。)

于 2011-10-19T22:06:15.083 に答える
2

PC は、オペランドとして使用される場合、常に 2 命令先にあるため、アーム モードの場合は 8、親指モードの場合は 4 を追加します。

LDR は命令: ロード レジスタです。LS は、等しい場合に LDREQ が低いか同じかどうかを意味します。アーム アームで「コンディション コード」を検索します。この場合、命令 0x9 の上位 4 ビットは LS であり、下位または同一の場合に実行されます。ほとんどの命令では、常に実行されることを意味する 0xE としてこれらのビットがあります。

すべての ARM 命令は、上位 4 ビットを条件コードとして使用します。基本的には命令ごとに条件付きで実行できます。この場合、C フラグがクリアされているか、Z フラグが設定されている場合にのみ LDR が実行されます。ロードを実行する場合、それはあなたが計算していたアドレスであり、アドレス計算へのPC入力は開始アドレスの2命令前であるため、プラス8であり、結果はそのアドレスからPCへのロードであるため、基本的にこれは計算されたアドレスへの条件分岐です。ブランチ テーブル。通常、[ra,rb,lsl #2] のブランチ テーブルがあり、ra はブランチ テーブルのベース アドレス、rb はそのテーブルへの 1 ベースのインデックス (要素番号 0 または 1 または 2) で、lsl は 2 回転します。これらは32ビット命令であるため、ワードアドレスへのインデックス。テーブルには、分岐先へのアドレスが含まれています。ベースとして使用されている PC は、この命令の後の次の命令が、おそらく無条件分岐から無条件分岐であることを意味します。LS でない場合、テーブルを越えて分岐し、その後の命令は R3 = 0 の場合です。その次の命令は R3 = 1 です。ケースなど。コンパイラーが R3 が特定の数値より小さくなることは決してないことを知っていた場合、テーブルを移動する前に、この後にさらに多くの命令を使用した可能性があります。

とにかくARM ARMを見てください(現在はARMv5 ARM ARMまたはレガシーARM ARMなどと呼ばれています)。「条件フィールド」または「条件コード」を検索してテーブルを見つけます。z フラグが設定されている場合、ニーモニック拡張は命令 ADD に追加されます。N フラグが設定されている場合は減算します。SUBMI などです。

于 2011-10-20T00:50:12.867 に答える