アセンブラの式を扱いうために、多くの演算子が用意されています。その中には「+」「−」といったありふれたものから、「OFFSET」「PTR」といったほかでは見慣れないものまでありします。
アセンブラプログラムは、いろいろな場面で「式」を使用します。ここでいう「式」とは「アセンブラの式」であり、普通にいう「式」とは少々異なっています。
アセンブラの式は、プロセッサ命令のオペランドとして通用するような値のことです。オペランドにはイミディエイト(即値)オペランド、レジスタオペランド、メモリオペランドの 3 種類があり、ほぼそれに対応して式にも 3 つの種類があります。次に式の 3 つの種類を示します。
1定数(アセンブル時に決定できる値)
2レジスタ
3アドレス(ラベル+インデクス/ベースレジスタ(×2)+定数、タイプ、フレームを要素とする)
便宜上、これらをそれぞれ定数式、レジスタ式、アドレス式と呼びます。
この例からもわかるとおり、アセンブラの式は単一種の値から成るわけではなく、定数(数値)であったり、レジスタであったり、ラベルであったりします。このため、アセンブラの演算子は式の値によっては適用できないことがあります。たとえば、レジスタ AX という値を持つ式に対して、乗算演算子(*)を適用することは不可能です。(適用するとエラーになります)。
各演算子は優先順位を持っています。複数の演算子を含む式では、優先順位の高い演算子から先に実行します。同じ優先順位の演算子は、左のものから先に実行します。
このような演算順序は、括弧「()」「[]」を使用することで自由に変更できます。括弧の中の演算は常に先に実行します。
次に、すべての演算子を優先順位別にリストします。
優先順位 | 演算子 |
1 (最高) | LENGTH, SIZE, WIDTH, MASK |
2 | .(構造体フィールド演算子), [ ] による加算 |
3 | :(セグメントオーバーライド) |
4 | OFFSET, SEG, PTR, TYPE, THIS |
5 | HIGH, LOW |
6 | +, - (単項) |
7 | *, /, MOD, SHL, SHR |
8 | +, - (2 項) |
9 | EQ, NE, LT, LE, GT, GE |
10 | NOT |
11 | AND |
12 | OR, XOR |
13 (最低) | SHORT, .TYPE, ADDR16*, ADDR32*, NOSBIT* |
※〔LASM〕* 印は LASM 独自の演算子です。
例 1 + 2 + 3 ; ( 1 + 2 ) + 3 = 6 1 + 2 * 3 ; 1 + ( 2 * 3 ) = 7 ( 1 + 2 ) * 3 ; ( 1 + 2 ) * 3 = 9
+、−、×、÷など | |
大小の比較など | |
AND、OR、XOR、NOT | |
ビットシフト | |
上位 8 ビット、下位 8 ビットの抽出 | |
上位 16 ビット、下位 16 ビットの抽出 | |
加算、間接参照 | |
構造体フィールドへの参照 | |
アドレスフレームの指定 | |
セグメント先頭からのオフセット | |
セグメント値 | |
タイプの指定 | |
ジャンプ命令用 | |
式についての情報を返す | |
データの全サイズ | |
データの個数 | |
DUP 演算子の繰り返し数 | |
TYPE の結果と LENGTH の結果を掛けた値を返す | |
レコードフィールドのビット幅 | |
レコードフィールドのマスク値 | |
式の種類を表す 8 ビット値を返す | |
現在のオフセットアドレス | |
現在のオフセットアドレス(タイプ指定可能) | |
データの繰り返しを作成する |
アドレスプサイズの明示指定 | |
サインビットによる命令長短縮の抑止 |