summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2023-02-20 15:48:07 +0100
committerAnton Khirnov <anton@khirnov.net>2023-02-20 15:48:07 +0100
commite999180d94132256eb707493c19a925b58b58943 (patch)
tree3ceb318c478e85e3f04876fa0d5866db52fa736d
parent7b7c24996d09590f728871805d5946eecfe1584f (diff)
vim: add nasm syntax
-rw-r--r--install.conf.yaml7
-rw-r--r--vim/nasm/ftdetect.vim1
-rw-r--r--vim/nasm/ftplugin.vim4
-rw-r--r--vim/nasm/syntax.vim527
-rw-r--r--vim/nasm/syntax_after.vim9
5 files changed, 548 insertions, 0 deletions
diff --git a/install.conf.yaml b/install.conf.yaml
index 5298f4b..20918c2 100644
--- a/install.conf.yaml
+++ b/install.conf.yaml
@@ -9,8 +9,11 @@
- ~/.local/var/dotfiles
- ~/.local/var/less
- ~/.local/var/vim/undo
+ - ~/.vim/after/syntax
- ~/.vim/colors
+ - ~/.vim/ftdetect
- ~/.vim/ftplugin/rst
+ - ~/.vim/syntax
- ~/.vim/pack/dotfiles/start
- ~/.vim/pack/dotfiles/opt
@@ -32,10 +35,14 @@
~/.tmux.conf: dotfiles/tmux.conf
# TODO: clean up and install linediff script
~/.vimrc: vim/vimrc
+ ~/.vim/after/syntax/nasm.vim: vim/nasm/syntax_after.vim
~/.vim/colors/inkpot.vim: vim/inkpot.vim
+ ~/.vim/ftdetect/nasm.vim: vim/nasm/ftdetect.vim
+ ~/.vim/ftplugin/nasm.vim: vim/nasm/ftplugin.vim
~/.vim/ftplugin/rst/dotfiles.vim: vim/rst.vim
~/.vim/pack/dotfiles/start/minisnip: vim/minisnip
~/.vim/pack/dotfiles/start/minisnip_snippets: vim/snippets
~/.vim/pack/dotfiles/opt/extline: vim/extline
+ ~/.vim/syntax/nasm.vim: vim/nasm/syntax.vim
- clean: [~/.vim/]
diff --git a/vim/nasm/ftdetect.vim b/vim/nasm/ftdetect.vim
new file mode 100644
index 0000000..1abb1d5
--- /dev/null
+++ b/vim/nasm/ftdetect.vim
@@ -0,0 +1 @@
+autocmd BufRead,BufNewFile *.asm set filetype=nasm
diff --git a/vim/nasm/ftplugin.vim b/vim/nasm/ftplugin.vim
new file mode 100644
index 0000000..385905e
--- /dev/null
+++ b/vim/nasm/ftplugin.vim
@@ -0,0 +1,4 @@
+let b:match_words = &matchpairs
+ \ . ',%if:%else:%endif'
+ \ . ',%macro\>:%endmacro\>'
+ \ . ',%rep\>:%endrep\>'
diff --git a/vim/nasm/syntax.vim b/vim/nasm/syntax.vim
new file mode 100644
index 0000000..bdfe9c1
--- /dev/null
+++ b/vim/nasm/syntax.vim
@@ -0,0 +1,527 @@
+" Vim syntax file
+" Language: NASM - The Netwide Assembler (v0.98)
+" Maintainer: Andriy Sokolov <andriy145@gmail.com>
+" Original Author: Manuel M.H. Stol <Manuel.Stol@allieddata.nl>
+" Former Maintainer: Manuel M.H. Stol <Manuel.Stol@allieddata.nl>
+" Last Change: 2012 Feb 7
+" NASM Home: http://www.nasm.us/
+
+
+
+" Setup Syntax:
+" Clear old syntax settings
+if version < 600
+ syn clear
+elseif exists("b:current_syntax")
+ finish
+endif
+" Assembler syntax is case insensetive
+syn case ignore
+
+
+
+" Vim search and movement commands on identifers
+if version < 600
+ " Comments at start of a line inside which to skip search for indentifiers
+ set comments=:;
+ " Identifier Keyword characters (defines \k)
+ set iskeyword=@,48-57,#,$,.,?,@-@,_,~
+else
+ " Comments at start of a line inside which to skip search for indentifiers
+ setlocal comments=:;
+ " Identifier Keyword characters (defines \k)
+ setlocal iskeyword=@,48-57,#,$,.,?,@-@,_,~
+endif
+
+
+
+" Comments:
+syn region nasmComment start=";" keepend end="$" contains=@nasmGrpInComments
+syn region nasmSpecialComment start=";\*\*\*" keepend end="$"
+syn keyword nasmInCommentTodo contained TODO FIXME XXX[XXXXX]
+syn cluster nasmGrpInComments contains=nasmInCommentTodo
+syn cluster nasmGrpComments contains=@nasmGrpInComments,nasmComment,nasmSpecialComment
+
+
+
+" Label Identifiers:
+" in NASM: 'Everything is a Label'
+" Definition Label = label defined by %[i]define or %[i]assign
+" Identifier Label = label defined as first non-keyword on a line or %[i]macro
+syn match nasmLabelError "$\=\(\d\+\K\|[#.@]\|\$\$\k\)\k*\>"
+"syn match nasmLabel "\<\(\h\|[?@]\)\k*\>"
+"syn match nasmLabel "[\$\~]\(\h\|[?@]\)\k*\>"lc=1
+" Labels starting with one or two '.' are special
+syn match nasmLocalLabel "\<\.\(\w\|[#$?@~]\)\k*\>"
+syn match nasmLocalLabel "\<\$\.\(\w\|[#$?@~]\)\k*\>"ms=s+1
+if !exists("nasm_no_warn")
+ syn match nasmLabelWarn "\<\~\=\$\=[_.][_.\~]*\>"
+endif
+if exists("nasm_loose_syntax")
+ syn match nasmSpecialLabel "\<\.\.@\k\+\>"
+ syn match nasmSpecialLabel "\<\$\.\.@\k\+\>"ms=s+1
+ if !exists("nasm_no_warn")
+ syn match nasmLabelWarn "\<\$\=\.\.@\(\d\|[#$\.~]\)\k*\>"
+ endif
+ " disallow use of nasm internal label format
+ syn match nasmLabelError "\<\$\=\.\.@\d\+\.\k*\>"
+else
+ syn match nasmSpecialLabel "\<\.\.@\(\h\|[?@]\)\k*\>"
+ syn match nasmSpecialLabel "\<\$\.\.@\(\h\|[?@]\)\k*\>"ms=s+1
+endif
+" Labels can be dereferenced with '$' to destinguish them from reserved words
+syn match nasmLabelError "\<\$\K\k*\s*:"
+syn match nasmLabelError "^\s*\$\K\k*\>"
+syn match nasmLabelError "\<\~\s*\(\k*\s*:\|\$\=\.\k*\)"
+
+
+
+" Constants:
+syn match nasmStringError +["']+
+syn match nasmString +\("[^"]\{-}"\|'[^']\{-}'\)+
+syn match nasmBinNumber "\<[0-1]\+b\>"
+syn match nasmBinNumber "\<\~[0-1]\+b\>"lc=1
+syn match nasmOctNumber "\<\o\+q\>"
+syn match nasmOctNumber "\<\~\o\+q\>"lc=1
+syn match nasmDecNumber "\<\d\+\>"
+syn match nasmDecNumber "\<\~\d\+\>"lc=1
+syn match nasmHexNumber "\<\(\d\x*h\|0x\x\+\|\$\d\x*\)\>"
+syn match nasmHexNumber "\<\~\(\d\x*h\|0x\x\+\|\$\d\x*\)\>"lc=1
+syn match nasmFltNumber "\<\d\+\.\d*\(e[+-]\=\d\+\)\=\>"
+syn keyword nasmFltNumber Inf Infinity Indefinite NaN SNaN QNaN
+syn match nasmNumberError "\<\~\s*\d\+\.\d*\(e[+-]\=\d\+\)\=\>"
+
+
+" Netwide Assembler Storage Directives:
+" Storage types
+syn keyword nasmTypeError DF EXTRN FWORD RESF TBYTE
+syn keyword nasmType FAR NEAR SHORT
+syn keyword nasmType BYTE WORD DWORD QWORD DQWORD HWORD DHWORD TWORD
+syn keyword nasmType CDECL FASTCALL NONE PASCAL STDCALL
+syn keyword nasmStorage DB DW DD DQ DDQ DT
+syn keyword nasmStorage RESB RESW RESD RESQ RESDQ REST
+syn keyword nasmStorage EXTERN GLOBAL COMMON
+" Structured storage types
+syn match nasmTypeError "\<\(AT\|I\=\(END\)\=\(STRUCT\=\|UNION\)\|I\=END\)\>"
+syn match nasmStructureLabel contained "\<\(AT\|I\=\(END\)\=\(STRUCT\=\|UNION\)\|I\=END\)\>"
+" structures cannot be nested (yet) -> use: 'keepend' and 're='
+syn cluster nasmGrpCntnStruc contains=ALLBUT,@nasmGrpInComments,nasmMacroDef,@nasmGrpInMacros,@nasmGrpInPreCondits,nasmStructureDef,@nasmGrpInStrucs
+syn region nasmStructureDef transparent matchgroup=nasmStructure keepend start="^\s*STRUCT\>"hs=e-5 end="^\s*ENDSTRUCT\>"re=e-9 contains=@nasmGrpCntnStruc
+syn region nasmStructureDef transparent matchgroup=nasmStructure keepend start="^\s*STRUC\>"hs=e-4 end="^\s*ENDSTRUC\>"re=e-8 contains=@nasmGrpCntnStruc
+syn region nasmStructureDef transparent matchgroup=nasmStructure keepend start="\<ISTRUCT\=\>" end="\<IEND\(STRUCT\=\)\=\>" contains=@nasmGrpCntnStruc,nasmInStructure
+" union types are not part of nasm (yet)
+"syn region nasmStructureDef transparent matchgroup=nasmStructure keepend start="^\s*UNION\>"hs=e-4 end="^\s*ENDUNION\>"re=e-8 contains=@nasmGrpCntnStruc
+"syn region nasmStructureDef transparent matchgroup=nasmStructure keepend start="\<IUNION\>" end="\<IEND\(UNION\)\=\>" contains=@nasmGrpCntnStruc,nasmInStructure
+syn match nasmInStructure contained "^\s*AT\>"hs=e-1
+syn cluster nasmGrpInStrucs contains=nasmStructure,nasmInStructure,nasmStructureLabel
+
+
+
+" PreProcessor Instructions:
+" NAsm PreProcs start with %, but % is not a character
+syn match nasmPreProcError "%{\=\(%\=\k\+\|%%\+\k*\|[+-]\=\d\+\)}\="
+if exists("nasm_loose_syntax")
+ syn cluster nasmGrpNxtCtx contains=nasmStructureLabel,nasmLabel,nasmLocalLabel,nasmSpecialLabel,nasmLabelError,nasmPreProcError
+else
+ syn cluster nasmGrpNxtCtx contains=nasmStructureLabel,nasmLabel,nasmLabelError,nasmPreProcError
+endif
+
+" Multi-line macro
+syn cluster nasmGrpCntnMacro contains=ALLBUT,@nasmGrpInComments,nasmStructureDef,@nasmGrpInStrucs,nasmMacroDef,@nasmGrpPreCondits,nasmMemReference,nasmInMacPreCondit,nasmInMacStrucDef
+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 fold
+if exists("nasm_loose_syntax")
+ syn match nasmInMacLabel contained "%\(%\k\+\>\|{%\k\+}\)"
+ syn match nasmInMacLabel contained "%\($\+\(\w\|[#\.?@~]\)\k*\>\|{$\+\(\w\|[#\.?@~]\)\k*}\)"
+ syn match nasmInMacPreProc contained "^\s*%\(push\|repl\)\>"hs=e-4 skipwhite nextgroup=nasmStructureLabel,nasmLabel,nasmInMacParam,nasmLocalLabel,nasmSpecialLabel,nasmLabelError,nasmPreProcError
+ if !exists("nasm_no_warn")
+ syn match nasmInMacLblWarn contained "%\(%[$\.]\k*\>\|{%[$\.]\k*}\)"
+ syn match nasmInMacLblWarn contained "%\($\+\(\d\|[#\.@~]\)\k*\|{\$\+\(\d\|[#\.@~]\)\k*}\)"
+ hi link nasmInMacCatLabel nasmInMacLblWarn
+ else
+ hi link nasmInMacCatLabel nasmInMacLabel
+ endif
+else
+ syn match nasmInMacLabel contained "%\(%\(\w\|[#?@~]\)\k*\>\|{%\(\w\|[#?@~]\)\k*}\)"
+ syn match nasmInMacLabel contained "%\($\+\(\h\|[?@]\)\k*\>\|{$\+\(\h\|[?@]\)\k*}\)"
+ hi link nasmInMacCatLabel nasmLabelError
+endif
+syn match nasmInMacCatLabel contained "\d\K\k*"lc=1
+syn match nasmInMacLabel contained "\d}\k\+"lc=2
+if !exists("nasm_no_warn")
+ syn match nasmInMacLblWarn contained "%\(\($\+\|%\)[_~][._~]*\>\|{\($\+\|%\)[_~][._~]*}\)"
+endif
+syn match nasmInMacPreProc contained "^\s*%pop\>"hs=e-3
+syn match nasmInMacPreProc contained "^\s*%\(push\|repl\)\>"hs=e-4 skipwhite nextgroup=@nasmGrpNxtCtx
+" structures cannot be nested (yet) -> use: 'keepend' and 're='
+syn region nasmInMacStrucDef contained transparent matchgroup=nasmStructure keepend start="^\s*STRUCT\>"hs=e-5 end="^\s*ENDSTRUCT\>"re=e-9 contains=@nasmGrpCntnMacro
+syn region nasmInMacStrucDef contained transparent matchgroup=nasmStructure keepend start="^\s*STRUC\>"hs=e-4 end="^\s*ENDSTRUC\>"re=e-8 contains=@nasmGrpCntnMacro
+syn region nasmInMacStrucDef contained transparent matchgroup=nasmStructure keepend start="\<ISTRUCT\=\>" end="\<IEND\(STRUCT\=\)\=\>" contains=@nasmGrpCntnMacro,nasmInStructure
+" union types are not part of nasm (yet)
+"syn region nasmInMacStrucDef contained transparent matchgroup=nasmStructure keepend start="^\s*UNION\>"hs=e-4 end="^\s*ENDUNION\>"re=e-8 contains=@nasmGrpCntnMacro
+"syn region nasmInMacStrucDef contained transparent matchgroup=nasmStructure keepend start="\<IUNION\>" end="\<IEND\(UNION\)\=\>" contains=@nasmGrpCntnMacro,nasmInStructure
+syn region nasmInMacPreConDef contained fold 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
+" Todo: allow STRUC/ISTRUC to be used inside preprocessor conditional block
+syn match nasmInMacPreCondit contained transparent "ctx\s"lc=3 skipwhite nextgroup=@nasmGrpNxtCtx
+syn match nasmInMacPreCondit contained "^\s*%elifctx\>"hs=e-7 skipwhite nextgroup=@nasmGrpNxtCtx
+syn match nasmInMacPreCondit contained "^\s*%elifnctx\>"hs=e-8 skipwhite nextgroup=@nasmGrpNxtCtx
+syn match nasmInMacParamNum contained "\<\d\+\.list\>"me=e-5
+syn match nasmInMacParamNum contained "\<\d\+\.nolist\>"me=e-7
+syn match nasmInMacDirective contained "\.\(no\)\=list\>"
+syn match nasmInMacMacro contained transparent "macro\s"lc=5 skipwhite nextgroup=nasmStructureLabel
+syn match nasmInMacMacro contained "^\s*%rotate\>"hs=e-6
+syn match nasmInMacParam contained "%\([+-]\=\d\+\|{[+-]\=\d\+}\)"
+" nasm conditional macro operands/arguments
+" Todo: check feasebility; add too nasmGrpInMacros, etc.
+"syn match nasmInMacCond contained "\<\(N\=\([ABGL]E\=\|[CEOSZ]\)\|P[EO]\=\)\>"
+syn cluster nasmGrpInMacros contains=nasmMacro,nasmInMacMacro,nasmInMacParam,nasmInMacParamNum,nasmInMacDirective,nasmInMacLabel,nasmInMacLblWarn,nasmInMacMemRef,nasmInMacPreConDef,nasmInMacPreCondit,nasmInMacPreProc,nasmInMacStrucDef
+
+" Context pre-procs that are better used inside a macro
+if exists("nasm_ctx_outside_macro")
+ syn region nasmPreConditDef transparent matchgroup=nasmCtxPreCondit start="^\s*%ifnctx\>"hs=e-6 start="^\s*%ifctx\>"hs=e-5 end="%endif\>" contains=@nasmGrpCntnPreCon
+ syn match nasmCtxPreProc "^\s*%pop\>"hs=e-3
+ if exists("nasm_loose_syntax")
+ syn match nasmCtxLocLabel "%$\+\(\w\|[#.?@~]\)\k*\>"
+ else
+ syn match nasmCtxLocLabel "%$\+\(\h\|[?@]\)\k*\>"
+ endif
+ syn match nasmCtxPreProc "^\s*%\(push\|repl\)\>"hs=e-4 skipwhite nextgroup=@nasmGrpNxtCtx
+ syn match nasmCtxPreCondit contained transparent "ctx\s"lc=3 skipwhite nextgroup=@nasmGrpNxtCtx
+ syn match nasmCtxPreCondit contained "^\s*%elifctx\>"hs=e-7 skipwhite nextgroup=@nasmGrpNxtCtx
+ syn match nasmCtxPreCondit contained "^\s*%elifnctx\>"hs=e-8 skipwhite nextgroup=@nasmGrpNxtCtx
+ if exists("nasm_no_warn")
+ hi link nasmCtxPreCondit nasmPreCondit
+ hi link nasmCtxPreProc nasmPreProc
+ hi link nasmCtxLocLabel nasmLocalLabel
+ else
+ hi link nasmCtxPreCondit nasmPreProcWarn
+ hi link nasmCtxPreProc nasmPreProcWarn
+ hi link nasmCtxLocLabel nasmLabelWarn
+ endif
+endif
+
+" Conditional assembly
+syn cluster nasmGrpCntnPreCon contains=ALLBUT,@nasmGrpInComments,@nasmGrpInMacros,@nasmGrpInStrucs
+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
+syn match nasmInPreCondit contained "^\s*%el\(if\|se\)\>"hs=e-4
+syn match nasmInPreCondit contained "^\s*%elifid\>"hs=e-6
+syn match nasmInPreCondit contained "^\s*%elif\(def\|idn\|nid\|num\|str\)\>"hs=e-7
+syn match nasmInPreCondit contained "^\s*%elif\(n\(def\|idn\|num\|str\)\|idni\)\>"hs=e-8
+syn match nasmInPreCondit contained "^\s*%elifnidni\>"hs=e-9
+syn cluster nasmGrpInPreCondits contains=nasmPreCondit,nasmInPreCondit,nasmCtxPreCondit
+syn cluster nasmGrpPreCondits contains=nasmPreConditDef,@nasmGrpInPreCondits,nasmCtxPreProc,nasmCtxLocLabel
+
+" Other pre-processor statements
+syn match nasmPreProc "^\s*%\(rep\|use\)\>"hs=e-3
+syn match nasmPreProc "^\s*%line\>"hs=e-4
+syn match nasmPreProc "^\s*%\(clear\|error\|fatal\)\>"hs=e-5
+syn match nasmPreProc "^\s*%\(endrep\|strlen\|substr\)\>"hs=e-6
+syn match nasmPreProc "^\s*%\(exitrep\|warning\)\>"hs=e-7
+syn match nasmDefine "^\s*%undef\>"hs=e-5
+syn match nasmDefine "^\s*%\(assign\|define\)\>"hs=e-6
+syn match nasmDefine "^\s*%i\(assign\|define\)\>"hs=e-7
+syn match nasmDefine "^\s*%unmacro\>"hs=e-7
+syn match nasmInclude "^\s*%include\>"hs=e-7
+" Todo: Treat the line tail after %fatal, %error, %warning as text
+
+" Multiple pre-processor instructions on single line detection (obsolete)
+"syn match nasmPreProcError +^\s*\([^\t "%';][^"%';]*\|[^\t "';][^"%';]\+\)%\a\+\>+
+syn cluster nasmGrpPreProcs contains=nasmMacroDef,@nasmGrpInMacros,@nasmGrpPreCondits,nasmPreProc,nasmDefine,nasmInclude,nasmPreProcWarn,nasmPreProcError
+
+
+
+" Register Identifiers:
+" Register operands:
+syn match nasmGen08Register "\<[A-D][HL]\>"
+syn match nasmGen16Register "\<\([A-D]X\|[DS]I\|[BS]P\)\>"
+syn match nasmGen32Register "\<E\([A-D]X\|[DS]I\|[BS]P\)\>"
+syn match nasmGen64Register "\<R\([A-D]X\|[DS]I\|[BS]P\|[89]\|1[0-5]\|[89][WD]\|1[0-5][WD]\)\>"
+syn match nasmSegRegister "\<[C-GS]S\>"
+syn match nasmSpcRegister "\<E\=IP\>"
+syn match nasmFpuRegister "\<ST\o\>"
+syn match nasmMmxRegister "\<MM\o\>"
+syn match nasmSseRegister "\<XMM\o\>"
+syn match nasmCtrlRegister "\<CR\o\>"
+syn match nasmDebugRegister "\<DR\o\>"
+syn match nasmTestRegister "\<TR\o\>"
+syn match nasmRegisterError "\<\(CR[15-9]\|DR[4-58-9]\|TR[0-28-9]\)\>"
+syn match nasmRegisterError "\<X\=MM[8-9]\>"
+syn match nasmRegisterError "\<ST\((\d)\|[8-9]\>\)"
+syn match nasmRegisterError "\<E\([A-D][HL]\|[C-GS]S\)\>"
+" Memory reference operand (address):
+syn match nasmMemRefError "[[\]]"
+syn cluster nasmGrpCntnMemRef contains=ALLBUT,@nasmGrpComments,@nasmGrpPreProcs,@nasmGrpInStrucs,nasmMemReference,nasmMemRefError
+syn match nasmInMacMemRef contained "\[[^;[\]]\{-}\]" contains=@nasmGrpCntnMemRef,nasmPreProcError,nasmInMacLabel,nasmInMacLblWarn,nasmInMacParam
+syn match nasmMemReference "\[[^;[\]]\{-}\]" contains=@nasmGrpCntnMemRef,nasmPreProcError,nasmCtxLocLabel
+
+
+
+" Netwide Assembler Directives:
+" Compilation constants
+syn keyword nasmConstant __BITS__ __DATE__ __FILE__ __FORMAT__ __LINE__
+syn keyword nasmConstant __NASM_MAJOR__ __NASM_MINOR__ __NASM_VERSION__
+syn keyword nasmConstant __TIME__
+" Instruction modifiers
+syn match nasmInstructnError "\<TO\>"
+syn match nasmInstrModifier "\(^\|:\)\s*[C-GS]S\>"ms=e-1
+syn keyword nasmInstrModifier A16 A32 O16 O32
+syn match nasmInstrModifier "\<F\(ADD\|MUL\|\(DIV\|SUB\)R\=\)\s\+TO\>"lc=5,ms=e-1
+" the 'to' keyword is not allowed for fpu-pop instructions (yet)
+"syn match nasmInstrModifier "\<F\(ADD\|MUL\|\(DIV\|SUB\)R\=\)P\s\+TO\>"lc=6,ms=e-1
+" NAsm directives
+syn keyword nasmRepeat TIMES
+syn keyword nasmDirective ALIGN[B] INCBIN EQU NOSPLIT SPLIT
+syn keyword nasmDirective ABSOLUTE BITS SECTION SEGMENT
+syn keyword nasmDirective ENDSECTION ENDSEGMENT
+syn keyword nasmDirective __SECT__
+" Macro created standard directives: (requires %include)
+syn case match
+syn keyword nasmStdDirective ENDPROC EPILOGUE LOCALS PROC PROLOGUE USES
+syn keyword nasmStdDirective ENDIF ELSE ELIF ELSIF IF
+"syn keyword nasmStdDirective BREAK CASE DEFAULT ENDSWITCH SWITCH
+"syn keyword nasmStdDirective CASE OF ENDCASE
+syn keyword nasmStdDirective DO ENDFOR ENDWHILE FOR REPEAT UNTIL WHILE EXIT
+syn case ignore
+" Format specific directives: (all formats)
+" (excluded: extension directives to section, global, common and extern)
+syn keyword nasmFmtDirective ORG
+syn keyword nasmFmtDirective EXPORT IMPORT GROUP UPPERCASE SEG WRT
+syn keyword nasmFmtDirective LIBRARY
+syn case match
+syn keyword nasmFmtDirective _GLOBAL_OFFSET_TABLE_ __GLOBAL_OFFSET_TABLE_
+syn keyword nasmFmtDirective ..start ..got ..gotoff ..gotpc ..plt ..sym
+syn case ignore
+
+
+
+" Standard Instructions:
+syn match nasmInstructnError "\<\(F\=CMOV\|SET\)N\=\a\{0,2}\>"
+syn keyword nasmInstructnError CMPS MOVS LCS LODS STOS XLAT
+syn match nasmStdInstruction "\<MOV\>"
+syn match nasmInstructnError "\<MOV\s[^,;[]*\<CS\>\s*[^:]"he=e-1
+syn match nasmStdInstruction "\<\(CMOV\|J\|SET\)\(N\=\([ABGL]E\=\|[CEOSZ]\)\|P[EO]\=\)\>"
+syn match nasmStdInstruction "\<POP\>"
+syn keyword nasmStdInstruction AAA AAD AAM AAS ADC ADD AND
+syn keyword nasmStdInstruction BOUND BSF BSR BSWAP BT[C] BTR BTS
+syn keyword nasmStdInstruction CALL CBW CDQ CLC CLD CMC CMP CMPSB CMPSD CMPSW CMPSQ
+syn keyword nasmStdInstruction CMPXCHG CMPXCHG8B CPUID CWD[E] CQO
+syn keyword nasmStdInstruction DAA DAS DEC DIV ENTER
+syn keyword nasmStdInstruction IDIV IMUL INC INT[O] IRET[D] IRETW IRETQ
+syn keyword nasmStdInstruction JCXZ JECXZ JMP
+syn keyword nasmStdInstruction LAHF LDS LEA LEAVE LES LFS LGS LODSB LODSD LODSQ
+syn keyword nasmStdInstruction LODSW LOOP[E] LOOPNE LOOPNZ LOOPZ LSS
+syn keyword nasmStdInstruction MOVSB MOVSD MOVSW MOVSX MOVSQ MOVZX MUL NEG NOP NOT
+syn keyword nasmStdInstruction OR POPA[D] POPAW POPF[D] POPFW POPFQ
+syn keyword nasmStdInstruction PUSH[AD] PUSHAW PUSHF[D] PUSHFW PUSHFQ
+syn keyword nasmStdInstruction RCL RCR RETF RET[N] ROL ROR
+syn keyword nasmStdInstruction SAHF SAL SAR SBB SCASB SCASD SCASW
+syn keyword nasmStdInstruction SHL[D] SHR[D] STC STD STOSB STOSD STOSW STOSQ SUB
+syn keyword nasmStdInstruction TEST XADD XCHG XLATB XOR
+syn keyword nasmStdInstruction LFENCE MFENCE SFENCE
+
+
+" System Instructions: (usually privileged)
+" Verification of pointer parameters
+syn keyword nasmSysInstruction ARPL LAR LSL VERR VERW
+" Addressing descriptor tables
+syn keyword nasmSysInstruction LLDT SLDT LGDT SGDT
+" Multitasking
+syn keyword nasmSysInstruction LTR STR
+" Coprocessing and Multiprocessing (requires fpu and multiple cpu's resp.)
+syn keyword nasmSysInstruction CLTS LOCK WAIT
+" Input and Output
+syn keyword nasmInstructnError INS OUTS
+syn keyword nasmSysInstruction IN INSB INSW INSD OUT OUTSB OUTSB OUTSW OUTSD
+" Interrupt control
+syn keyword nasmSysInstruction CLI STI LIDT SIDT
+" System control
+syn match nasmSysInstruction "\<MOV\s[^;]\{-}\<CR\o\>"me=s+3
+syn keyword nasmSysInstruction HLT INVD LMSW
+syn keyword nasmSseInstruction PREFETCHT0 PREFETCHT1 PREFETCHT2 PREFETCHNTA
+syn keyword nasmSseInstruction RSM SFENCE SMSW SYSENTER SYSEXIT UD2 WBINVD
+" TLB (Translation Lookahead Buffer) testing
+syn match nasmSysInstruction "\<MOV\s[^;]\{-}\<TR\o\>"me=s+3
+syn keyword nasmSysInstruction INVLPG
+
+" Debugging Instructions: (privileged)
+syn match nasmDbgInstruction "\<MOV\s[^;]\{-}\<DR\o\>"me=s+3
+syn keyword nasmDbgInstruction INT1 INT3 RDMSR RDTSC RDPMC WRMSR
+
+
+" Floating Point Instructions: (requires FPU)
+syn match nasmFpuInstruction "\<FCMOVN\=\([AB]E\=\|[CEPUZ]\)\>"
+syn keyword nasmFpuInstruction F2XM1 FABS FADD[P] FBLD FBSTP
+syn keyword nasmFpuInstruction FCHS FCLEX FCOM[IP] FCOMP[P] FCOS
+syn keyword nasmFpuInstruction FDECSTP FDISI FDIV[P] FDIVR[P] FENI FFREE
+syn keyword nasmFpuInstruction FIADD FICOM[P] FIDIV[R] FILD
+syn keyword nasmFpuInstruction FIMUL FINCSTP FINIT FIST[P] FISUB[R]
+syn keyword nasmFpuInstruction FLD[1] FLDCW FLDENV FLDL2E FLDL2T FLDLG2
+syn keyword nasmFpuInstruction FLDLN2 FLDPI FLDZ FMUL[P]
+syn keyword nasmFpuInstruction FNCLEX FNDISI FNENI FNINIT FNOP FNSAVE
+syn keyword nasmFpuInstruction FNSTCW FNSTENV FNSTSW FNSTSW
+syn keyword nasmFpuInstruction FPATAN FPREM[1] FPTAN FRNDINT FRSTOR
+syn keyword nasmFpuInstruction FSAVE FSCALE FSETPM FSIN FSINCOS FSQRT
+syn keyword nasmFpuInstruction FSTCW FSTENV FST[P] FSTSW FSUB[P] FSUBR[P]
+syn keyword nasmFpuInstruction FTST FUCOM[IP] FUCOMP[P]
+syn keyword nasmFpuInstruction FXAM FXCH FXTRACT FYL2X FYL2XP1
+
+
+" Multi Media Xtension Packed Instructions: (requires MMX unit)
+" Standard MMX instructions: (requires MMX1 unit)
+syn match nasmInstructnError "\<P\(ADD\|SUB\)U\=S\=[DQ]\=\>"
+syn match nasmInstructnError "\<PCMP\a\{0,2}[BDWQ]\=\>"
+syn keyword nasmMmxInstruction EMMS MOVD MOVQ
+syn keyword nasmMmxInstruction PACKSSDW PACKSSWB PACKUSWB PADDB PADDD PADDW
+syn keyword nasmMmxInstruction PADDSB PADDSW PADDUSB PADDUSW PAND[N]
+syn keyword nasmMmxInstruction PCMPEQB PCMPEQD PCMPEQW PCMPGTB PCMPGTD PCMPGTW
+syn keyword nasmMmxInstruction PMACHRIW PMADDWD PMULHW PMULLW POR
+syn keyword nasmMmxInstruction PSLLD PSLLQ PSLLW PSRAD PSRAW PSRLD PSRLQ PSRLW
+syn keyword nasmMmxInstruction PSUBB PSUBD PSUBW PSUBSB PSUBSW PSUBUSB PSUBUSW
+syn keyword nasmMmxInstruction PUNPCKHBW PUNPCKHDQ PUNPCKHWD
+syn keyword nasmMmxInstruction PUNPCKLBW PUNPCKLDQ PUNPCKLWD PXOR
+" Extended MMX instructions: (requires MMX2/SSE unit)
+syn keyword nasmMmxInstruction MASKMOVQ MOVNTQ
+syn keyword nasmMmxInstruction PAVGB PAVGW PEXTRW PINSRW PHADDW PMAXSW PMAXUB
+syn keyword nasmMmxInstruction PMINSW PMINUB PMOVMSKB PMULHUW PSADBW PSHUFW
+
+
+" Streaming SIMD Extension Packed Instructions: (requires SSE unit)
+syn match nasmInstructnError "\<CMP\a\{1,5}[PS]S\>"
+syn match nasmSseInstruction "\<CMP\(N\=\(EQ\|L[ET]\)\|\(UN\)\=ORD\)\=[PS]S\>"
+syn keyword nasmSseInstruction ADDPS ADDSS ANDNPS ANDPS
+syn keyword nasmSseInstruction COMISS CVTPI2PS CVTPS2PI
+syn keyword nasmSseInstruction CVTSI2SS CVTSS2SI CVTTPS2PI CVTTSS2SI
+syn keyword nasmSseInstruction DIVPS DIVSS FXRSTOR FXSAVE LDMXCSR
+syn keyword nasmSseInstruction MAXPS MAXSS MINPS MINSS MOVAPS MOVHLPS MOVHPS
+syn keyword nasmSseInstruction MOVLHPS MOVLPS MOVMSKPS MOVNTPS MOVSS MOVUPS
+syn keyword nasmSseInstruction MULPS MULSS
+syn keyword nasmSseInstruction ORPS RCPPS RCPSS RSQRTPS RSQRTSS
+syn keyword nasmSseInstruction SHUFPS SQRTPS SQRTSS STMXCSR SUBPS SUBSS
+syn keyword nasmSseInstruction UCOMISS UNPCKHPS UNPCKLPS XORPS
+
+
+" Three Dimensional Now Packed Instructions: (requires 3DNow! unit)
+syn keyword nasmNowInstruction FEMMS PAVGUSB PF2ID PFACC PFADD PFCMPEQ PFCMPGE
+syn keyword nasmNowInstruction PFCMPGT PFMAX PFMIN PFMUL PFRCP PFRCPIT1
+syn keyword nasmNowInstruction PFRCPIT2 PFRSQIT1 PFRSQRT PFSUB[R] PI2FD
+syn keyword nasmNowInstruction PMULHRWA PREFETCH[W]
+
+
+" Vendor Specific Instructions:
+" Cyrix instructions (requires Cyrix processor)
+syn keyword nasmCrxInstruction PADDSIW PAVEB PDISTIB PMAGW PMULHRW[C] PMULHRIW
+syn keyword nasmCrxInstruction PMVGEZB PMVLZB PMVNZB PMVZB PSUBSIW
+syn keyword nasmCrxInstruction RDSHR RSDC RSLDT SMINT SMINTOLD SVDC SVLDT SVTS
+syn keyword nasmCrxInstruction WRSHR
+" AMD instructions (requires AMD processor)
+syn keyword nasmAmdInstruction SYSCALL SYSRET
+
+
+" Undocumented Instructions:
+syn match nasmUndInstruction "\<POP\s[^;]*\<CS\>"me=s+3
+syn keyword nasmUndInstruction CMPXCHG486 IBTS ICEBP INT01 INT03 LOADALL
+syn keyword nasmUndInstruction LOADALL286 LOADALL386 SALC SMI UD1 UMOV XBTS
+
+
+
+" Synchronize Syntax:
+syn sync clear
+syn sync minlines=50 "for multiple region nesting
+syn sync match nasmSync grouphere nasmMacroDef "^\s*%i\=macro\>"me=s-1
+syn sync match nasmSync grouphere NONE "^\s*%endmacro\>"
+
+
+" Define the default highlighting.
+" For version 5.7 and earlier: only when not done already
+" For version 5.8 and later : only when an item doesn't have highlighting yet
+if version >= 508 || !exists("did_nasm_syntax_inits")
+ if version < 508
+ let did_nasm_syntax_inits = 1
+ command -nargs=+ HiLink hi link <args>
+ else
+ command -nargs=+ HiLink hi def link <args>
+ endif
+
+ " Sub Links:
+ HiLink nasmInMacDirective nasmDirective
+ HiLink nasmInMacLabel nasmLocalLabel
+ HiLink nasmInMacLblWarn nasmLabelWarn
+ HiLink nasmInMacMacro nasmMacro
+ HiLink nasmInMacParam nasmMacro
+ HiLink nasmInMacParamNum nasmDecNumber
+ HiLink nasmInMacPreCondit nasmPreCondit
+ HiLink nasmInMacPreProc nasmPreProc
+ HiLink nasmInPreCondit nasmPreCondit
+ HiLink nasmInStructure nasmStructure
+ HiLink nasmStructureLabel nasmStructure
+
+ " Comment Group:
+ HiLink nasmComment Comment
+ HiLink nasmSpecialComment SpecialComment
+ HiLink nasmInCommentTodo Todo
+
+ " Constant Group:
+ HiLink nasmString String
+ HiLink nasmStringError Error
+ HiLink nasmBinNumber Number
+ HiLink nasmOctNumber Number
+ HiLink nasmDecNumber Number
+ HiLink nasmHexNumber Number
+ HiLink nasmFltNumber Float
+ HiLink nasmNumberError Error
+
+ " Identifier Group:
+ HiLink nasmLabel Identifier
+ HiLink nasmLocalLabel Identifier
+ HiLink nasmSpecialLabel Special
+ "HiLink nasmLabelError Error
+ HiLink nasmLabelWarn Todo
+
+ " PreProc Group:
+ HiLink nasmPreProc PreProc
+ HiLink nasmDefine Define
+ HiLink nasmInclude Include
+ HiLink nasmMacro Macro
+ HiLink nasmPreCondit PreCondit
+ HiLink nasmPreProcError Error
+ HiLink nasmPreProcWarn Todo
+
+ " Type Group:
+ HiLink nasmType Type
+ HiLink nasmStorage StorageClass
+ HiLink nasmStructure Structure
+ HiLink nasmTypeError Error
+
+ " Directive Group:
+ HiLink nasmConstant Constant
+ HiLink nasmInstrModifier Operator
+ HiLink nasmRepeat Repeat
+ HiLink nasmDirective Keyword
+ HiLink nasmStdDirective Operator
+ HiLink nasmFmtDirective Keyword
+
+ " Register Group:
+ HiLink nasmCtrlRegister Special
+ HiLink nasmDebugRegister Debug
+ HiLink nasmTestRegister Special
+ HiLink nasmRegisterError Error
+ HiLink nasmMemRefError Error
+
+ " Instruction Group:
+ HiLink nasmStdInstruction Statement
+ HiLink nasmSysInstruction Statement
+ HiLink nasmDbgInstruction Debug
+ HiLink nasmFpuInstruction Statement
+ HiLink nasmMmxInstruction Statement
+ HiLink nasmSseInstruction Statement
+ HiLink nasmNowInstruction Statement
+ HiLink nasmAmdInstruction Special
+ HiLink nasmCrxInstruction Special
+ HiLink nasmUndInstruction Todo
+ HiLink nasmInstructnError Error
+
+ delcommand HiLink
+endif
+
+let b:current_syntax = "nasm"
+
+" vim:ts=8 sw=4
diff --git a/vim/nasm/syntax_after.vim b/vim/nasm/syntax_after.vim
new file mode 100644
index 0000000..80cf2fe
--- /dev/null
+++ b/vim/nasm/syntax_after.vim
@@ -0,0 +1,9 @@
+syn keyword x86incInstruction MOVA MOVH
+syn keyword x86incInitCpuflags INIT_MMX INIT_XMM INIT_YMM INIT_ZMM
+syn keyword x86incCpuflags mmx mmx2 mmxext 3dnow 3dnowext sse sse2 sse2slow sse3 ssse3 sse4 sse42 avx avx2 xop fma4 fma3
+syn keyword x86incDefs cextern cglobal
+
+hi link x86incInitCpuflags Special
+hi link x86incInstruction Statement
+hi link x86incCpuflags Define
+hi link x86incDefs Define