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