第11章
データ
プログラムには、命令だけでなくデータも必要です。表示するメッセージ、数の表、アドレスなどです。この章では、プログラムにデータを置く疑似命令を説明します。バイトと文字列のためのDB、16ビットのワードのためのDW、そして自分で終わりを示す文字列のためのDCです。領域を確保するだけで中身を入れないDSは、10章で説明しました。
11.1 DB:バイト
DBは、コンマで区切った式の並びをとり、それぞれを1バイトとして格納します。
table: db 1,2,3 ; 01 02 03 db 'A'+1 ; 42 db -1 ; FF
それぞれの式には、8章で説明したものなら何でも書けます。命令の場合と同じように(9章)、TATARAは値の下位バイトを格納し、値が収まるかどうかは確かめません。db 300は2Chを格納します。
1バイトには、TANRENがあとで仕上げる必要のあるアドレスを入れられないので、値はアブソリュートでなければなりません。DBにラベルや外部の名前を書くと、TATARAはリロケーション・エラーを表示して止まります。
DBREL.AS(3): ERROR: relocation error - a segment-relative value is not allowed here.
11.2 文字列
DBの中の文字列(string)は、引用符で囲んだテキストで、1文字につき1バイトとして格納されます。文字列と数は、1つの並びの中に混ぜて書けます。
msg: db 'Hello',13,10,'$'
これは48 65 6C 6C 6F 0D 0A 24というバイトになります。5つの文字、次の行の先頭に移るための13と10、そしてMSX-DOS2のファンクション_STROUTが表示を止める$です(4章)。
文字列は、アポストロフィーでも引用符でも囲めます。文字列の中では、囲んでいる記号を2つ続けて書くとその記号そのものを表し、もう一方の記号を使うこともできます。次の2行は、同じ4バイトを格納します。
db "It's" db 'It''s'
空の文字列”は、何も格納しません。
注. 1文字か2文字の文字列は、文字定数(8章)と同じ形をしています。TATARAは、M80と同じように、閉じる引用符のあとに何があるかでこの2つを見分けます。コンマか行の終わりが続けば文字列で、そうでなければ式の中の文字定数です。そのため、db ’AB’は41 42の2バイトですが、db ’AB’ and 0ffhは1バイトで、値4142hから上位バイトを取り除いた42hになります。
11.3 DW:ワード
DWは、それぞれの式をワード(word)として格納します。ワードとは2バイトのことで、Z80がすべての16ビットの値を格納するのと同じように、下位バイトが先に来ます(2章)。dw 1234hは34 12です。
2バイトには、TANRENが仕上げるアドレスを入れられるので、ここではラベル、ラベルをもとにした式、外部の名前を使えます(8.6節)。そのため、ジャンプ先のルーチンの一覧のような、アドレスの表を作るにはDWを使います。
jumps: dw start, again, finish
DWの中の1文字か2文字の文字列は文字定数です。dw ’AB’は、値4142hを下位バイトから格納した42 41になります。それより長い文字列があると、TATARAはbad DB, DW or DC operand.と表示して止まります。
11.4 DC:自分で終わりを示す文字列
DCは文字列を1つとり、DBと同じように格納しますが、最後の文字のビット7をセットします。dc ’Stop’は53 74 6F F0で、最後のバイトはpの70hに80hを加えたものです。
ふつうのテキストの文字はすべてビット7が0なので、プログラムはそのビットで文字列の最後の文字を見分けることができ、$のような終わりの印を必要としません。次のルーチンは、DCで作った文字列を表示します。文字列のアドレスはHLに入れておきます。Eの文字を表示する MSX-DOS2のファンクション_CONOUTを、MSXDOS.INCのsystemマクロ(14章)を使って呼び出しています。
print: ld a,(hl) ; the next character inc hl push af ; keep it, and its bit 7 and 7fh ; the character without bit 7 ld e,a push hl ; MSX-DOS2 may change HL system _CONOUT pop hl pop af bit 7,a ; was it the last one? jr z,print ; no: go round again ret
AND、BIT、スタックを初めて見る人は、Z80のプログラミングを学ぶ本で確かめてください。ここで大事なのは、ビット7がセットされたバイトでループが自然に終わることです。
DCには、文字列をちょうど1つ、それも空でないものを書かなければなりません。空の文字列には印を付ける最後の文字がないからです。dc ”とdc 5は、どちらもbad DB, DW or DC operand.と表示して止まります。
11.5 別の名前
いくつかの疑似命令には別の名前があります。ほかのアセンブラー向けに書かれたソースをそのままアセンブルできるように、TATARAはそれらも受け付けます。表11.1に一覧を示します。
11.6 メッセージ
データについてのメッセージを、それぞれの原因となる行とともに表11.2に示します。
行 |
メッセージ |
db 1„2 |
bad DB, DW or DC operand. |
dw ’ABC’ |
bad DB, DW or DC operand. |
dc ”、dc 5 |
bad DB, DW or DC operand. |
db
label、 |
relocation error - a segment-relative value is not allowed here. |