« 湯沢遠征 | トップページ | 「天文屋のためのマイコン入門」割り込みを使おう »

2014年7月 2日 (水)

「天文屋のためのマイコン入門」シンボルプログラミング

もういい加減、シンボルを使わないとつらくなってきました。ここでシンボルプログラミングを説明したいと思います。もう一部使っているんですが、ラベルがそうです。

たとえば、レジスタの番地、これは今まで、次のように数値を直接記述してきました。

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

さて、このようにシンボルを使って書き換えたプログラムを以下に示します。赤枠の部分がシンボルの定義部分です。

1407011

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を使ったプログラム例を以下に示します。

1407012

今日はここまで、次回は割り込みについて。

|

« 湯沢遠征 | トップページ | 「天文屋のためのマイコン入門」割り込みを使おう »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 湯沢遠征 | トップページ | 「天文屋のためのマイコン入門」割り込みを使おう »