RL78のローカル変数のメモリアドレスについて

こんにちは。SUZUKIです。

 

RL78/G14用のプログラムをCS+で開発中に良く分からない現象に遭遇しました。

プログラムは

void test(char a){

char b = 0;

b = a+10;

}

という簡単なものです。

この時に変数a,bをウォッチするとアドレスがそれぞれ[L:REG][H:REG]となっており、変数bの値は0のままでした。

動作する条件としては下記3つありました。

1.変数bの宣言をグローバルで行った場合

2.別の変数(使用しない)を関数内で宣言した場合

3.変数bの型をint型にした場合

これらの時は変数a,b共にアドレスが割り当てられ正常に動作しました。

これはどのような事が起きているのでしょうか。

宜しくお願い致します。

Parents
  • わわいです
    んで、もうひとつ。
    コンパイラの最適化をありにしていると、コンパイラは内容の値が使用されていない変数があれば、その変数に関わるコードを省略する場合があります。
    示されたコードでは、おそらく変数bの値が使用されないため、それが関わるコードを省略されてしまった結果だと思われます

    ここで、bの操作を省略されたくない、という場合は、コンパイラのオプションで、最適化をなしにするか、b の宣言時に volatile を追加することですね

    volatile char b=0;
  • ありがとうございます。

    volatileで宣言することで正常に動作を行いました。
    質問時のコードは簡略化しており、実際には別関数呼び出しの引数として変数bを使用していたため、volatileは必要無いという認識でした。
    引数としてではだめなのですね・・・
  • わわいです
    >質問時のコードは簡略化しており、実際には別関数呼び出しの引数として変数bを使用していたため、volatileは必要無いという認識でした。

    関数の引数にしている場合はそーゆー最適化はなされないはずです。volatileは必要ないです
    コンパイラの設定で、インフォメーションメッセージを出す設定にしておけば、そんな場合(未使用変数がある、とか、影響ない操作してるとか)にメッセージを出してくれますんで、やってみてはどうでしょう

    #余計なお世話のメッセージも山ほど出ますがw
  • わわいさん、こんにちは。NoMaYです。横から失礼します。

    SUZUKIさんが質問用にコードを簡略化する前の実際のコードで、こう何というか、ひょっとしてコンパイラのバグ?とも思われるような話になって来たような気がしたのですが、こういう話になって来たら、これは正確な状況を聞いてみた方が良くないでしょうか?

Reply
  • わわいさん、こんにちは。NoMaYです。横から失礼します。

    SUZUKIさんが質問用にコードを簡略化する前の実際のコードで、こう何というか、ひょっとしてコンパイラのバグ?とも思われるような話になって来たような気がしたのですが、こういう話になって来たら、これは正確な状況を聞いてみた方が良くないでしょうか?

Children
No Data