プログラム(アセンブラ)
※ 言葉の定義
ラベル
プログラムメモリやRAMのアドレスに付けた名前。分岐命令の分岐先や変数・定数の目的位置に使用する。コロン「:」で終わる
疑似命令
命令コードに直接返還されることはないが,メモリ上のプログラムの位置の調整やマクロの定義,メモリの初期化などに使われる。疑似命令はドット「.」で始まる
ニーモニック命令
プログラムを実行させるための機械語(01の羅列)を、人間が理解・記述しやすいように簡略化した英単語や記号の組み合わせ
オペランド
命令の作用対象や定数・変数
アセンブラソースの書式
[ラベル:] 疑似命令 [オペランド] [ ; コメント]
ニーモニック命令 [オペランド] [,オペランド] [ ; コメント]
; コメント
空 行
<例>
.def tmp = R16 ; 疑似命令 オペランド 「汎用レジスタ定義」
label: .equ count = 100 ; 疑似命令 オペランド 「定数を定義」
; 空行
.cseg ; 疑似命令 「コードセグメント開始」
main: rcall test ; ニーモニック命令 オペランド 「サブルーチンコール」
rjmp main ; ニーモニック命令 オペランド 「mainにジャンプする」
test: ldi tmp, count ; ニーモニック命令 オペランド,オペランド
ret ; ニーモニック命令 「サブルーチンから戻る」
プログラムの構成
1 .ヘッダ・コメント
プログラム名,製作者,作成日,動作の簡単な説明などをコメント行として記述する。
コメント行はセミコロン「;」から行末まで
; プログラム名 input.asm
; 製作者 舞衣 紺
; 作成日 2015.09.29
2. インクルードファイル
授業で使用するATmega88 のハードウェアに依存する定数が定義されているファイルを読み込む
.include "m88def.inc"
3. 汎用レジスタ定義
32個の汎用レジスタはSRAMより使い勝手の良い変数の格納庫として使用できる。用途を決めて分かり易い変数名を定義することで間違いを防ぐことができる。
.def tmp = R16
.def flagA = R17
.def itmp = R18
4. 定数の定義
入出力ポートの割り当て,ビットの割り当て,定数に名前を付ける。
.equ SW = PINC : 入力スイッチはポートC
.equ 7SEG = PORTB ; 7seg LED 表示制御ポートはポートB
.equ SW1 = 0 ; ビット0 は SW1
.equ LED1 = 1 ; 赤LED は ビット1
5. 割り込みベクトル
0番地から25番地までは使用する割り込み処理を行う割り込みルーチンへのジャンプ命令を記述する。
.csaeg
rjmp RESET ; リセット処理ルーチンへのジャンプ 「RESET」はとび先アドレスのラベル
rjmp INT0 : 外部割込み0処理ルーチンへのジャンプ
…
…
…
6. 割り込みルーチン
割り込みベクトル処理ルーチンを記述する。
RESET: ; リセットルーチン開始アドレスを示すラベル
; ラベルはコロン「 : 」で終わる
ldi tmp, high(RAMEND) ; スタックポインタ初期値をSRAMのENDアドレス
out SPH, tmp
ldi tmp, low(RAMEND)
out SPL, tmp
…
7. メインルーチン
処理プログラムの本体。
8. サブルーチン
メインルーチンやサブルーチンから繰り返し呼び出される処理ルーチン。