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