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