マイコンを正しく操縦するための作法

基礎から学ぶ C 言語講座
岡田 好一
Yoshikazu Okada

７回 スタートアップ・ファイルの詳細とアセンブリ・プログラミング

第C 言語は main 関数からスタートします．しかし，スタックの設定や大域変数の初期化はそれ以前に行わアセンブラの基礎知識れています．
つまり，C 言語の main 関数をいきなり動作させる

アセンブラは，機械語命令に名前を付けた「ニーモことはできず，少量でもアセンブリ言語による初期設定ルーチンが必要です．これが，スタートアップ・フニック（mnemonic）」とアドレスを表す「ラベル（label）」で書かれたアセンブリ言語プログラムを機ァイルの存在理由です．
開発環境でプロジェクトを普通に作成すると，二つ械語に変換するプログラムです．アセンブリ言語のソース・プログラムは「アセンブラで書かれたプログラのスタートアップ・ファイルム」と言い習わされています．
ニーモニックと機械語は原則として 1 対 1 に対応するので，当然ながら CPU が異なれば機械語が異なり

ncrt0.a30
sect30.incが自動生成されます．どちらもアセンブリ言語のソース・プログラムです．sect30.inc は ncrt0.a30 にますから，ニーモニックも違ってきます．また，通常は CPU の開発元が指定する書式が使われますが，ア組み込まれて使用されます．内容は，参考文献（1）とセンブラの開発元の都合により微妙に変化してしまう（2）に解説されています．
パソコンでプログラムを組むならば，C 言語の知識場合があります．
それやこれやで，C 言語並みの可搬性をアセンブラ以外に OS が用意する環境についての知識が必要です．
それと同様に，スタートアップ・ファイルの動作を知に求めることはできません．あくまで，機械語を便利に記述するための方便です．

ることは，R8C/1B の標準開発環境が提供するソフトウェア上の環境を知ることになります．難しくはないので，しばらくお付き合いください．

● アセンブリ・プログラムの書式
アセンブリ・プログラムの 1 行は，ということで，アセンブリ言語を読む必要が生じてきました．プログラムを読むための要点を述べてみます．

ラベル 命令 オペランドの形をしています．R8C 純正のアセンブラでは，ラ機械語（machine language）CPU が命令として直接解釈できるビット・パターンで書かれたプログラムです．

しかし，mov 命令のように非常に異なるビット・パターンに同一のニーモニックが与えられていたり，adjnz 命令アドレス可能なメモリ上に展開され，ビット・パターンと sbjnz 命令のように同じコードの場合があります．まは CPU の制御装置のデコーダで解釈され，実行されます．

た，ldintb 命令のような暗黙のマクロが紛れ込む場合が現存するほぼすべての CPU に見られる階層でしょう．

あります．

ビット・パターンそのものは命令コード（instructioncode/operation code）と呼ばれます．
通常，add や mov などと，開発元によってニーモニックが与えられます．原則として，機械語命令とニーモニックは，1 対 1 対応です．

2006 年 12 月号

203

表 7 − 1 R8C/Tiny の純正アセンブラの指示命令（一部）.glb.equ

外部でも使われるシンボル / ラベル
シンボルの設定（a）ラベル（アドレス）とシンボル（定数）.section.org.end.include● データ領域の定義を行う指示命令
データ領域の定義には「指示命令（directive）」が使アドレスの指定
ソース・プログラムの終了
ファイルの内容の挿入

われます．指示命令はニーモニックの位置に書きますが，機械語には変換されず，1 バイト，2 バイト…やROM 上の 1 バイト

文字列の領域を指定します．つまり，ラベルは位置でROM 上の 2 バイト

すから，文法上，何か位置を占めるものが必要なので，疑似的な命令を仮に書いておく感じです（表 7 − 1）．

ROM 上の 3 バイト
ROM 上の 4 バイト

領域確保以外の指示命令もあります．シンボルと呼ばれる定数の定義，条件アセンブル，マクロなどです．

1 バイト単位の RAM 領域
偶数アドレスに調整

特にマクロは便利なしかけなので，マクロが使えるア（c）領域確保

.if
.elif
.else.endif

センブラは「マクロ・アセンブラ」と呼ばれます．

条件により以下をアセンブルする
else if のこと● 一続きのメモリ領域「セクション」
一続きのメモリ領域がセクションです．記述が別々条件以外で以下をアセンブル
条件アセンブルの終わり

でも，同名のセクションは一続きにまとめられます．
セクションの属性には，CODE，ROMDATA，DATA が（d）条件アセンブル.macro.endm

元，転送先の順に書き，x86 系のアセンブラとは逆順です．

セクションの始まり（b）セクション（一続きのメモリ）

.byte
.word
.addr
.lword.blkb.align接・相対指定の印には角かっこ [] が用いられます．
R8C のアセンブラの書き方では，オペランドは転送

マクロ定義の始まりあり，それぞれ，プログラム，固定データ，変更可能マクロ定義の終わりなデータを記述します．CODE と ROMDATA は ROM に，DATA は RAM に配置されるように，.org 指示命令で（e）マクロ

ベルにはコロン「:」が後続します．ラベルは省略可

アドレスを指定します．
何も指定しなければコード領域のみとなり，RAMで，大半の行には付いていません．命令とオペランドが使えませんから，データ・セクションは必要です．

（命令の対象）は空白またはタブで区切ります．オペランドが複数の場合はカンマで区切ります．

スタートアップ・ファイルにセクションの詳細な記述があり（sect30.inc），コンパイラはそのセクショ

命令は「add」や「rts」などのニーモニックです．
R8C は 16 ビット機ですが，8 ビット処理も同等にこなンを利用します．

せるので， mov や add などのデータ系の命令は .w● 条件アセンブル（word ＝ 16 ビット）か.b（byte ＝ 8 ビット）を付けてデータの大きさを指定します．

コンパイラなどのオプションの設定により，アセンブルする部分を変更するためのしかけです．純正のス

オペランドにはレジスタやラベルがきます．オペランドに数値が直接書かれる場合は「 #」，レジスタ間タートアップ・ファイルにも R8C 専用部分があります．

指示命令（directive）
領域確保や条件アセンブルなど，ニーモニックの位置に微妙な違いはあれ，基本的なところは変わらないので，書かれ，アセンブラ自体の動作を指示します．疑似命令

R8C のアセンブラで学習しても，他のアセンブラでその知（pseudo instruction）と呼ばれることもあります．

識が役に立ちます．

逆に言えば，アセンブラへの指示は，何でも指示命令になってしまいます．つまり，ニーモニックから機械語への高級言語と同じく，練習が必要なので，簡単なプログラムで実働するものを作っておくことをお勧めします．

変換以外のアセンブラの能力そのものです．
初期の 8 ビット・マイコンの頃は単純でしたが，最近のアセンブラの指示命令は，CPU や OS の発展に対応して高度化しているようです．本連載で使用しているアセンブラも，もちろん現代的なアセンブラです．

204

2006 年 12 月号