使用するコンパイラの要件

こんにちは、めのんです!

今回はすごく簡単に済ませます。
命令セットシミュレータに使用するCコンパイラの要件を挙げてみたいと思います。

標準Cにもいくつかのバージョンがあります。
また、処理系による方言もあれば、処理系定義の仕様もあります。

このブログに掲載するコードを古いバージョンしかご存じない方がご覧になれば、「これだとコンパイルできないよ」と思われるかもしれません。
そういう問題が起きないように、あらかじめコンパイラの要件をハッキリさせておくことにします。

コンパイラの要件

それでは順にコンパイラの要件を挙げていきますね。

C11以上であること

Cの規格バージョンはC11以上とさせていただきます。
現時点ではC11とC18(C17)が該当します。

C規格のバージョンについては過去の記事「C規格のバージョン」を参照してください。

リトルエンディアンであること

複数バイトの整数値がメモリに格納される際のバイトオーダーはリトルエンディアンでなければなりません。

これは、X, Y, Zレジスタがメモリ上にリトルエンディアンで配置されるからです。
バイトオーダーに依存しない実装もできますが効率がすごく悪くなってしまいます。

ちなみに、AVRの場合、サブルーチンを呼び出す際にスタックに積まれる戻り先アドレスはビッグエンディアンです。
ただ、境界調整の問題もあってダイレクトにワードアクセスはできませんので、その部分のバイトオーダーには依存する必要はないだろうと考えています。

8ビットと16ビットの整数型が必須

C規格では、ピッタリ8ビットや16ビットの整数があるかどうかは処理系定義になっています。

今制作している命令セットシミュレータでは、uint8_t型やuint16_t型を使いますので、8ビットと16ビットの整数型は必須になります。
また、符号付き整数型のint8_t型とint16_t型も必須になります。

int型が32ビット以上であること

これは実装の便宜のための要件です。
開発に使う処理系でint型が32ビット未満のものはまずないと思いますので、そんなに気にすることはないと思います。

符号付き整数型の負値は2の補数表現であること

これも実装の便宜のための要件です。
符号付き整数型の負値が2の補数表現以外になるような処理系はまずないと思いますので、これも気にすることはないでしょう。


ざっとこの程度が要件になります。
C11以上というのが一番厳しい要件になると思いますね。

要件を満たす具体的な処理系には、たとえばGCC 5.x以上があります。
Clangもバージョンはハッキリわかりませんが大丈夫だと思います。

こんな感じで、以降ははこれを踏まえた上で書いていきたいと思います。

次回はプログラムカウンタとスタックポインタを予定しています。
長くなりすぎるようならどちらかだけに絞るかもしれません。
どうぞご期待ください!