[H8-ML(1367)] C コンパイラ 動きました
From: 清田 暁男 <kiyota@xxxxxxxxxxxxxxxx>
Date: 2001年10月01日(月)12時25分52秒
たろすけ さん おおきに!

いただいたアドバイスの通りでした。

>ためしに最適化を全部OFFにしてみたらどうでしょ。

  コンパイラは、ブランチ命令ではなくジャンプ命令で落としてきました。
  一発解決です。

  それにしても、わかってみると「どうして気が付かなかったのか?」と
  自分のアホさかげんにあきれてしまいます。お恥ずかしい限りです。
  教科書に載っている?ような典型的なトラブルですのにね。

># コンパイラのバグは最適化関係な事が多いですし。
  でしたよね。、私自身、コンパイラの最適化SWはほとんど使う事が
  なくて、今回も、だいぶ前に全てのスイッチを外した記憶があります。
  頭の中の「外れている」との思い込みで、調べていませんでした。

  コンパイラはHEW環境(統合環境?)で使っているのですが、
  設定された環境を記憶するのは正常に終了した場合だけのようです。
  ハングアップした場合、新しい設定は捨てられる様子で、どうやら
  その「わな」にはまっていたまかも知れません。
  (実は他のスイッチも設定値とは異なっていました。恥ずかしい限り)

  現在、何度かコンパイルしているうちにハングアップするのですが
  元気ならリセットしてやり直し、で疲れてくると「今日はおしまい」と
  止めてしまうスタイルに問題がありました。
  今後は、設定を変えたら一度HEWを閉じる事にします。

  尚、全てではありませんが確認できたのは以下のような事です。

  CPU は H8S/2000 で、動作モードは Normal (64Kアドレス)の場合、
  コンパイラの Optimization がチェックされている(ONになっている)と
  最適化の種類(サイズかコードか?)によらず、アセンブル時に
  エラーが発生するブランチ命令をはき出す事があるようです。

  動作モードが Advanced の場合は問題無いようです。

  でも、問題はコンパイラではなくアセンブラにあるのかも知れません。
  というのも、落ちてくるアセンブルコードは Normal も Advanced も同じ
  なのですが、アランブラがはき出すマシン語は異なっているからです。

  アランブラのはき出したものを(チラッと)見たら・・・、
  Advanced の場合、ブランチ命令は BRA を除いて、飛び先までの距離を
  調べて :8 で飛べれば 8ビットオフセットコード (4xxxH) を出力し
  距離が遠ければ 16ビットオフセットコード (58xx xxxxH) を出力して
  くるようです。(なぜか? BRA は常に16ビットオフセット?)

  ところが、Normal の場合、(これは単に私の想像ですが)全てを
  8ビットオフセットとして処理しているようで、「飛び先のまでの距離を
  調べる」という部分が抜けているのではないか?と思われます。
  アセンブルソースに記述してある  BEQ  Lxxx:16  とかの記述はちゃんと
  16ビットオフセットに落としてくれます。

  気になったので、ちょっとだけ覗いてみましたが、全てを調べたわけでも
  無く、勘違いとかがあるかも知れません。その場合はごめんなさいです。

>あるいは、関数の最後にラベルを定義してgotoで飛んでみるとか。

 はい、一応、方法の一つとしては浮かんだのですが「見ば」を考えると
 (テストではOKでも)最終的には使えない方法でした。

         お世話になりました。ありがとうございました!!! 清田

スレッド概略
[表示中](起点)
 └[1368(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]