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