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