アセンブラとは
Wikipediaでは
「アセンブリ言語(アセンブリげんご、assembly language)とは、コンピュータを動作させるための機械語を人間にわかりやすい形で記述する、代表的な低級言語である。
、、、(途中省略)
そしてアセンブリ言語を与えると、自動的に機械語を出力するプログラムが作られるようになった。このプログラムをアセンブラという。」
と記述されている。
例えばAVRの機械語(2進数で表すと)
0000 1111 0000 0001
は、「レジスタR16とR17を加算し、結果をR16に入れる」 という命令であるが、0, 1の羅列から人間が理解するのは大変難しい。そこで、
ADD R16,R17
と人間に分かり易い命令を表す言葉「ニーモニック」で記述し、アセンブラで処理することで上記の0, 1の羅列である機械語が得られる。
○ソースプログラムの構成
① ヘッダ
② インクルードファイル
③ 汎用レジスタの定義
④ 定数定義
⑤ 割り込みベクトル
⑥ 割り込むルーチン
⑦ メインルーチン
⑧ サブルーチン
① ヘッダ
プログラムの見出し,構造等をコメント行として記述しておく
<例>
; 出力の例題
; テストプログラム test.asm と同じ
; PB0に接続したLEDを周期的に点減する
; 制御データを一度に PORTB に出力する
; 「0」のビットは点灯,「1」のビットは消灯
; LEDの接続は、アノード->Vcc, カソード -> 120 Ω -> PB0
; LEDの駆動はシンク(0 -> on, 1 -> off)
② インクルードファイル
プログラム中で使用するAVRのハードウェアに依存する定数が定義されているファイルを読み込む
<例>
;***************************************************************
;*
デバイスの定義ファイルのインクルード
*
;***************************************************************
;
.include "m88def.inc"
③ 汎用レジスタの定義
汎用レジスタ―R0~R31は「R0」のようにそのまま使用できるが,用途に応じた名前を付けておくと間違えにくいので,ここで定義しておく
<例>
;***************************************************************
;*
レジスターにシンボル名を定義
*
;***************************************************************
;
.def temp =r16 ;テンポラリ
.def cnt1 =r17 ;ディレイルーチンで使用する変数1
.def cnt2 =r18 ;ディレイルーチンで使用する変数2
.def cnt3 =r19 ;ディレイルーチンで使用する変数3
;
④ 定数定義
入出力ポートの割り当てを定義したり,プログラムの中で使用する定数値を変えながら最適値を決めたい場合等にここで定義する
⑤ 割り込みベクトル
プログラムの中で使用する割り込み処理プログラムに移動するためのジャンプ命令を定義
⑥ 割り込みルーチン
割り込み処理プログラムを記述する
プログラムの終わりは「reti」命令
⑦ メインプログラム
処理の本体
⑧ サブルーチン
繰り返し実行される処理を記述する
プログラムの終わりは「ret」命令