コンパイル
コンパイルの解説ページです。gccはUNIX処理系なのでWindowsのコンパイラとは勝手が違います。ここではよくハマる内容を解説します。
■コンパイルの方法
コンパイラは当サイトの通りにインストールしていれば、h8300-hms-gccというコマンドを実行すればOKです。H8で動かすようにするには(ソース)ファイル名を与えるだけではだめで、次のようなオプションを渡す必要があります。
◎foo.c というソースファイルをコンパイルする。
% h8300-hms-gcc -mh -mrelax -mint32
foo.c
-mhのようなオプションはたくさんあって意味は次のとおりです。オプションは大文字・小文字を区別します。違うと全然意味が変わってしまいますのでよく確認してください。1(数字のいち)とl(アルファベット・小文字エル)、O(アルファベット・大文字オー)と0(数値ゼロ)は紛らわしいので慣れていない方は特に注意が必要です。あとスペースを入れていいところとスペースを入れてはいけないところがあります。
-
-mで始まるオプションはH8特有の機能の設定を行います。
-
-mh
H8/300H用の命令を生成します。
このオプションを指定しないとH8/300用の命令を生成してしまいます。このオプションは必ず必要です。H8/300は16ビットのレジスタセットなので命令の効率が悪いです。
-
-mrelax
条件分岐のコードを最適化する。
このオプションを指定すると若干速くかつプログラムが短くなるようです。必要に応じて使います。
-
-mint32
int型を32ビット変数にする。
このオプション指定するとint型が32ビットになります。これを指定しないと16ビットとなり、プログラムによっては計算・演算結果が異なる原因になります。H8/300Hの内部レジスタは32ビットですから、-mint32を指定したほうが効率が高くスピードも速いです。これは普通指定します。
-
-mn
normalモードの指定
このオプションはH8Tiny(H8/3664)のためのものです。H8Tinyはアドレス16ビットのアーキテクチャなのでこのオプションを指定しないと、正しく引数が渡らなくなります。H8Tiny以外のCPUでこのオプションをつけてはいけません。暴走の原因になります。
-
-m以外はgccに関するコンパイル機能の設定を行います。
-
-c
コンパイル後オブジェクトをファイルを作成して終了します。
このオプションを指定しない場合、gccは最終実行ファイルを作成しようとしますが、このオプションによりオブジェクトファイルを作成して処理を終了します。
-
-E
プリプロセッサを実行して結果を表示します。
-
-o <ファイル名>
出力ファイル名を指定します。
-oとファイル名はスペースで区切ります。
-
-I <ディレクトリ>
インクルードディレクトリ(パス)を指定します。
-Iとファイル名はスペースで区切らず連続で記述します。
-
-L <ディレクトリ>
ライブラリディレクトリ(パス)を指定します。
-Lとディレクトリ名はスペースで区切らず連続で記述します。
-
-l<ライブラリ名>
リンクするライブラリを指定します。"-l" はハイフン・エルです。1じゃないので注意!
-lとライブラリ名はスペースで区切らず連続で記述します。
-
-S
アセンブラソースを出力します。
このオプションを指定するとC言語からアセンブラのソース(拡張子=.s)を吐き出します。ソースファイルとアセンブラのソースをみることでどのようなアセンブラコードを出力するのか確認できます。
-
-O
コンパイルの最適化を行います。"-O"はハイフン・オーです。ゼロではありません。
このオプションをつけると一般的にプログラムが速くなります。場合によってはプログラムがうまく動かなくなる場合があります。Pentiumの場合はそんなことはまずありませんが、H8の場合は割とよく動かなくなったりします。これはたいていの場合、プログラミングによるものでプログラムを直せばちゃんと動きます。
-
-T <リンカスクリプトファイル>
リンカスクリプトファイルを指定します。
-Tとファイル名はスペースで区切ります。
H8開発の場合、普通はこのオプションを使ってリンカスクリプトファイルを指定します。
-
-nostdlib
標準ライブラリをリンクしない
-
その他たくさんのオプションがあります...
始めに戻ってfoo.cというファイルをコンパイルしてみましょう。
% h8300-hms-gcc -mh -mrelax -mint32
foo.c
%
以下執筆中...
■makeがコンパイルコマンド?
UNIXではアセンブルやコンパイルといった作業をmakeというコマンドを一回実行するだけでできるようになっています。なっているというよりは、そうなるように設計・開発しているのです。これにはメリットがたくさんあります。
-
コンパイル・アセンブルの操作を間違えないで行える。
いちいち手でh8300-hms-gcc等と入力していては絶対間違って入力してしまいます。makeを使えば同じコマンドを入力せずに済みます。Windowsでいうバッチファイルのようなものですが、以降の点がバッチファイルことは異なります。
-
ファイルの依存を調べて必要な手順だけを実行することができる。
ソースを1つ直したら、そのソースだけコンパイルして最終ファイルまで構築しなおせばいいのですが、どのファイルを修正したかをチェックするのは大変です。かといって毎回全ファイルをコンパイルしなおすのも時間も無駄です。makeを使うことでファイルのタイムスタンプをチェックして必要なファイルだけコンパイルしてくれます。
ということでこのサイトで公開しているプログラムはmakeを使っています。
以下執筆中...