SNSへはこちら

Intel 8051マイコンを使う(STCマイコン)(3) – アセンブリ

ペリフェラルはもう説明することがないので、続いてはアセンブリをやってみたいと思います。

使用ツール

先に sdcc を入れましたね。それを使います。厳密には、付属しているアセンブラ sdas8051 でオブジェクトファイル(もどき) を生成して、それを sdcc にかませることによりバイナリを生成します。

参考サイト

ユーザマニュアルはもちろん見ました。それ以外に参考にしたサイトたちです。主にアセンブラの使い方を見ました。

コードの書き方

アセンブリコード自体は命令セット表を見ながら書けると思いますので、それ以外のお作法についてまとめておきます。

.module

ファイルのまとまりの名前(?)を示すもの。モジュール名を指定する。例えば .module main とかですかね。

.globl

global の意。他のファイル(アセンブル単位)から関数等を見えるようにします。これがないと、C言語における static な状態となります。
また、sdcc ではC言語で生成したシンボルの先頭にアンダーバー(_)がつくので、アセンブリとC言語を組み合わせる時は注意しましょう。

.area

メモリ空間上の領域に名前をつける。名前に続いて括弧で囲ったパラメータを指定することによって、格納するデータについて明示をする。割り込みベクタ等は relocatable ではいけないので、絶対指定をする。また、sdccでは HOME, XDATA, PSEG, RSEG という領域の定義が必要なよう。
僕はよく分からなかったので、こんな感じで空の定義としています。

.area HOME (CODE)
.area XSEG (XDATA)
.area PSEG (PAG,XDATA)
.area RSEG (ABS,DATA)

.org

指定番地にデータを置くという意味。ベクタテーブル記述には必須。

マクロ定義

イコールを使って定義する。至極単純な記法。

P1 = 0x90 ; P1というワードが出てきたら、それを0x90に置換する

というわけで

説明も面倒くさくなってきた所で(すみません)、コードを出してしまいましょう。このプログラムは、P1.0 を1秒ごとにチカチカさせています。
タイマーを使用して時間稼ぎをしています。接続したクリスタルは 12MHz です。

アセンブル・リンクコマンドはこちら。

$ sdas8051 -o -l a.s # a.rel(オブジェクトファイル)とa.lst(リンクに必要なファイル)を生成
$ sdcc a.rel # リンク完了。a.ihx(Intel HEXファイル)が生成