blob: 50cbe1ca03c5b6b8ac3224234b17e53d3e2b0d2f [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: NASM - The Netwide Assembler (v0.98)
Bram Moolenaar4a748032010-09-30 21:47:56 +02003" Maintainer: Andriy Sokolov <andriy145@gmail.com>
4" Original Author: Manuel M.H. Stol <Manuel.Stol@allieddata.nl>
5" Former Maintainer: Manuel M.H. Stol <Manuel.Stol@allieddata.nl>
6" Last Change: 2010 Sep 24
7" NASM Home: http://www.nasm.us/
Bram Moolenaar071d4272004-06-13 20:20:40 +00008
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
Bram Moolenaar4a748032010-09-30 21:47:56 +0200164" Todo: allow STRUC/ISTRUC to be used inside preprocessor conditional block
Bram Moolenaar071d4272004-06-13 20:20:40 +0000165syn 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
Bram Moolenaar4a748032010-09-30 21:47:56 +0200215syn match nasmPreProc "^\s*%\(rep\|use\)\>"hs=e-3
Bram Moolenaar071d4272004-06-13 20:20:40 +0000216syn match nasmPreProc "^\s*%line\>"hs=e-4
Bram Moolenaar4a748032010-09-30 21:47:56 +0200217syn 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000220syn 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
Bram Moolenaar4a748032010-09-30 21:47:56 +0200223syn match nasmDefine "^\s*%unmacro\>"hs=e-7
Bram Moolenaar071d4272004-06-13 20:20:40 +0000224syn match nasmInclude "^\s*%include\>"hs=e-7
Bram Moolenaar4a748032010-09-30 21:47:56 +0200225" Todo: Treat the line tail after %fatal, %error, %warning as text
Bram Moolenaar071d4272004-06-13 20:20:40 +0000226
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\)\>"
Bram Moolenaar4a748032010-09-30 21:47:56 +0200238syn match nasmGen64Register "\<R\([A-D]X\|[DS]I\|[BS]P\|[89]\|1[0-5]\|[89][WD]\|1[0-5][WD]\)\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000239syn 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
Bram Moolenaar4a748032010-09-30 21:47:56 +0200306syn keyword nasmStdInstruction CALL CBW CDQ CLC CLD CMC CMP CMPSB CMPSD CMPSW CMPSQ
307syn keyword nasmStdInstruction CMPXCHG CMPXCHG8B CPUID CWD[E] CQO
Bram Moolenaar071d4272004-06-13 20:20:40 +0000308syn keyword nasmStdInstruction DAA DAS DEC DIV ENTER
Bram Moolenaar4a748032010-09-30 21:47:56 +0200309syn keyword nasmStdInstruction IDIV IMUL INC INT[O] IRET[D] IRETW IRETQ
Bram Moolenaar071d4272004-06-13 20:20:40 +0000310syn keyword nasmStdInstruction JCXZ JECXZ JMP
Bram Moolenaar4a748032010-09-30 21:47:56 +0200311syn keyword nasmStdInstruction LAHF LDS LEA LEAVE LES LFS LGS LODSB LODSD LODSQ
Bram Moolenaar071d4272004-06-13 20:20:40 +0000312syn keyword nasmStdInstruction LODSW LOOP[E] LOOPNE LOOPNZ LOOPZ LSS
Bram Moolenaar4a748032010-09-30 21:47:56 +0200313syn 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000316syn keyword nasmStdInstruction RCL RCR RETF RET[N] ROL ROR
317syn keyword nasmStdInstruction SAHF SAL SAR SBB SCASB SCASD SCASW
Bram Moolenaar4a748032010-09-30 21:47:56 +0200318syn keyword nasmStdInstruction SHL[D] SHR[D] STC STD STOSB STOSD STOSW STOSQ SUB
Bram Moolenaar071d4272004-06-13 20:20:40 +0000319syn keyword nasmStdInstruction TEST XADD XCHG XLATB XOR
Bram Moolenaar4a748032010-09-30 21:47:56 +0200320syn keyword nasmStdInstruction LFENCE MFENCE SFENCE
Bram Moolenaar071d4272004-06-13 20:20:40 +0000321
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