2016-09-12 6 views
0

ARM Cortex-M0命令セットを使用してアセンブリコードを記述しています。私はかなり多くの要素をスタックにプッシュしているので、要素を1つずつポップすることなくスタックを完全にクリアする方法はありますか?いくつかのガイダンスがありますスタックを完全にクリアするにはどうしたらいいですか?

+5

'add {s} sp、N'? – EOF

+0

これでスタックがどのようにクリアされるのでしょうか?申し訳ありませんが、私はこの – abruzzi26

+2

の初心者です。スタックを "クリア"する必要はありません。あなたがあなたのものをプッシュする前に、SPが持っていた価値を元に戻すことだけが必要です。 – Tommylee2k

答えて

1

スタック上のデータを完全に破棄したい場合、たとえば返されない関数を呼び出す場合(そして渡されたパラメータのコピーを取った場合)は、 SPを初期値(または他の有効な値)に設定します。ただし、スタックに保存されていたデータはすべて失われてしまいます。

LDM(LDMIA)命令の後にレジスタにデータを取り込みたい場合。 M0では、R0〜R7(M3/4とは異なります)にしかデータをロードできません。 M0/1はARMv6-M命令セットを使用し、M3はARMv7-Mを使用し、M4はARMv7E-Mを使用します。使用している命令セットのARM Generic User Guideが役立ちます。

1

@Realtime Rikの答えの最初の部分にいくつかの追加情報を追加するには、(特にMSP)の初期値がベクタテーブルの最初のエントリから読み込まれます。ご使用のマイクロモードと起動モードによっては、ベクタテーブルの位置が異なる場合があります。

ベクタテーブル(この値をコピーせずに)再配置されていない場合は、次の擬似Cと初期スタックポインタにアクセスすることができるが:

void * sp = *(SCB->VTOR); 

SCBは、いくつかのコア・コンフィギュレーション・レジスタのいずれかを含んでいますVTORまたはベクトルテーブルオフセットレジスタです。これは本質的にベクトルテーブルの現在のアドレスを含む。このレジスタを逆参照することにより、最初のスタックポインタが格納される場所であるVTORが指すテーブルの最初の要素にアクセスしています。

たとえば、ブートローダを作成している場合は、SCB->VTORを見る代わりに、起動するアプリケーションを指定する場所を調べる必要があります。次のようにSTのUSBブートローダからのサンプルコードは次のとおりです。この場合、

/* Initialize user application's Stack Pointer */ 
__set_MSP(*(__IO uint32_t*) USBD_DFU_APP_DEFAULT_ADD); 

、彼らはそれがテーブルの最初のエントリを読んで逆参照、ポインタにキャストし、ベクタテーブルのデフォルトのアドレスを持っている、とのセットその値にMSP。これは、アプリケーションにジャンプする直前です。

関連する問題