xref: /vim-8.2.3635/runtime/syntax/nasm.vim (revision 577fadfc)
1" Vim syntax file
2" Language:	NASM - The Netwide Assembler (v0.98)
3" Maintainer:	Andrii Sokolov	<[email protected]>
4" Original Author:	Manuel M.H. Stol	<[email protected]>
5" Former Maintainer:	Manuel M.H. Stol	<[email protected]>
6" Contributors: Leonard König <[email protected]> (C string highlighting)
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][WD]\|1[0-5][WD]\)\>"
244syn match   nasmSegRegister	"\<[C-GS]S\>"
245syn match   nasmSpcRegister	"\<E\=IP\>"
246syn match   nasmFpuRegister	"\<ST\o\>"
247syn match   nasmMmxRegister	"\<MM\o\>"
248syn match   nasmSseRegister	"\<XMM\o\>"
249syn match   nasmCtrlRegister	"\<CR\o\>"
250syn match   nasmDebugRegister	"\<DR\o\>"
251syn match   nasmTestRegister	"\<TR\o\>"
252syn match   nasmRegisterError	"\<\(CR[15-9]\|DR[4-58-9]\|TR[0-28-9]\)\>"
253syn match   nasmRegisterError	"\<X\=MM[8-9]\>"
254syn match   nasmRegisterError	"\<ST\((\d)\|[8-9]\>\)"
255syn match   nasmRegisterError	"\<E\([A-D][HL]\|[C-GS]S\)\>"
256"  Memory reference operand (address):
257syn match   nasmMemRefError	"[[\]]"
258syn cluster nasmGrpCntnMemRef	contains=ALLBUT,@nasmGrpComments,@nasmGrpPreProcs,@nasmGrpInStrucs,nasmMemReference,nasmMemRefError
259syn match   nasmInMacMemRef	contained "\[[^;[\]]\{-}\]" contains=@nasmGrpCntnMemRef,nasmPreProcError,nasmInMacLabel,nasmInMacLblWarn,nasmInMacParam
260syn match   nasmMemReference	"\[[^;[\]]\{-}\]" contains=@nasmGrpCntnMemRef,nasmPreProcError,nasmCtxLocLabel
261
262
263
264" Netwide Assembler Directives:
265"  Compilation constants
266syn keyword nasmConstant	__BITS__ __DATE__ __FILE__ __FORMAT__ __LINE__
267syn keyword nasmConstant	__NASM_MAJOR__ __NASM_MINOR__ __NASM_VERSION__
268syn keyword nasmConstant	__TIME__
269"  Instruction modifiers
270syn match   nasmInstructnError	"\<TO\>"
271syn match   nasmInstrModifier	"\(^\|:\)\s*[C-GS]S\>"ms=e-1
272syn keyword nasmInstrModifier	A16 A32 O16 O32
273syn match   nasmInstrModifier	"\<F\(ADD\|MUL\|\(DIV\|SUB\)R\=\)\s\+TO\>"lc=5,ms=e-1
274"   the 'to' keyword is not allowed for fpu-pop instructions (yet)
275"syn match   nasmInstrModifier	"\<F\(ADD\|MUL\|\(DIV\|SUB\)R\=\)P\s\+TO\>"lc=6,ms=e-1
276"  NAsm directives
277syn keyword nasmRepeat		TIMES
278syn keyword nasmDirective	ALIGN[B] INCBIN EQU NOSPLIT SPLIT
279syn keyword nasmDirective	ABSOLUTE BITS SECTION SEGMENT
280syn keyword nasmDirective	ENDSECTION ENDSEGMENT
281syn keyword nasmDirective	__SECT__
282"  Macro created standard directives: (requires %include)
283syn case match
284syn keyword nasmStdDirective	ENDPROC EPILOGUE LOCALS PROC PROLOGUE USES
285syn keyword nasmStdDirective	ENDIF ELSE ELIF ELSIF IF
286"syn keyword nasmStdDirective	BREAK CASE DEFAULT ENDSWITCH SWITCH
287"syn keyword nasmStdDirective	CASE OF ENDCASE
288syn keyword nasmStdDirective	DO ENDFOR ENDWHILE FOR REPEAT UNTIL WHILE EXIT
289syn case ignore
290"  Format specific directives: (all formats)
291"  (excluded: extension directives to section, global, common and extern)
292syn keyword nasmFmtDirective	ORG
293syn keyword nasmFmtDirective	EXPORT IMPORT GROUP UPPERCASE SEG WRT
294syn keyword nasmFmtDirective	LIBRARY
295syn case match
296syn keyword nasmFmtDirective	_GLOBAL_OFFSET_TABLE_ __GLOBAL_OFFSET_TABLE_
297syn keyword nasmFmtDirective	..start ..got ..gotoff ..gotpc ..plt ..sym
298syn case ignore
299
300
301
302" Standard Instructions:
303syn match   nasmInstructnError	"\<\(F\=CMOV\|SET\)N\=\a\{0,2}\>"
304syn keyword nasmInstructnError	CMPS MOVS LCS LODS STOS XLAT
305syn match   nasmStdInstruction	"\<MOV\>"
306syn match   nasmInstructnError	"\<MOV\s[^,;[]*\<CS\>\s*[^:]"he=e-1
307syn match   nasmStdInstruction	"\<\(CMOV\|J\|SET\)\(N\=\([ABGL]E\=\|[CEOSZ]\)\|P[EO]\=\)\>"
308syn match   nasmStdInstruction	"\<POP\>"
309syn keyword nasmStdInstruction	AAA AAD AAM AAS ADC ADD AND
310syn keyword nasmStdInstruction	BOUND BSF BSR BSWAP BT[C] BTR BTS
311syn keyword nasmStdInstruction	CALL CBW CDQ CLC CLD CMC CMP CMPSB CMPSD CMPSW CMPSQ
312syn keyword nasmStdInstruction	CMPXCHG CMPXCHG8B CPUID CWD[E] CQO
313syn keyword nasmStdInstruction	DAA DAS DEC DIV ENTER
314syn keyword nasmStdInstruction	IDIV IMUL INC INT[O] IRET[D] IRETW IRETQ
315syn keyword nasmStdInstruction	JCXZ JECXZ JMP
316syn keyword nasmStdInstruction	LAHF LDS LEA LEAVE LES LFS LGS LODSB LODSD LODSQ
317syn keyword nasmStdInstruction	LODSW LOOP[E] LOOPNE LOOPNZ LOOPZ LSS
318syn keyword nasmStdInstruction	MOVSB MOVSD MOVSW MOVSX MOVSQ MOVZX MUL NEG NOP NOT
319syn keyword nasmStdInstruction	OR POPA[D] POPAW POPF[D] POPFW POPFQ
320syn keyword nasmStdInstruction	PUSH[AD] PUSHAW PUSHF[D] PUSHFW PUSHFQ
321syn keyword nasmStdInstruction	RCL RCR RETF RET[N] ROL ROR
322syn keyword nasmStdInstruction	SAHF SAL SAR SBB SCASB SCASD SCASW
323syn keyword nasmStdInstruction	SHL[D] SHR[D] STC STD STOSB STOSD STOSW STOSQ SUB
324syn keyword nasmStdInstruction	TEST XADD XCHG XLATB XOR
325syn keyword nasmStdInstruction	LFENCE MFENCE SFENCE
326
327
328" System Instructions: (usually privileged)
329"  Verification of pointer parameters
330syn keyword nasmSysInstruction	ARPL LAR LSL VERR VERW
331"  Addressing descriptor tables
332syn keyword nasmSysInstruction	LLDT SLDT LGDT SGDT
333"  Multitasking
334syn keyword nasmSysInstruction	LTR STR
335"  Coprocessing and Multiprocessing (requires fpu and multiple cpu's resp.)
336syn keyword nasmSysInstruction	CLTS LOCK WAIT
337"  Input and Output
338syn keyword nasmInstructnError	INS OUTS
339syn keyword nasmSysInstruction	IN INSB INSW INSD OUT OUTSB OUTSB OUTSW OUTSD
340"  Interrupt control
341syn keyword nasmSysInstruction	CLI STI LIDT SIDT
342"  System control
343syn match   nasmSysInstruction	"\<MOV\s[^;]\{-}\<CR\o\>"me=s+3
344syn keyword nasmSysInstruction	HLT INVD LMSW
345syn keyword nasmSseInstruction	PREFETCHT0 PREFETCHT1 PREFETCHT2 PREFETCHNTA
346syn keyword nasmSseInstruction	RSM SFENCE SMSW SYSENTER SYSEXIT UD2 WBINVD
347"  TLB (Translation Lookahead Buffer) testing
348syn match   nasmSysInstruction	"\<MOV\s[^;]\{-}\<TR\o\>"me=s+3
349syn keyword nasmSysInstruction	INVLPG
350
351" Debugging Instructions: (privileged)
352syn match   nasmDbgInstruction	"\<MOV\s[^;]\{-}\<DR\o\>"me=s+3
353syn keyword nasmDbgInstruction	INT1 INT3 RDMSR RDTSC RDPMC WRMSR
354
355
356" Floating Point Instructions: (requires FPU)
357syn match   nasmFpuInstruction	"\<FCMOVN\=\([AB]E\=\|[CEPUZ]\)\>"
358syn keyword nasmFpuInstruction	F2XM1 FABS FADD[P] FBLD FBSTP
359syn keyword nasmFpuInstruction	FCHS FCLEX FCOM[IP] FCOMP[P] FCOS
360syn keyword nasmFpuInstruction	FDECSTP FDISI FDIV[P] FDIVR[P] FENI FFREE
361syn keyword nasmFpuInstruction	FIADD FICOM[P] FIDIV[R] FILD
362syn keyword nasmFpuInstruction	FIMUL FINCSTP FINIT FIST[P] FISUB[R]
363syn keyword nasmFpuInstruction	FLD[1] FLDCW FLDENV FLDL2E FLDL2T FLDLG2
364syn keyword nasmFpuInstruction	FLDLN2 FLDPI FLDZ FMUL[P]
365syn keyword nasmFpuInstruction	FNCLEX FNDISI FNENI FNINIT FNOP FNSAVE
366syn keyword nasmFpuInstruction	FNSTCW FNSTENV FNSTSW FNSTSW
367syn keyword nasmFpuInstruction	FPATAN FPREM[1] FPTAN FRNDINT FRSTOR
368syn keyword nasmFpuInstruction	FSAVE FSCALE FSETPM FSIN FSINCOS FSQRT
369syn keyword nasmFpuInstruction	FSTCW FSTENV FST[P] FSTSW FSUB[P] FSUBR[P]
370syn keyword nasmFpuInstruction	FTST FUCOM[IP] FUCOMP[P]
371syn keyword nasmFpuInstruction	FXAM FXCH FXTRACT FYL2X FYL2XP1
372
373
374" Multi Media Xtension Packed Instructions: (requires MMX unit)
375"  Standard MMX instructions: (requires MMX1 unit)
376syn match   nasmInstructnError	"\<P\(ADD\|SUB\)U\=S\=[DQ]\=\>"
377syn match   nasmInstructnError	"\<PCMP\a\{0,2}[BDWQ]\=\>"
378syn keyword nasmMmxInstruction	EMMS MOVD MOVQ
379syn keyword nasmMmxInstruction	PACKSSDW PACKSSWB PACKUSWB PADDB PADDD PADDW
380syn keyword nasmMmxInstruction	PADDSB PADDSW PADDUSB PADDUSW PAND[N]
381syn keyword nasmMmxInstruction	PCMPEQB PCMPEQD PCMPEQW PCMPGTB PCMPGTD PCMPGTW
382syn keyword nasmMmxInstruction	PMACHRIW PMADDWD PMULHW PMULLW POR
383syn keyword nasmMmxInstruction	PSLLD PSLLQ PSLLW PSRAD PSRAW PSRLD PSRLQ PSRLW
384syn keyword nasmMmxInstruction	PSUBB PSUBD PSUBW PSUBSB PSUBSW PSUBUSB PSUBUSW
385syn keyword nasmMmxInstruction	PUNPCKHBW PUNPCKHDQ PUNPCKHWD
386syn keyword nasmMmxInstruction	PUNPCKLBW PUNPCKLDQ PUNPCKLWD PXOR
387"  Extended MMX instructions: (requires MMX2/SSE unit)
388syn keyword nasmMmxInstruction	MASKMOVQ MOVNTQ
389syn keyword nasmMmxInstruction	PAVGB PAVGW PEXTRW PINSRW PMAXSW PMAXUB
390syn keyword nasmMmxInstruction	PMINSW PMINUB PMOVMSKB PMULHUW PSADBW PSHUFW
391
392
393" Streaming SIMD Extension Packed Instructions: (requires SSE unit)
394syn match   nasmInstructnError	"\<CMP\a\{1,5}[PS]S\>"
395syn match   nasmSseInstruction	"\<CMP\(N\=\(EQ\|L[ET]\)\|\(UN\)\=ORD\)\=[PS]S\>"
396syn keyword nasmSseInstruction	ADDPS ADDSS ANDNPS ANDPS
397syn keyword nasmSseInstruction	COMISS CVTPI2PS CVTPS2PI
398syn keyword nasmSseInstruction	CVTSI2SS CVTSS2SI CVTTPS2PI CVTTSS2SI
399syn keyword nasmSseInstruction	DIVPS DIVSS FXRSTOR FXSAVE LDMXCSR
400syn keyword nasmSseInstruction	MAXPS MAXSS MINPS MINSS MOVAPS MOVHLPS MOVHPS
401syn keyword nasmSseInstruction	MOVLHPS MOVLPS MOVMSKPS MOVNTPS MOVSS MOVUPS
402syn keyword nasmSseInstruction	MULPS MULSS
403syn keyword nasmSseInstruction	ORPS RCPPS RCPSS RSQRTPS RSQRTSS
404syn keyword nasmSseInstruction	SHUFPS SQRTPS SQRTSS STMXCSR SUBPS SUBSS
405syn keyword nasmSseInstruction	UCOMISS UNPCKHPS UNPCKLPS XORPS
406
407
408" Three Dimensional Now Packed Instructions: (requires 3DNow! unit)
409syn keyword nasmNowInstruction	FEMMS PAVGUSB PF2ID PFACC PFADD PFCMPEQ PFCMPGE
410syn keyword nasmNowInstruction	PFCMPGT PFMAX PFMIN PFMUL PFRCP PFRCPIT1
411syn keyword nasmNowInstruction	PFRCPIT2 PFRSQIT1 PFRSQRT PFSUB[R] PI2FD
412syn keyword nasmNowInstruction	PMULHRWA PREFETCH[W]
413
414
415" Vendor Specific Instructions:
416"  Cyrix instructions (requires Cyrix processor)
417syn keyword nasmCrxInstruction	PADDSIW PAVEB PDISTIB PMAGW PMULHRW[C] PMULHRIW
418syn keyword nasmCrxInstruction	PMVGEZB PMVLZB PMVNZB PMVZB PSUBSIW
419syn keyword nasmCrxInstruction	RDSHR RSDC RSLDT SMINT SMINTOLD SVDC SVLDT SVTS
420syn keyword nasmCrxInstruction	WRSHR
421"  AMD instructions (requires AMD processor)
422syn keyword nasmAmdInstruction	SYSCALL SYSRET
423
424
425" Undocumented Instructions:
426syn match   nasmUndInstruction	"\<POP\s[^;]*\<CS\>"me=s+3
427syn keyword nasmUndInstruction	CMPXCHG486 IBTS ICEBP INT01 INT03 LOADALL
428syn keyword nasmUndInstruction	LOADALL286 LOADALL386 SALC SMI UD1 UMOV XBTS
429
430
431
432" Synchronize Syntax:
433syn sync clear
434syn sync minlines=50		"for multiple region nesting
435syn sync match  nasmSync	grouphere nasmMacroDef "^\s*%i\=macro\>"me=s-1
436syn sync match	nasmSync	grouphere NONE	       "^\s*%endmacro\>"
437
438
439" Define the default highlighting.
440" Only when an item doesn't have highlighting yet
441
442" Sub Links:
443hi def link nasmInMacDirective	nasmDirective
444hi def link nasmInMacLabel		nasmLocalLabel
445hi def link nasmInMacLblWarn	nasmLabelWarn
446hi def link nasmInMacMacro		nasmMacro
447hi def link nasmInMacParam		nasmMacro
448hi def link nasmInMacParamNum	nasmDecNumber
449hi def link nasmInMacPreCondit	nasmPreCondit
450hi def link nasmInMacPreProc	nasmPreProc
451hi def link nasmInPreCondit	nasmPreCondit
452hi def link nasmInStructure	nasmStructure
453hi def link nasmStructureLabel	nasmStructure
454
455" Comment Group:
456hi def link nasmComment		Comment
457hi def link nasmSpecialComment	SpecialComment
458hi def link nasmInCommentTodo	Todo
459
460" Constant Group:
461hi def link nasmString		String
462hi def link nasmCString	String
463hi def link nasmStringError	Error
464hi def link nasmCStringEscape	SpecialChar
465hi def link nasmCStringFormat	SpecialChar
466hi def link nasmBinNumber		Number
467hi def link nasmOctNumber		Number
468hi def link nasmDecNumber		Number
469hi def link nasmHexNumber		Number
470hi def link nasmFltNumber		Float
471hi def link nasmNumberError	Error
472
473" Identifier Group:
474hi def link nasmLabel		Identifier
475hi def link nasmLocalLabel		Identifier
476hi def link nasmSpecialLabel	Special
477hi def link nasmLabelError		Error
478hi def link nasmLabelWarn		Todo
479
480" PreProc Group:
481hi def link nasmPreProc		PreProc
482hi def link nasmDefine		Define
483hi def link nasmInclude		Include
484hi def link nasmMacro		Macro
485hi def link nasmPreCondit		PreCondit
486hi def link nasmPreProcError	Error
487hi def link nasmPreProcWarn	Todo
488
489" Type Group:
490hi def link nasmType		Type
491hi def link nasmStorage		StorageClass
492hi def link nasmStructure		Structure
493hi def link nasmTypeError		Error
494
495" Directive Group:
496hi def link nasmConstant		Constant
497hi def link nasmInstrModifier	Operator
498hi def link nasmRepeat		Repeat
499hi def link nasmDirective		Keyword
500hi def link nasmStdDirective	Operator
501hi def link nasmFmtDirective	Keyword
502
503" Register Group:
504hi def link nasmCtrlRegister	Special
505hi def link nasmDebugRegister	Debug
506hi def link nasmTestRegister	Special
507hi def link nasmRegisterError	Error
508hi def link nasmMemRefError	Error
509
510" Instruction Group:
511hi def link nasmStdInstruction	Statement
512hi def link nasmSysInstruction	Statement
513hi def link nasmDbgInstruction	Debug
514hi def link nasmFpuInstruction	Statement
515hi def link nasmMmxInstruction	Statement
516hi def link nasmSseInstruction	Statement
517hi def link nasmNowInstruction	Statement
518hi def link nasmAmdInstruction	Special
519hi def link nasmCrxInstruction	Special
520hi def link nasmUndInstruction	Todo
521hi def link nasmInstructnError	Error
522
523
524let b:current_syntax = "nasm"
525
526" vim:ts=8 sw=4
527