blob: a6ed0566502966dd140d0995fd62253ee809de52 [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>
Bram Moolenaar5dc62522012-02-13 00:05:22 +01006" Last Change: 2012 Feb 7
Bram Moolenaar4a748032010-09-30 21:47:56 +02007" 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
Bram Moolenaar5dc62522012-02-13 00:05:22 +010051syn match nasmLabelError "$\=\(\d\+\K\|[#.@]\|\$\$\k\)\k*\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +000052syn 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")
Bram Moolenaar5dc62522012-02-13 00:05:22 +010058 syn match nasmLabelWarn "\<\~\=\$\=[_.][_.\~]*\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +000059endif
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
Bram Moolenaar071d4272004-06-13 20:20:40 +000095" 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
Bram Moolenaar4a748032010-09-30 21:47:56 +0200163" Todo: allow STRUC/ISTRUC to be used inside preprocessor conditional block
Bram Moolenaar071d4272004-06-13 20:20:40 +0000164syn 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")
Bram Moolenaar5dc62522012-02-13 00:05:22 +0100183 syn match nasmCtxLocLabel "%$\+\(\w\|[#.?@~]\)\k*\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000184 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
Bram Moolenaar4a748032010-09-30 21:47:56 +0200214syn match nasmPreProc "^\s*%\(rep\|use\)\>"hs=e-3
Bram Moolenaar071d4272004-06-13 20:20:40 +0000215syn match nasmPreProc "^\s*%line\>"hs=e-4
Bram Moolenaar4a748032010-09-30 21:47:56 +0200216syn 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000219syn 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
Bram Moolenaar4a748032010-09-30 21:47:56 +0200222syn match nasmDefine "^\s*%unmacro\>"hs=e-7
Bram Moolenaar071d4272004-06-13 20:20:40 +0000223syn match nasmInclude "^\s*%include\>"hs=e-7
Bram Moolenaar4a748032010-09-30 21:47:56 +0200224" Todo: Treat the line tail after %fatal, %error, %warning as text
Bram Moolenaar071d4272004-06-13 20:20:40 +0000225
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\)\>"
Bram Moolenaar4a748032010-09-30 21:47:56 +0200237syn 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 +0000238syn 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):
Bram Moolenaar5dc62522012-02-13 00:05:22 +0100251syn match nasmMemRefError "[[\]]"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000252syn cluster nasmGrpCntnMemRef contains=ALLBUT,@nasmGrpComments,@nasmGrpPreProcs,@nasmGrpInStrucs,nasmMemReference,nasmMemRefError
Bram Moolenaar5dc62522012-02-13 00:05:22 +0100253syn match nasmInMacMemRef contained "\[[^;[\]]\{-}\]" contains=@nasmGrpCntnMemRef,nasmPreProcError,nasmInMacLabel,nasmInMacLblWarn,nasmInMacParam
254syn match nasmMemReference "\[[^;[\]]\{-}\]" contains=@nasmGrpCntnMemRef,nasmPreProcError,nasmCtxLocLabel
Bram Moolenaar071d4272004-06-13 20:20:40 +0000255
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
Bram Moolenaar4a748032010-09-30 21:47:56 +0200305syn keyword nasmStdInstruction CALL CBW CDQ CLC CLD CMC CMP CMPSB CMPSD CMPSW CMPSQ
306syn keyword nasmStdInstruction CMPXCHG CMPXCHG8B CPUID CWD[E] CQO
Bram Moolenaar071d4272004-06-13 20:20:40 +0000307syn keyword nasmStdInstruction DAA DAS DEC DIV ENTER
Bram Moolenaar4a748032010-09-30 21:47:56 +0200308syn keyword nasmStdInstruction IDIV IMUL INC INT[O] IRET[D] IRETW IRETQ
Bram Moolenaar071d4272004-06-13 20:20:40 +0000309syn keyword nasmStdInstruction JCXZ JECXZ JMP
Bram Moolenaar4a748032010-09-30 21:47:56 +0200310syn keyword nasmStdInstruction LAHF LDS LEA LEAVE LES LFS LGS LODSB LODSD LODSQ
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311syn keyword nasmStdInstruction LODSW LOOP[E] LOOPNE LOOPNZ LOOPZ LSS
Bram Moolenaar4a748032010-09-30 21:47:56 +0200312syn 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000315syn keyword nasmStdInstruction RCL RCR RETF RET[N] ROL ROR
316syn keyword nasmStdInstruction SAHF SAL SAR SBB SCASB SCASD SCASW
Bram Moolenaar4a748032010-09-30 21:47:56 +0200317syn keyword nasmStdInstruction SHL[D] SHR[D] STC STD STOSB STOSD STOSW STOSQ SUB
Bram Moolenaar071d4272004-06-13 20:20:40 +0000318syn keyword nasmStdInstruction TEST XADD XCHG XLATB XOR
Bram Moolenaar4a748032010-09-30 21:47:56 +0200319syn keyword nasmStdInstruction LFENCE MFENCE SFENCE
Bram Moolenaar071d4272004-06-13 20:20:40 +0000320
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