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

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

ただいまの
回答率

90.33%

  • アセンブリ言語

    109questions

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

  • マイコン

    72questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 549

minato_hy

score 34

前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/16 20:47

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

    キャンセル

  • 2017/09/19 19:38

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

    キャンセル

同じタグがついた質問を見る

  • アセンブリ言語

    109questions

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

  • マイコン

    72questions

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