アセンブラの文法には、たとえばC言語のような「国際的な標準規格」はありません。その代わり、Microsoft 社の MASM(MS-MASM)の文法が事実上の標準(defact standard)となっており、この製品 LASM のほか、インプライズ (ボーランド) 社の TASM などもこの文法に沿っています。
LASM のアセンブラ文法は、MS-MASM と非常に高い互換性を有していますから、通常はまったく同じソースコードが使用できます。ただし、細かいところまで 100%同一というわけではありません。実際、アセンブラの文法というものは、同じ製品でもバージョンが違うだけで細かい部分では異なる場合があるほどです。
違いがある部分というのは、通常は使用しないような特殊なディレクティブや複雑なマクロなどです。逆に、このようなものを使用せずにソースコードを作成すれば、ほかのアセンブラや将来のバージョンに対して汎用性が高まります。
LASM と MS-MASM との違いとしては、次の点に注意してください。
EQU 文
LASM の EQU 文では、単純な文字列置換が定義されます。しかし、MS-MASM の EQU 文では、ただちにパラメータが評価されます。LASM の EQU 文は TEXTEQU 文ですが、MS-MASM の EQU 文は異なります。
例1
たとえば、次の例を考えます。
X EQU 1 + 2 MOV AX, X * 3
このプログラムは、LASM と MS-MASM で違う結果になります。LASM の場合、「X」は「1 + 2」という文字列として定義されますが、MS-MASM の場合、「X」は数値の3として定義されるためです。
LASM: MOV AX, 7 ; 1 + 2 * 3 = 7 MASM: MOV AX, 9 ; ( 1 + 2 ) * 3 = 9
この相違を避けるためには、以下のように「1+2」を括弧で囲めば大丈夫です。
X EQU ( 1 + 2 ) MOV AX, X * 3
こうすると、LASM でも MS-MASM でも「MOV AX,9」が生成されます。
例2
もう1つ例を挙げます。
N = 10 A EQU N N = 20 B EQU N DB A,B
この場合は、LASM も MS-MASM も「DB 10,20」を生成します。LASM の EQU 文では、原則として単純な文字列置換が定義されますが、右辺にあるマクロ パラメータと = による定義名だけは即座に展開されます。
簡略化セグメントディレクティブと .DOSSEG 文
簡略化セグメントを使用するときは、同時に .DOSSEG 文を指定して各セグメントの順番を最適化することをお勧めします。MS-MASM では、.DOSSEG 文を指定しない場合もセグメントの順番がある程度自動制御されます。
PUSH/PUSHW/PUSHD がプッシュするデータのバイト数
32 ビット優先セグメントで PUSH/PUSHW/PUSHD から生成されるコードに若干の違いがあります。詳細については、「個別命令についての補足説明」を参照してください。
LASM がサポートしない Microsoft MASM V5.1 の文法
LASM がサポートしない Microsoft MASM V6.0 の文法
Microsoft MASM V6.00AD がサポートしない LASM の文法〔LASM〕