Tatara

付録C
演算子と優先順位

この付録では、8章で説明した式についてのことを、参照しやすいようにいくつかの表にまとめます。演算子とその優先順位、16ビットの範囲の端での結果、そして式を作る値です。

C.1 演算子

表C.1に、すべての演算子を優先順位のレベルごとに示します。レベル1がいちばん強く結び付きます。演算子が2つ以上ある式では、レベルの数が小さい演算子から先に計算されます。

レベル 演算子 働き 例と値
1 HIGH 上位バイト high 1234h = 12h
LOW 下位バイト low 1234h = 34h
2 * 乗算 6*7 = 42
/ 除算(符号なし) 17/5 = 3
MOD 除算の余り(符号なし) 17 mod 5 = 2
SHL 左シフト 1 shl 4 = 10h
SHR 右シフト 8000h shr 15 = 1
3 - 符号反転(値の前) -1 = 0FFFFh
4 + 加算 2+3 = 5
- 減算 10-4-3 = 3
5 EQ NE 等しい、等しくない 1 eq 1 = 0FFFFh
LT LE より小さい、以下 2 le 1 = 0
GT GE より大きい、以上 2 gt 1 = 0FFFFh
6 NOT すべてのビットを反転 not 0 = 0FFFFh
7 AND ビットごとの論理積 0f0h and 3ch = 30h
8 OR ビットごとの論理和 0f0h or 0fh = 0FFh
XOR ビットごとの排他的論理和 0ffh xor 0fh = 0F0h
表 C.1: 優先順位のレベルごとの演算子(結び付きの強い順)

どの演算子にも、次の規則があります(8.5節)。

これはM80のレベルと同じです。迷ったら、かっこを付けてください。かっこを付けても損はありません。

C.2 範囲の端

値はどれも0から65535までの16ビットの数で、負の数は16ビットの補数として保持されます(8.1節)。表C.2に、その範囲の端で演算子が返す値を示します。

式 値 理由
65535+1 0 値が一周する
0-1 0FFFFh 値が一周する
17/0 0FFFFh 0で割ってもエラーにならない
17 mod 0 0 その余りもエラーにならない
1 shl 16 0 すべてのビットが押し出される
1 shl 0ffffh 0 同じ
(-3)/2 7FFEh −3は0FFFDhで、除算は符号なし
(-7) mod 2 1 −7は0FFF9hで、余りは符号なし
-3/2 0FFFFh -(3/2)のこと。符号反転は/のあと
high -1 0FFh −1は0FFFFh
表 C.2: 16ビットの範囲の端での結果

ld a,nやDBのオペランドのように、行が1バイトしか必要としない場所では、TATARAは値の下位バイトを使い、収まるかどうかは確かめません。

C.3 値

C.3.1 数、文字、ロケーション・カウンター

数は、あとに別の基数を示す文字がなければ10進数です(8.2節)。数は数字で始まらなければならないので、文字で始まる16進数には前に0を付けます。

基数 接尾辞 例 値
10進数 なし、またはD 100、100d 100
16進数 H 100h、0ffh 256、255
8進数 OまたはQ 100o、100q 64
2進数 B 100b 4

BとDは16進数の数字でもあり接尾辞でもあるので、16進数は必ずHで終えてください。10bは2です。

文字定数は、アポストロフィか引用符で囲んだ1文字か2文字で、その値は文字のコードです。’A’は41h、"AB"は4142hで、最初の文字が上位バイトに入ります(8.3節)。

$だけを書くと、ロケーション・カウンター、つまりそれを書いた行のいまのセグメントでのアドレスになります(8.4節)。

C.3.2 値の種類

式は、アブソリュート、リロケータブル、外部のどれかです(8.6節)。アブソリュートな値はTATARAがアセンブルするときに完成しています。リロケータブルな値はセグメントの中のアドレスで、TANRENが仕上げます。外部の値はEXTRNで宣言した名前です。受け付けられるのは、次の組み合わせだけです。

式

結果 例

アブソリュート+リロケータブル、
またはその逆

リロケータブル a1+2

リロケータブル−アブソリュート

リロケータブル a1-2

リロケータブル−リロケータブル
(同じセグメント)

アブソリュート a2-a1

外部+アブソリュート、またはその逆

外部 far+2

外部−アブソリュート

外部 far-2

そのほかの演算子は、符号反転、NOT、HIGH、LOWも含めて、アブソリュートな値しか受け付けません。外部の名前は、1つの式に 1回しか使えません。リロケータブルな値や外部の値は、ld hl,a1やDWのように2バイトで値を持つ場所にしか書けません。1バイトのオペランドはアブソリュートでなければなりません。