付録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 |
どの演算子にも、次の規則があります(8.5節)。
- 同じレベルの演算子は左から右へ計算されます。10-4-3は(10-4)-3、1 shl 3 * 2は10h、1 or 2 xor 3は(1 or 2) xor 3で0です。
- かっこで順序を変えられます。2+3*4は14、(2+3)*4は 20です。
- HIGHとLOWは、すぐあとの値にだけ働きます。high 1234h+1は(high 1234h)+1で、13hです。
- 符号反転は*、/、MODより弱く結び付きます。-2*3は-(2*3)、-3/2は-(3/2)で、−1です。
- NOTは比較より弱く結び付きます。not 1 eq 1はnot (1 eq 1)で、0です。
- ANDはORやXORより強く結び付きます。2 or 1 and 0は2 or (1 and 0)で、2です。
- 比較の演算子は、真なら0FFFFh、偽なら0を返し、符号なしの数として比べます。-1 gt 1は真です。
- 語の演算子は大文字でも小文字でも書けますが、両側に空白かかっこが必要です。aandbではなくa and bと書きます。
これは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 |
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バイトのオペランドはアブソリュートでなければなりません。