「天文屋のためのマイコン入門」シンボルプログラミング
もういい加減、シンボルを使わないとつらくなってきました。ここでシンボルプログラミングを説明したいと思います。もう一部使っているんですが、ラベルがそうです。
たとえば、レジスタの番地、これは今まで、次のように数値を直接記述してきました。
BSF 5h,4
これだと、5番地がどのレジスタを意味しているか、いちいち調べなければなりません。あるいは覚えていないといけません。
そこで、この数値をもっとわかりやすい記号、またはシンボルに割り当てるということができます。
このシンボルはユーザがわかりやすいように自由に名づけることができます。ただ多少、決まりがあります。使える文字は、英小文字、大文字、数字、下線(_)などです。ただし、先頭が数字であってはいけません。なぜなら数字あるいは16進数と区別できなくなるからです。
たとえば、上記の例の場合、ポートAなので、これをPORTAと名づけることにします。PORT_AでもPAでも良いのですが、レジスタの場合はPICのデータシートに書かれた名称を使うのが通例です。
さて、PORTAというシンボルに数値の5を割り当てます。次のような擬似命令を記述します。
PORTA EQU 5h
EQUというのが擬似命令です。一般的な書式は次の通りです。
シンボル EQU 数(10進数でも2進数でも16進数でも何でも良い、式もOK)
この文は擬似命令ですが、先頭に空白を入れてはいけません。(この仕様はチグハグですがシンボルがラベルだという認識のためでしょう。でもこれはラベルではありません、言語仕様に一貫性がありません)
この記述はこのシンボルを実際に使うより前に記述しなければなりません。普通はファイルの先頭のほうに記述します。
この記述をすることによりPORTAは数値の5とまったく同等に扱えます。数値ですから、次のように式の中に使うこともできます。
PORTA+1
さて、このようにシンボルを使って書き換えたプログラムを以下に示します。赤枠の部分がシンボルの定義部分です。
EQUは、シンボルに数値を割り当てる擬似命令でした。シンボルに任意の文字列を割り当てる機能もあります。
たとえば、バンク1に移行する命令は
BSF 3h,5
ですが、この文字列"BSF 3h,5"をBANK1というシンボルに割り当てます。
#define BANK1 BSF 3h,5
一般的な書式は
#define シンボル 任意の文字列
です。この割り当てによって、バンク1に移行する命令は
BANK1
で記述できます。
割り当てられるのは任意の文字列ですから、何でもかまいません。もちろん数値もOKです。たとえば、前述の
PORTA EQU 5h
は次のように文字列として割り当てることも可能です。
#define PORTA 5h
こうすると、#defineのほうが万能でEQUは必要ないように思えますが、数値は数値として割り当てたほうが、安全です。たとえば、次のような例を見てください。
A EQU 5+1
このAを、たとえば2*Aという式の中で使うとします。(*は掛け算)
EQU 数値で割り当てた場合
2*A --> 2*6 --> 12
文字列で割り当てた場合
2*A --> 2*5+1 --> 11
おそらくプログラマの意図としては12が正解と思いますので、やはり数値はEQUで割り当てるの安心です。文字列として割り当てるなら、次のように括弧をつければよいです。
#define A (5+1)
さて、この#defineを使ったプログラム例を以下に示します。
今日はここまで、次回は割り込みについて。
| 固定リンク
コメント