1" Vim syntax file
2" Language:	NASM - The Netwide Assembler (v0.98)
3" Maintainer:	Manuel M.H. Stol	<mmh.stol@gmx.net>
4" Last Change:	2003 May 11
5" Vim URL:	http://www.vim.org/lang.html
6" NASM Home:	http://www.cryogen.com/Nasm/
7
8
9
10" Setup Syntax:
11"  Clear old syntax settings
12if version < 600
13  syn clear
14elseif exists("b:current_syntax")
15  finish
16endif
17"  Assembler syntax is case insensetive
18syn case ignore
19
20
21
22" Vim search and movement commands on identifers
23if version < 600
24  "  Comments at start of a line inside which to skip search for indentifiers
25  set comments=:;
26  "  Identifier Keyword characters (defines \k)
27  set iskeyword=@,48-57,#,$,.,?,@-@,_,~
28else
29  "  Comments at start of a line inside which to skip search for indentifiers
30  setlocal comments=:;
31  "  Identifier Keyword characters (defines \k)
32  setlocal iskeyword=@,48-57,#,$,.,?,@-@,_,~
33endif
34
35
36
37" Comments:
38syn region  nasmComment		start=";" keepend end="$" contains=@nasmGrpInComments
39syn region  nasmSpecialComment	start=";\*\*\*" keepend end="$"
40syn keyword nasmInCommentTodo	contained TODO FIXME XXX[XXXXX]
41syn cluster nasmGrpInComments	contains=nasmInCommentTodo
42syn cluster nasmGrpComments	contains=@nasmGrpInComments,nasmComment,nasmSpecialComment
43
44
45
46" Label Identifiers:
47"  in NASM: 'Everything is a Label'
48"  Definition Label = label defined by %[i]define or %[i]assign
49"  Identifier Label = label defined as first non-keyword on a line or %[i]macro
50syn match   nasmLabelError	"$\=\(\d\+\K\|[#\.@]\|\$\$\k\)\k*\>"
51syn match   nasmLabel		"\<\(\h\|[?@]\)\k*\>"
52syn match   nasmLabel		"[\$\~]\(\h\|[?@]\)\k*\>"lc=1
53"  Labels starting with one or two '.' are special
54syn match   nasmLocalLabel	"\<\.\(\w\|[#$?@~]\)\k*\>"
55syn match   nasmLocalLabel	"\<\$\.\(\w\|[#$?@~]\)\k*\>"ms=s+1
56if !exists("nasm_no_warn")
57  syn match  nasmLabelWarn	"\<\~\=\$\=[_\.][_\.\~]*\>"
58endif
59if exists("nasm_loose_syntax")
60  syn match   nasmSpecialLabel	"\<\.\.@\k\+\>"
61  syn match   nasmSpecialLabel	"\<\$\.\.@\k\+\>"ms=s+1
62  if !exists("nasm_no_warn")
63    syn match   nasmLabelWarn	"\<\$\=\.\.@\(\d\|[#$\.~]\)\k*\>"
64  endif
65  " disallow use of nasm internal label format
66  syn match   nasmLabelError	"\<\$\=\.\.@\d\+\.\k*\>"
67else
68  syn match   nasmSpecialLabel	"\<\.\.@\(\h\|[?@]\)\k*\>"
69  syn match   nasmSpecialLabel	"\<\$\.\.@\(\h\|[?@]\)\k*\>"ms=s+1
70endif
71"  Labels can be dereferenced with '$' to destinguish them from reserved words
72syn match   nasmLabelError	"\<\$\K\k*\s*:"
73syn match   nasmLabelError	"^\s*\$\K\k*\>"
74syn match   nasmLabelError	"\<\~\s*\(\k*\s*:\|\$\=\.\k*\)"
75
76
77
78" Constants:
79syn match   nasmStringError	+["']+
80syn match   nasmString		+\("[^"]\{-}"\|'[^']\{-}'\)+
81syn match   nasmBinNumber	"\<[0-1]\+b\>"
82syn match   nasmBinNumber	"\<\~[0-1]\+b\>"lc=1
83syn match   nasmOctNumber	"\<\o\+q\>"
84syn match   nasmOctNumber	"\<\~\o\+q\>"lc=1
85syn match   nasmDecNumber	"\<\d\+\>"
86syn match   nasmDecNumber	"\<\~\d\+\>"lc=1
87syn match   nasmHexNumber	"\<\(\d\x*h\|0x\x\+\|\$\d\x*\)\>"
88syn match   nasmHexNumber	"\<\~\(\d\x*h\|0x\x\+\|\$\d\x*\)\>"lc=1
89syn match   nasmFltNumber	"\<\d\+\.\d*\(e[+-]\=\d\+\)\=\>"
90syn keyword nasmFltNumber	Inf Infinity Indefinite NaN SNaN QNaN
91syn match   nasmNumberError	"\<\~\s*\d\+\.\d*\(e[+-]\=\d\+\)\=\>"
92
93
94
95" Netwide Assembler Storage Directives:
96"  Storage types
97syn keyword nasmTypeError	DF EXTRN FWORD RESF TBYTE
98syn keyword nasmType		FAR NEAR SHORT
99syn keyword nasmType		BYTE WORD DWORD QWORD DQWORD HWORD DHWORD TWORD
100syn keyword nasmType		CDECL FASTCALL NONE PASCAL STDCALL
101syn keyword nasmStorage		DB DW DD DQ DDQ DT
102syn keyword nasmStorage		RESB RESW RESD RESQ RESDQ REST
103syn keyword nasmStorage		EXTERN GLOBAL COMMON
104"  Structured storage types
105syn match   nasmTypeError	"\<\(AT\|I\=\(END\)\=\(STRUCT\=\|UNION\)\|I\=END\)\>"
106syn match   nasmStructureLabel	contained "\<\(AT\|I\=\(END\)\=\(STRUCT\=\|UNION\)\|I\=END\)\>"
107"   structures cannot be nested (yet) -> use: 'keepend' and 're='
108syn cluster nasmGrpCntnStruc	contains=ALLBUT,@nasmGrpInComments,nasmMacroDef,@nasmGrpInMacros,@nasmGrpInPreCondits,nasmStructureDef,@nasmGrpInStrucs
109syn region  nasmStructureDef	transparent matchgroup=nasmStructure keepend start="^\s*STRUCT\>"hs=e-5 end="^\s*ENDSTRUCT\>"re=e-9 contains=@nasmGrpCntnStruc
110syn region  nasmStructureDef	transparent matchgroup=nasmStructure keepend start="^\s*STRUC\>"hs=e-4  end="^\s*ENDSTRUC\>"re=e-8  contains=@nasmGrpCntnStruc
111syn region  nasmStructureDef	transparent matchgroup=nasmStructure keepend start="\<ISTRUCT\=\>" end="\<IEND\(STRUCT\=\)\=\>" contains=@nasmGrpCntnStruc,nasmInStructure
112"   union types are not part of nasm (yet)
113"syn region  nasmStructureDef	transparent matchgroup=nasmStructure keepend start="^\s*UNION\>"hs=e-4 end="^\s*ENDUNION\>"re=e-8 contains=@nasmGrpCntnStruc
114"syn region  nasmStructureDef	transparent matchgroup=nasmStructure keepend start="\<IUNION\>" end="\<IEND\(UNION\)\=\>" contains=@nasmGrpCntnStruc,nasmInStructure
115syn match   nasmInStructure	contained "^\s*AT\>"hs=e-1
116syn cluster nasmGrpInStrucs	contains=nasmStructure,nasmInStructure,nasmStructureLabel
117
118
119
120" PreProcessor Instructions:
121" NAsm PreProcs start with %, but % is not a character
122syn match   nasmPreProcError	"%{\=\(%\=\k\+\|%%\+\k*\|[+-]\=\d\+\)}\="
123if exists("nasm_loose_syntax")
124  syn cluster nasmGrpNxtCtx	contains=nasmStructureLabel,nasmLabel,nasmLocalLabel,nasmSpecialLabel,nasmLabelError,nasmPreProcError
125else
126  syn cluster nasmGrpNxtCtx	contains=nasmStructureLabel,nasmLabel,nasmLabelError,nasmPreProcError
127endif
128
129"  Multi-line macro
130syn cluster nasmGrpCntnMacro	contains=ALLBUT,@nasmGrpInComments,nasmStructureDef,@nasmGrpInStrucs,nasmMacroDef,@nasmGrpPreCondits,nasmMemReference,nasmInMacPreCondit,nasmInMacStrucDef
131syn region  nasmMacroDef	matchgroup=nasmMacro keepend start="^\s*%macro\>"hs=e-5 start="^\s*%imacro\>"hs=e-6 end="^\s*%endmacro\>"re=e-9 contains=@nasmGrpCntnMacro,nasmInMacStrucDef
132if exists("nasm_loose_syntax")
133  syn match  nasmInMacLabel	contained "%\(%\k\+\>\|{%\k\+}\)"
134  syn match  nasmInMacLabel	contained "%\($\+\(\w\|[#\.?@~]\)\k*\>\|{$\+\(\w\|[#\.?@~]\)\k*}\)"
135  syn match  nasmInMacPreProc	contained "^\s*%\(push\|repl\)\>"hs=e-4 skipwhite nextgroup=nasmStructureLabel,nasmLabel,nasmInMacParam,nasmLocalLabel,nasmSpecialLabel,nasmLabelError,nasmPreProcError
136  if !exists("nasm_no_warn")
137    syn match nasmInMacLblWarn	contained "%\(%[$\.]\k*\>\|{%[$\.]\k*}\)"
138    syn match nasmInMacLblWarn	contained "%\($\+\(\d\|[#\.@~]\)\k*\|{\$\+\(\d\|[#\.@~]\)\k*}\)"
139    hi link nasmInMacCatLabel	nasmInMacLblWarn
140  else
141    hi link nasmInMacCatLabel	nasmInMacLabel
142  endif
143else
144  syn match  nasmInMacLabel	contained "%\(%\(\w\|[#?@~]\)\k*\>\|{%\(\w\|[#?@~]\)\k*}\)"
145  syn match  nasmInMacLabel	contained "%\($\+\(\h\|[?@]\)\k*\>\|{$\+\(\h\|[?@]\)\k*}\)"
146  hi link nasmInMacCatLabel	nasmLabelError
147endif
148syn match   nasmInMacCatLabel	contained "\d\K\k*"lc=1
149syn match   nasmInMacLabel	contained "\d}\k\+"lc=2
150if !exists("nasm_no_warn")
151  syn match  nasmInMacLblWarn	contained "%\(\($\+\|%\)[_~][._~]*\>\|{\($\+\|%\)[_~][._~]*}\)"
152endif
153syn match   nasmInMacPreProc	contained "^\s*%pop\>"hs=e-3
154syn match   nasmInMacPreProc	contained "^\s*%\(push\|repl\)\>"hs=e-4 skipwhite nextgroup=@nasmGrpNxtCtx
155"   structures cannot be nested (yet) -> use: 'keepend' and 're='
156syn region  nasmInMacStrucDef	contained transparent matchgroup=nasmStructure keepend start="^\s*STRUCT\>"hs=e-5 end="^\s*ENDSTRUCT\>"re=e-9 contains=@nasmGrpCntnMacro
157syn region  nasmInMacStrucDef	contained transparent matchgroup=nasmStructure keepend start="^\s*STRUC\>"hs=e-4  end="^\s*ENDSTRUC\>"re=e-8  contains=@nasmGrpCntnMacro
158syn region  nasmInMacStrucDef	contained transparent matchgroup=nasmStructure keepend start="\<ISTRUCT\=\>" end="\<IEND\(STRUCT\=\)\=\>" contains=@nasmGrpCntnMacro,nasmInStructure
159"   union types are not part of nasm (yet)
160"syn region  nasmInMacStrucDef	contained transparent matchgroup=nasmStructure keepend start="^\s*UNION\>"hs=e-4 end="^\s*ENDUNION\>"re=e-8 contains=@nasmGrpCntnMacro
161"syn region  nasmInMacStrucDef	contained transparent matchgroup=nasmStructure keepend start="\<IUNION\>" end="\<IEND\(UNION\)\=\>" contains=@nasmGrpCntnMacro,nasmInStructure
162syn region  nasmInMacPreConDef	contained transparent matchgroup=nasmInMacPreCondit start="^\s*%ifnidni\>"hs=e-7 start="^\s*%if\(idni\|n\(ctx\|def\|idn\|num\|str\)\)\>"hs=e-6 start="^\s*%if\(ctx\|def\|idn\|nid\|num\|str\)\>"hs=e-5 start="^\s*%ifid\>"hs=e-4 start="^\s*%if\>"hs=e-2 end="%endif\>" contains=@nasmGrpCntnMacro,nasmInMacPreCondit,nasmInPreCondit
163syn match   nasmInMacPreCondit	contained transparent "ctx\s"lc=3 skipwhite nextgroup=@nasmGrpNxtCtx
164syn match   nasmInMacPreCondit	contained "^\s*%elifctx\>"hs=e-7 skipwhite nextgroup=@nasmGrpNxtCtx
165syn match   nasmInMacPreCondit	contained "^\s*%elifnctx\>"hs=e-8 skipwhite nextgroup=@nasmGrpNxtCtx
166syn match   nasmInMacParamNum	contained "\<\d\+\.list\>"me=e-5
167syn match   nasmInMacParamNum	contained "\<\d\+\.nolist\>"me=e-7
168syn match   nasmInMacDirective	contained "\.\(no\)\=list\>"
169syn match   nasmInMacMacro	contained transparent "macro\s"lc=5 skipwhite nextgroup=nasmStructureLabel
170syn match   nasmInMacMacro	contained "^\s*%rotate\>"hs=e-6
171syn match   nasmInMacParam	contained "%\([+-]\=\d\+\|{[+-]\=\d\+}\)"
172"   nasm conditional macro operands/arguments
173"   Todo: check feasebility; add too nasmGrpInMacros, etc.
174"syn match   nasmInMacCond	contained "\<\(N\=\([ABGL]E\=\|[CEOSZ]\)\|P[EO]\=\)\>"
175syn cluster nasmGrpInMacros	contains=nasmMacro,nasmInMacMacro,nasmInMacParam,nasmInMacParamNum,nasmInMacDirective,nasmInMacLabel,nasmInMacLblWarn,nasmInMacMemRef,nasmInMacPreConDef,nasmInMacPreCondit,nasmInMacPreProc,nasmInMacStrucDef
176
177"   Context pre-procs that are better used inside a macro
178if exists("nasm_ctx_outside_macro")
179  syn region nasmPreConditDef	transparent matchgroup=nasmCtxPreCondit start="^\s*%ifnctx\>"hs=e-6 start="^\s*%ifctx\>"hs=e-5 end="%endif\>" contains=@nasmGrpCntnPreCon
180  syn match  nasmCtxPreProc	"^\s*%pop\>"hs=e-3
181  if exists("nasm_loose_syntax")
182    syn match   nasmCtxLocLabel	"%$\+\(\w\|[#\.?@~]\)\k*\>"
183  else
184    syn match   nasmCtxLocLabel	"%$\+\(\h\|[?@]\)\k*\>"
185  endif
186  syn match nasmCtxPreProc	"^\s*%\(push\|repl\)\>"hs=e-4 skipwhite nextgroup=@nasmGrpNxtCtx
187  syn match nasmCtxPreCondit	contained transparent "ctx\s"lc=3 skipwhite nextgroup=@nasmGrpNxtCtx
188  syn match nasmCtxPreCondit	contained "^\s*%elifctx\>"hs=e-7 skipwhite nextgroup=@nasmGrpNxtCtx
189  syn match nasmCtxPreCondit	contained "^\s*%elifnctx\>"hs=e-8 skipwhite nextgroup=@nasmGrpNxtCtx
190  if exists("nasm_no_warn")
191    hi link nasmCtxPreCondit	nasmPreCondit
192    hi link nasmCtxPreProc	nasmPreProc
193    hi link nasmCtxLocLabel	nasmLocalLabel
194  else
195    hi link nasmCtxPreCondit	nasmPreProcWarn
196    hi link nasmCtxPreProc	nasmPreProcWarn
197    hi link nasmCtxLocLabel	nasmLabelWarn
198  endif
199endif
200
201"  Conditional assembly
202syn cluster nasmGrpCntnPreCon	contains=ALLBUT,@nasmGrpInComments,@nasmGrpInMacros,@nasmGrpInStrucs
203syn region  nasmPreConditDef	transparent matchgroup=nasmPreCondit start="^\s*%ifnidni\>"hs=e-7 start="^\s*%if\(idni\|n\(def\|idn\|num\|str\)\)\>"hs=e-6 start="^\s*%if\(def\|idn\|nid\|num\|str\)\>"hs=e-5 start="^\s*%ifid\>"hs=e-4 start="^\s*%if\>"hs=e-2 end="%endif\>" contains=@nasmGrpCntnPreCon
204syn match   nasmInPreCondit	contained "^\s*%el\(if\|se\)\>"hs=e-4
205syn match   nasmInPreCondit	contained "^\s*%elifid\>"hs=e-6
206syn match   nasmInPreCondit	contained "^\s*%elif\(def\|idn\|nid\|num\|str\)\>"hs=e-7
207syn match   nasmInPreCondit	contained "^\s*%elif\(n\(def\|idn\|num\|str\)\|idni\)\>"hs=e-8
208syn match   nasmInPreCondit	contained "^\s*%elifnidni\>"hs=e-9
209syn cluster nasmGrpInPreCondits	contains=nasmPreCondit,nasmInPreCondit,nasmCtxPreCondit
210syn cluster nasmGrpPreCondits	contains=nasmPreConditDef,@nasmGrpInPreCondits,nasmCtxPreProc,nasmCtxLocLabel
211
212"  Other pre-processor statements
213syn match   nasmPreProc		"^\s*%rep\>"hs=e-3
214syn match   nasmPreProc		"^\s*%line\>"hs=e-4
215syn match   nasmPreProc		"^\s*%\(clear\|error\)\>"hs=e-5
216syn match   nasmPreProc		"^\s*%endrep\>"hs=e-6
217syn match   nasmPreProc		"^\s*%exitrep\>"hs=e-7
218syn match   nasmDefine		"^\s*%undef\>"hs=e-5
219syn match   nasmDefine		"^\s*%\(assign\|define\)\>"hs=e-6
220syn match   nasmDefine		"^\s*%i\(assign\|define\)\>"hs=e-7
221syn match   nasmInclude		"^\s*%include\>"hs=e-7
222
223"  Multiple pre-processor instructions on single line detection (obsolete)
224"syn match   nasmPreProcError	+^\s*\([^\t "%';][^"%';]*\|[^\t "';][^"%';]\+\)%\a\+\>+
225syn cluster nasmGrpPreProcs	contains=nasmMacroDef,@nasmGrpInMacros,@nasmGrpPreCondits,nasmPreProc,nasmDefine,nasmInclude,nasmPreProcWarn,nasmPreProcError
226
227
228
229" Register Identifiers:
230"  Register operands:
231syn match   nasmGen08Register	"\<[A-D][HL]\>"
232syn match   nasmGen16Register	"\<\([A-D]X\|[DS]I\|[BS]P\)\>"
233syn match   nasmGen32Register	"\<E\([A-D]X\|[DS]I\|[BS]P\)\>"
234syn match   nasmSegRegister	"\<[C-GS]S\>"
235syn match   nasmSpcRegister	"\<E\=IP\>"
236syn match   nasmFpuRegister	"\<ST\o\>"
237syn match   nasmMmxRegister	"\<MM\o\>"
238syn match   nasmSseRegister	"\<XMM\o\>"
239syn match   nasmCtrlRegister	"\<CR\o\>"
240syn match   nasmDebugRegister	"\<DR\o\>"
241syn match   nasmTestRegister	"\<TR\o\>"
242syn match   nasmRegisterError	"\<\(CR[15-9]\|DR[4-58-9]\|TR[0-28-9]\)\>"
243syn match   nasmRegisterError	"\<X\=MM[8-9]\>"
244syn match   nasmRegisterError	"\<ST\((\d)\|[8-9]\>\)"
245syn match   nasmRegisterError	"\<E\([A-D][HL]\|[C-GS]S\)\>"
246"  Memory reference operand (address):
247syn match   nasmMemRefError	"[\[\]]"
248syn cluster nasmGrpCntnMemRef	contains=ALLBUT,@nasmGrpComments,@nasmGrpPreProcs,@nasmGrpInStrucs,nasmMemReference,nasmMemRefError
249syn match   nasmInMacMemRef	contained "\[[^;\[\]]\{-}\]" contains=@nasmGrpCntnMemRef,nasmPreProcError,nasmInMacLabel,nasmInMacLblWarn,nasmInMacParam
250syn match   nasmMemReference	"\[[^;\[\]]\{-}\]" contains=@nasmGrpCntnMemRef,nasmPreProcError,nasmCtxLocLabel
251
252
253
254" Netwide Assembler Directives:
255"  Compilation constants
256syn keyword nasmConstant	__BITS__ __DATE__ __FILE__ __FORMAT__ __LINE__
257syn keyword nasmConstant	__NASM_MAJOR__ __NASM_MINOR__ __NASM_VERSION__
258syn keyword nasmConstant	__TIME__
259"  Instruction modifiers
260syn match   nasmInstructnError	"\<TO\>"
261syn match   nasmInstrModifier	"\(^\|:\)\s*[C-GS]S\>"ms=e-1
262syn keyword nasmInstrModifier	A16 A32 O16 O32
263syn match   nasmInstrModifier	"\<F\(ADD\|MUL\|\(DIV\|SUB\)R\=\)\s\+TO\>"lc=5,ms=e-1
264"   the 'to' keyword is not allowed for fpu-pop instructions (yet)
265"syn match   nasmInstrModifier	"\<F\(ADD\|MUL\|\(DIV\|SUB\)R\=\)P\s\+TO\>"lc=6,ms=e-1
266"  NAsm directives
267syn keyword nasmRepeat		TIMES
268syn keyword nasmDirective	ALIGN[B] INCBIN EQU NOSPLIT SPLIT
269syn keyword nasmDirective	ABSOLUTE BITS SECTION SEGMENT
270syn keyword nasmDirective	ENDSECTION ENDSEGMENT
271syn keyword nasmDirective	__SECT__
272"  Macro created standard directives: (requires %include)
273syn case match
274syn keyword nasmStdDirective	ENDPROC EPILOGUE LOCALS PROC PROLOGUE USES
275syn keyword nasmStdDirective	ENDIF ELSE ELIF ELSIF IF
276"syn keyword nasmStdDirective	BREAK CASE DEFAULT ENDSWITCH SWITCH
277"syn keyword nasmStdDirective	CASE OF ENDCASE
278syn keyword nasmStdDirective	DO ENDFOR ENDWHILE FOR REPEAT UNTIL WHILE EXIT
279syn case ignore
280"  Format specific directives: (all formats)
281"  (excluded: extension directives to section, global, common and extern)
282syn keyword nasmFmtDirective	ORG
283syn keyword nasmFmtDirective	EXPORT IMPORT GROUP UPPERCASE SEG WRT
284syn keyword nasmFmtDirective	LIBRARY
285syn case match
286syn keyword nasmFmtDirective	_GLOBAL_OFFSET_TABLE_ __GLOBAL_OFFSET_TABLE_
287syn keyword nasmFmtDirective	..start ..got ..gotoff ..gotpc ..plt ..sym
288syn case ignore
289
290
291
292" Standard Instructions:
293syn match   nasmInstructnError	"\<\(F\=CMOV\|SET\)N\=\a\{0,2}\>"
294syn keyword nasmInstructnError	CMPS MOVS LCS LODS STOS XLAT
295syn match   nasmStdInstruction	"\<MOV\>"
296syn match   nasmInstructnError	"\<MOV\s[^,;[]*\<CS\>\s*[^:]"he=e-1
297syn match   nasmStdInstruction	"\<\(CMOV\|J\|SET\)\(N\=\([ABGL]E\=\|[CEOSZ]\)\|P[EO]\=\)\>"
298syn match   nasmStdInstruction	"\<POP\>"
299syn keyword nasmStdInstruction	AAA AAD AAM AAS ADC ADD AND
300syn keyword nasmStdInstruction	BOUND BSF BSR BSWAP BT[C] BTR BTS
301syn keyword nasmStdInstruction	CALL CBW CDQ CLC CLD CMC CMP CMPSB CMPSD CMPSW
302syn keyword nasmStdInstruction	CMPXCHG CMPXCHG8B CPUID CWD[E]
303syn keyword nasmStdInstruction	DAA DAS DEC DIV ENTER
304syn keyword nasmStdInstruction	IDIV IMUL INC INT[O] IRET[D] IRETW
305syn keyword nasmStdInstruction	JCXZ JECXZ JMP
306syn keyword nasmStdInstruction	LAHF LDS LEA LEAVE LES LFS LGS LODSB LODSD
307syn keyword nasmStdInstruction	LODSW LOOP[E] LOOPNE LOOPNZ LOOPZ LSS
308syn keyword nasmStdInstruction	MOVSB MOVSD MOVSW MOVSX MOVZX MUL NEG NOP NOT
309syn keyword nasmStdInstruction	OR POPA[D] POPAW POPF[D] POPFW
310syn keyword nasmStdInstruction	PUSH[AD] PUSHAW PUSHF[D] PUSHFW
311syn keyword nasmStdInstruction	RCL RCR RETF RET[N] ROL ROR
312syn keyword nasmStdInstruction	SAHF SAL SAR SBB SCASB SCASD SCASW
313syn keyword nasmStdInstruction	SHL[D] SHR[D] STC STD STOSB STOSD STOSW SUB
314syn keyword nasmStdInstruction	TEST XADD XCHG XLATB XOR
315
316
317" System Instructions: (usually privileged)
318"  Verification of pointer parameters
319syn keyword nasmSysInstruction	ARPL LAR LSL VERR VERW
320"  Addressing descriptor tables
321syn keyword nasmSysInstruction	LLDT SLDT LGDT SGDT
322"  Multitasking
323syn keyword nasmSysInstruction	LTR STR
324"  Coprocessing and Multiprocessing (requires fpu and multiple cpu's resp.)
325syn keyword nasmSysInstruction	CLTS LOCK WAIT
326"  Input and Output
327syn keyword nasmInstructnError	INS OUTS
328syn keyword nasmSysInstruction	IN INSB INSW INSD OUT OUTSB OUTSB OUTSW OUTSD
329"  Interrupt control
330syn keyword nasmSysInstruction	CLI STI LIDT SIDT
331"  System control
332syn match   nasmSysInstruction	"\<MOV\s[^;]\{-}\<CR\o\>"me=s+3
333syn keyword nasmSysInstruction	HLT INVD LMSW
334syn keyword nasmSseInstruction	PREFETCHT0 PREFETCHT1 PREFETCHT2 PREFETCHNTA
335syn keyword nasmSseInstruction	RSM SFENCE SMSW SYSENTER SYSEXIT UD2 WBINVD
336"  TLB (Translation Lookahead Buffer) testing
337syn match   nasmSysInstruction	"\<MOV\s[^;]\{-}\<TR\o\>"me=s+3
338syn keyword nasmSysInstruction	INVLPG
339
340" Debugging Instructions: (privileged)
341syn match   nasmDbgInstruction	"\<MOV\s[^;]\{-}\<DR\o\>"me=s+3
342syn keyword nasmDbgInstruction	INT1 INT3 RDMSR RDTSC RDPMC WRMSR
343
344
345" Floating Point Instructions: (requires FPU)
346syn match   nasmFpuInstruction	"\<FCMOVN\=\([AB]E\=\|[CEPUZ]\)\>"
347syn keyword nasmFpuInstruction	F2XM1 FABS FADD[P] FBLD FBSTP
348syn keyword nasmFpuInstruction	FCHS FCLEX FCOM[IP] FCOMP[P] FCOS
349syn keyword nasmFpuInstruction	FDECSTP FDISI FDIV[P] FDIVR[P] FENI FFREE
350syn keyword nasmFpuInstruction	FIADD FICOM[P] FIDIV[R] FILD
351syn keyword nasmFpuInstruction	FIMUL FINCSTP FINIT FIST[P] FISUB[R]
352syn keyword nasmFpuInstruction	FLD[1] FLDCW FLDENV FLDL2E FLDL2T FLDLG2
353syn keyword nasmFpuInstruction	FLDLN2 FLDPI FLDZ FMUL[P]
354syn keyword nasmFpuInstruction	FNCLEX FNDISI FNENI FNINIT FNOP FNSAVE
355syn keyword nasmFpuInstruction	FNSTCW FNSTENV FNSTSW FNSTSW
356syn keyword nasmFpuInstruction	FPATAN FPREM[1] FPTAN FRNDINT FRSTOR
357syn keyword nasmFpuInstruction	FSAVE FSCALE FSETPM FSIN FSINCOS FSQRT
358syn keyword nasmFpuInstruction	FSTCW FSTENV FST[P] FSTSW FSUB[P] FSUBR[P]
359syn keyword nasmFpuInstruction	FTST FUCOM[IP] FUCOMP[P]
360syn keyword nasmFpuInstruction	FXAM FXCH FXTRACT FYL2X FYL2XP1
361
362
363" Multi Media Xtension Packed Instructions: (requires MMX unit)
364"  Standard MMX instructions: (requires MMX1 unit)
365syn match   nasmInstructnError	"\<P\(ADD\|SUB\)U\=S\=[DQ]\=\>"
366syn match   nasmInstructnError	"\<PCMP\a\{0,2}[BDWQ]\=\>"
367syn keyword nasmMmxInstruction	EMMS MOVD MOVQ
368syn keyword nasmMmxInstruction	PACKSSDW PACKSSWB PACKUSWB PADDB PADDD PADDW
369syn keyword nasmMmxInstruction	PADDSB PADDSW PADDUSB PADDUSW PAND[N]
370syn keyword nasmMmxInstruction	PCMPEQB PCMPEQD PCMPEQW PCMPGTB PCMPGTD PCMPGTW
371syn keyword nasmMmxInstruction	PMACHRIW PMADDWD PMULHW PMULLW POR
372syn keyword nasmMmxInstruction	PSLLD PSLLQ PSLLW PSRAD PSRAW PSRLD PSRLQ PSRLW
373syn keyword nasmMmxInstruction	PSUBB PSUBD PSUBW PSUBSB PSUBSW PSUBUSB PSUBUSW
374syn keyword nasmMmxInstruction	PUNPCKHBW PUNPCKHDQ PUNPCKHWD
375syn keyword nasmMmxInstruction	PUNPCKLBW PUNPCKLDQ PUNPCKLWD PXOR
376"  Extended MMX instructions: (requires MMX2/SSE unit)
377syn keyword nasmMmxInstruction	MASKMOVQ MOVNTQ
378syn keyword nasmMmxInstruction	PAVGB PAVGW PEXTRW PINSRW PMAXSW PMAXUB
379syn keyword nasmMmxInstruction	PMINSW PMINUB PMOVMSKB PMULHUW PSADBW PSHUFW
380
381
382" Streaming SIMD Extension Packed Instructions: (requires SSE unit)
383syn match   nasmInstructnError	"\<CMP\a\{1,5}[PS]S\>"
384syn match   nasmSseInstruction	"\<CMP\(N\=\(EQ\|L[ET]\)\|\(UN\)\=ORD\)\=[PS]S\>"
385syn keyword nasmSseInstruction	ADDPS ADDSS ANDNPS ANDPS
386syn keyword nasmSseInstruction	COMISS CVTPI2PS CVTPS2PI
387syn keyword nasmSseInstruction	CVTSI2SS CVTSS2SI CVTTPS2PI CVTTSS2SI
388syn keyword nasmSseInstruction	DIVPS DIVSS FXRSTOR FXSAVE LDMXCSR
389syn keyword nasmSseInstruction	MAXPS MAXSS MINPS MINSS MOVAPS MOVHLPS MOVHPS
390syn keyword nasmSseInstruction	MOVLHPS MOVLPS MOVMSKPS MOVNTPS MOVSS MOVUPS
391syn keyword nasmSseInstruction	MULPS MULSS
392syn keyword nasmSseInstruction	ORPS RCPPS RCPSS RSQRTPS RSQRTSS
393syn keyword nasmSseInstruction	SHUFPS SQRTPS SQRTSS STMXCSR SUBPS SUBSS
394syn keyword nasmSseInstruction	UCOMISS UNPCKHPS UNPCKLPS XORPS
395
396
397" Three Dimensional Now Packed Instructions: (requires 3DNow! unit)
398syn keyword nasmNowInstruction	FEMMS PAVGUSB PF2ID PFACC PFADD PFCMPEQ PFCMPGE
399syn keyword nasmNowInstruction	PFCMPGT PFMAX PFMIN PFMUL PFRCP PFRCPIT1
400syn keyword nasmNowInstruction	PFRCPIT2 PFRSQIT1 PFRSQRT PFSUB[R] PI2FD
401syn keyword nasmNowInstruction	PMULHRWA PREFETCH[W]
402
403
404" Vendor Specific Instructions:
405"  Cyrix instructions (requires Cyrix processor)
406syn keyword nasmCrxInstruction	PADDSIW PAVEB PDISTIB PMAGW PMULHRW[C] PMULHRIW
407syn keyword nasmCrxInstruction	PMVGEZB PMVLZB PMVNZB PMVZB PSUBSIW
408syn keyword nasmCrxInstruction	RDSHR RSDC RSLDT SMINT SMINTOLD SVDC SVLDT SVTS
409syn keyword nasmCrxInstruction	WRSHR
410"  AMD instructions (requires AMD processor)
411syn keyword nasmAmdInstruction	SYSCALL SYSRET
412
413
414" Undocumented Instructions:
415syn match   nasmUndInstruction	"\<POP\s[^;]*\<CS\>"me=s+3
416syn keyword nasmUndInstruction	CMPXCHG486 IBTS ICEBP INT01 INT03 LOADALL
417syn keyword nasmUndInstruction	LOADALL286 LOADALL386 SALC SMI UD1 UMOV XBTS
418
419
420
421" Synchronize Syntax:
422syn sync clear
423syn sync minlines=50		"for multiple region nesting
424syn sync match  nasmSync	grouphere nasmMacroDef "^\s*%i\=macro\>"me=s-1
425syn sync match	nasmSync	grouphere NONE	       "^\s*%endmacro\>"
426
427
428" Define the default highlighting.
429" For version 5.7 and earlier: only when not done already
430" For version 5.8 and later  : only when an item doesn't have highlighting yet
431if version >= 508 || !exists("did_nasm_syntax_inits")
432  if version < 508
433    let did_nasm_syntax_inits = 1
434    command -nargs=+ HiLink hi link <args>
435  else
436    command -nargs=+ HiLink hi def link <args>
437  endif
438
439  " Sub Links:
440  HiLink nasmInMacDirective	nasmDirective
441  HiLink nasmInMacLabel		nasmLocalLabel
442  HiLink nasmInMacLblWarn	nasmLabelWarn
443  HiLink nasmInMacMacro		nasmMacro
444  HiLink nasmInMacParam		nasmMacro
445  HiLink nasmInMacParamNum	nasmDecNumber
446  HiLink nasmInMacPreCondit	nasmPreCondit
447  HiLink nasmInMacPreProc	nasmPreProc
448  HiLink nasmInPreCondit	nasmPreCondit
449  HiLink nasmInStructure	nasmStructure
450  HiLink nasmStructureLabel	nasmStructure
451
452  " Comment Group:
453  HiLink nasmComment		Comment
454  HiLink nasmSpecialComment	SpecialComment
455  HiLink nasmInCommentTodo	Todo
456
457  " Constant Group:
458  HiLink nasmString		String
459  HiLink nasmStringError	Error
460  HiLink nasmBinNumber		Number
461  HiLink nasmOctNumber		Number
462  HiLink nasmDecNumber		Number
463  HiLink nasmHexNumber		Number
464  HiLink nasmFltNumber		Float
465  HiLink nasmNumberError	Error
466
467  " Identifier Group:
468  HiLink nasmLabel		Identifier
469  HiLink nasmLocalLabel		Identifier
470  HiLink nasmSpecialLabel	Special
471  HiLink nasmLabelError		Error
472  HiLink nasmLabelWarn		Todo
473
474  " PreProc Group:
475  HiLink nasmPreProc		PreProc
476  HiLink nasmDefine		Define
477  HiLink nasmInclude		Include
478  HiLink nasmMacro		Macro
479  HiLink nasmPreCondit		PreCondit
480  HiLink nasmPreProcError	Error
481  HiLink nasmPreProcWarn	Todo
482
483  " Type Group:
484  HiLink nasmType		Type
485  HiLink nasmStorage		StorageClass
486  HiLink nasmStructure		Structure
487  HiLink nasmTypeError		Error
488
489  " Directive Group:
490  HiLink nasmConstant		Constant
491  HiLink nasmInstrModifier	Operator
492  HiLink nasmRepeat		Repeat
493  HiLink nasmDirective		Keyword
494  HiLink nasmStdDirective	Operator
495  HiLink nasmFmtDirective	Keyword
496
497  " Register Group:
498  HiLink nasmCtrlRegister	Special
499  HiLink nasmDebugRegister	Debug
500  HiLink nasmTestRegister	Special
501  HiLink nasmRegisterError	Error
502  HiLink nasmMemRefError	Error
503
504  " Instruction Group:
505  HiLink nasmStdInstruction	Statement
506  HiLink nasmSysInstruction	Statement
507  HiLink nasmDbgInstruction	Debug
508  HiLink nasmFpuInstruction	Statement
509  HiLink nasmMmxInstruction	Statement
510  HiLink nasmSseInstruction	Statement
511  HiLink nasmNowInstruction	Statement
512  HiLink nasmAmdInstruction	Special
513  HiLink nasmCrxInstruction	Special
514  HiLink nasmUndInstruction	Todo
515  HiLink nasmInstructnError	Error
516
517  delcommand HiLink
518endif
519
520let b:current_syntax = "nasm"
521
522" vim:ts=8 sw=4
523