1

Raspberry Pi 用のベア メタル コードを書いているところ、Windows の ARM クロス アセンブラーから予期しない警告が表示されます。警告の原因となった命令は次のとおりです。

stmdb sp!,{r0-r14}^

ldmia sp!,{r0-r14}^

警告は次のとおりです。

警告: ベース レジスタの書き戻しは予測不能です

「^」修飾子はプロセッサにレジスタのユーザーモードのコピーを保存するように指示しますが、命令が実行されたときにプロセッサがどのモードになるかがわからず、そのようには見えないため、これはある程度理解できます。それを伝える方法になります。私は、次の場合に同じ警告が表示されることをもう少し心配していました。

stmdb sp!,{r0-r9,sl,fp,ip,lr}^

と:

ldmia sp!,{r0-r9,sl,fp,ip,lr}^

spレジスタを明示的に保存していないという事実にもかかわらず。

私の懸念は、約 15 年前に多くのアセンブラ コーディングを行っていたにもかかわらず、ARM コードは私にとって新しいものであり、何かを誤解している可能性があることです。また、警告を安全に無視できる場合、それらを抑制する方法はありますか?

4

2 に答える 2

3

ARM アーキテクチャ リファレンス マニュアルには、ユーザー レジスタの LDM/SMT では書き戻しが許可されていないと記載されています。pcこれは、レジスタ リストにある例外リターンの場合に許可されます。

LDM (例外リターン)

LDM{<amode>}<c> <Rn>{!},<registers_with_pc>^

LDM (ユーザー登録)

LDM{<amode>}<c> <Rn>,<registers_without_pc>^
于 2013-03-12T23:22:35.010 に答える
1

ライトバックとは、レジスタリストの有無ではなく、命令が転送領域アドレスの終わりで値を更新することを意味するシンボルを指します。ベース レジスタ (SP) の値は、ユーザー モードではなく現在のモードから使用されるため、ユーザー モードの SP 値をスタックにロードまたはストアすることができます。ARM ARM B9.3.6 LDM (ユーザー レジスタ) から:SP!SP

システム モード以外の PL1 モードでは、複数ロード (ユーザー レジスタ) は、ベース レジスタのアドレスを使用して、連続するメモリ位置から複数のユーザー モード レジスタをロードします。ロードされるレジスタに PC を含めることはできません。プロセッサは、現在のモードを使用してレジスタの正しいバンク バージョンを決定し、ベース レジスタ値を通常通り読み取ります。この命令は、ベース レジスタにライトバックできません。

エンコーディング ダイアグラムは、ビット 21 (W、ライトバック) を '(0)' として指定することでこれを反映しています。これは、ビットが 0 でない場合、結果が予測できないことを意味します。

したがって、解決策は、 を指定せず!、必要に応じて SP を手動でデクリメントまたはインクリメントすることです。

于 2013-03-13T00:24:50.320 に答える