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