質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

1回答

2602閲覧

アセンブラでいつの間にかRAMに汎用レジスタの値らしきものが書き込まれている

minato_hy

総合スコア68

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2017/09/16 00:04

###前提・実現したいこと
Cortex-M3マイコンでRAMの動作チェックのために、RAMの全アドレスについて、値を書き込んでから読み取りそれらが一致するか確認する、ということを繰り返すコードを書いています。

###発生している問題・エラーメッセージ
デバッガで実行し途中までは問題なく進むのですが、RAMアドレス0x20002decまで進むと、なぜか汎用レジスタの値?がRAMメモリに書き込まれており、そのせいで値が一致せずNGになります。

例えば下記ram_test_3において、r2の値をRAMに書き込んでいるのでそのアドレスの値は0x00000000になるはずですが、いつの間にかr0の中身らしき0x20000000という値が書き込まれており、そのせいでRAMから読み出したr3の値が0x20000000になってしまい、r2と一致せずNGになります。
なお、いつの間にか書き込まれているのはr0だけではなく、アドレス0x20002decから、値0x55555555r0r1r4(lr?)、PC?などの中身が続けて書き込まれています。
ステップ実行だとそのようなことは起こらず、一気に実行すると上記のことが発生します。

このように、レジスタの値らしきものが勝手にRAMメモリに書き込まれている現象について、なにかご存知の方はいらっしゃいますでしょうか。

###該当のソースコード

ldr r0, =0x20000000 ldr r1, =0x20007fff mv r4, lr //リンクアドレス退避 mv r6, r0 //開始アドレス mv r7, r1 //終了アドレス ram_test_1 ldr r2, =0x55555555 //書き込み値の格納 str r2, [r6] //RAMメモリに書き込み ldr r3, [r6] //RAMメモリから読み込み cmp r2, r3 //値の比較 beq ram_test_2 //値が等しければ問題ないので次へ b . //値が異なれば無限ループに入りここで停止 ram_test_2 ldr r2, =0xaaaaaaaa //同じことを別の書き込み値で繰り返す str r2, [r6] ldr r3, [r6] cmp r2, r3 beq ram_test_3 b . ram_test_3 ldr r2, =0x00000000 //同じことを別の書き込み値で繰り返す str r2, [r6] ldr r3, [r6] cmp r2, r3 beq ram_test_ok b . ram_test_ok add r6, r6, #4 //アドレスを進める cmp r6, r7 //現在のアドレスと終了アドレスを比較 bcs ram_test_exit //終了アドレスまで到達していれば終了 b ram_test_1 //まだなら次のアドレスで同じことを繰り返す ram_test_exit //終了 END

###補足情報(言語/FW/ツール等のバージョンなど)
マイコン:TMPM370シリーズ
開発環境:IAR EWARM

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ユーザプログラム実行中に割り込み/例外が発生すると、レジスタ内容がスタックにpushされるので、そのような症状になると思います。

問題が発生した時、スタックポインタはどのへんのアドレスを指していますか?
また、スタックポインタ初期値をずらした場合、問題が発生するアドレスも変化しませんか?

投稿2017/09/16 07:03

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minato_hy

2017/09/16 11:47

スタックポインタは確か問題が発生したアドレス(0x20002dec)を指していました。 よく考えるとスタック領域にあたるアドレスにも普通に値を書き込んでしまっているので、それでなにか例外が発生し、レジスタ内容がスタックされているのかもしれないです。 今手元に環境がないのですが、試せるようになったらまずスタック領域のアドレスをずらしてみて、それで問題発生アドレスが変われば、RAMのR/Wテストでスタック領域を避けるようにしてみます。
minato_hy

2017/09/19 10:38

試しにスタック領域に値を書き出してみたところその時のレジスタ値が問題のアドレスに現れたので、仰る通りの原因のようです。まだ気になるところがあるので色々試してはみますが、ともかくスタック領域は回避するようにプログラムを変更しました。いつもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問