1" Vim syntax file 2" Language: Microsoft Macro Assembler (80x86) 3" Orig Author: Rob Brady <[email protected]> 4" Maintainer: Wu Yongwei <[email protected]> 5" Last Change: $Date: 2012/02/04 12:45:39 $ 6" $Revision: 1.46 $ 7 8" For version 5.x: Clear all syntax items 9" For version 6.x: Quit when a syntax file was already loaded 10if version < 600 11 syntax clear 12elseif exists("b:current_syntax") 13 finish 14endif 15 16let s:cpo_save = &cpo 17set cpo&vim 18 19syn case ignore 20 21 22syn match masmIdentifier "[@a-z_$?][@a-z0-9_$?]*" 23syn match masmLabel "^\s*[@a-z_$?][@a-z0-9_$?]*:"he=e-1 24 25syn match masmDecimal "[-+]\?\d\+[dt]\?" 26syn match masmBinary "[-+]\?[0-1]\+[by]" "put this before hex or 0bfh dies! 27syn match masmOctal "[-+]\?[0-7]\+[oq]" 28syn match masmHexadecimal "[-+]\?[0-9]\x*h" 29syn match masmFloatRaw "[-+]\?[0-9]\x*r" 30syn match masmFloat "[-+]\?\d\+\.\(\d*\(E[-+]\?\d\+\)\?\)\?" 31 32syn match masmComment ";.*" contains=@Spell 33syn region masmComment start=+COMMENT\s*\z(\S\)+ end=+\z1.*+ contains=@Spell 34syn region masmString start=+'+ end=+'+ oneline contains=@Spell 35syn region masmString start=+"+ end=+"+ oneline contains=@Spell 36 37syn region masmTitleArea start=+\<TITLE\s+lc=5 start=+\<SUBTITLE\s+lc=8 start=+\<SUBTTL\s+lc=6 end=+$+ end=+;+me=e-1 contains=masmTitle 38syn region masmTextArea start=+\<NAME\s+lc=4 start=+\<INCLUDE\s+lc=7 start=+\<INCLUDELIB\s+lc=10 end=+$+ end=+;+me=e-1 contains=masmText 39syn match masmTitle "[^\t ;]\([^;]*[^\t ;]\)\?" contained contains=@Spell 40syn match masmText "[^\t ;]\([^;]*[^\t ;]\)\?" contained 41 42syn region masmOptionOpt start=+\<OPTION\s+lc=6 end=+$+ end=+;+me=e-1 contains=masmOption 43syn region masmContextOpt start=+\<PUSHCONTEXT\s+lc=11 start=+\<POPCONTEXT\s+lc=10 end=+$+ end=+;+me=e-1 contains=masmOption 44syn region masmModelOpt start=+\.MODEL\s+lc=6 end=+$+ end=+;+me=e-1 contains=masmOption,masmType 45syn region masmSegmentOpt start=+\<SEGMENT\s+lc=7 end=+$+ end=+;+me=e-1 contains=masmOption,masmString 46syn region masmProcOpt start=+\<PROC\s+lc=4 end=+$+ end=+;+me=e-1 contains=masmOption,masmType,masmRegister,masmIdentifier 47syn region masmAssumeOpt start=+\<ASSUME\s+lc=6 end=+$+ end=+;+me=e-1 contains=masmOption,masmOperator,masmType,masmRegister,masmIdentifier 48syn region masmExpression start=+\.IF\s+lc=3 start=+\.WHILE\s+lc=6 start=+\.UNTIL\s+lc=6 start=+\<IF\s+lc=2 start=+\<IF2\s+lc=3 start=+\<ELSEIF\s+lc=6 start=+\<ELSEIF2\s+lc=7 start=+\<REPEAT\s+lc=6 start=+\<WHILE\s+lc=5 end=+$+ end=+;+me=e-1 contains=masmType,masmOperator,masmRegister,masmIdentifier,masmDecimal,masmBinary,masmHexadecimal,masmFloatRaw,masmString 49 50syn keyword masmOption TINY SMALL COMPACT MEDIUM LARGE HUGE contained 51syn keyword masmOption NEARSTACK FARSTACK contained 52syn keyword masmOption PUBLIC PRIVATE STACK COMMON MEMORY AT contained 53syn keyword masmOption BYTE WORD DWORD PARA PAGE contained 54syn keyword masmOption USE16 USE32 FLAT contained 55syn keyword masmOption INFO READ WRITE EXECUTE SHARED contained 56syn keyword masmOption NOPAGE NOCACHE DISCARD contained 57syn keyword masmOption READONLY USES FRAME contained 58syn keyword masmOption CASEMAP DOTNAME NODOTNAME EMULATOR contained 59syn keyword masmOption NOEMULATOR EPILOGUE EXPR16 EXPR32 contained 60syn keyword masmOption LANGUAGE LJMP NOLJMP M510 NOM510 contained 61syn keyword masmOption NOKEYWORD NOSIGNEXTEND OFFSET contained 62syn keyword masmOption OLDMACROS NOOLDMACROS OLDSTRUCTS contained 63syn keyword masmOption NOOLDSTRUCTS PROC PROLOGUE READONLY contained 64syn keyword masmOption NOREADONLY SCOPED NOSCOPED SEGMENT contained 65syn keyword masmOption SETIF2 contained 66syn keyword masmOption ABS ALL ASSUMES CPU ERROR EXPORT contained 67syn keyword masmOption FORCEFRAME LISTING LOADDS NONE contained 68syn keyword masmOption NONUNIQUE NOTHING OS_DOS RADIX REQ contained 69syn keyword masmType STDCALL SYSCALL C BASIC FORTRAN PASCAL 70syn keyword masmType PTR NEAR FAR NEAR16 FAR16 NEAR32 FAR32 71syn keyword masmType REAL4 REAL8 REAL10 BYTE SBYTE TBYTE 72syn keyword masmType WORD DWORD QWORD FWORD SWORD SDWORD 73syn keyword masmOperator AND NOT OR SHL SHR XOR MOD DUP 74syn keyword masmOperator EQ GE GT LE LT NE 75syn keyword masmOperator LROFFSET SEG LENGTH LENGTHOF SIZE SIZEOF 76syn keyword masmOperator CODEPTR DATAPTR FAR NEAR SHORT THIS TYPE 77syn keyword masmOperator HIGH HIGHWORD LOW LOWWORD OPATTR MASK WIDTH 78syn match masmOperator "OFFSET\(\sFLAT:\)\?" 79syn match masmOperator ".TYPE\>" 80syn match masmOperator "CARRY?" 81syn match masmOperator "OVERFLOW?" 82syn match masmOperator "PARITY?" 83syn match masmOperator "SIGN?" 84syn match masmOperator "ZERO?" 85syn keyword masmDirective ALIAS ASSUME CATSTR COMM DB DD DF DOSSEG DQ DT 86syn keyword masmDirective DW ECHO ELSE ELSEIF ELSEIF1 ELSEIF2 ELSEIFB 87syn keyword masmDirective ELSEIFDEF ELSEIFDIF ELSEIFDIFI ELSEIFE 88syn keyword masmDirective ELSEIFIDN ELSEIFIDNI ELSEIFNB ELSEIFNDEF END 89syn keyword masmDirective ENDIF ENDM ENDP ENDS EQU EVEN EXITM EXTERN 90syn keyword masmDirective EXTERNDEF EXTRN FOR FORC GOTO GROUP IF IF1 IF2 91syn keyword masmDirective IFB IFDEF IFDIF IFDIFI IFE IFIDN IFIDNI IFNB 92syn keyword masmDirective IFNDEF INCLUDE INCLUDELIB INSTR INVOKE IRP 93syn keyword masmDirective IRPC LABEL LOCAL MACRO NAME OPTION ORG PAGE 94syn keyword masmDirective POPCONTEXT PROC PROTO PUBLIC PURGE PUSHCONTEXT 95syn keyword masmDirective RECORD REPEAT REPT SEGMENT SIZESTR STRUC 96syn keyword masmDirective STRUCT SUBSTR SUBTITLE SUBTTL TEXTEQU TITLE 97syn keyword masmDirective TYPEDEF UNION WHILE 98syn match masmDirective "\.8086\>" 99syn match masmDirective "\.8087\>" 100syn match masmDirective "\.NO87\>" 101syn match masmDirective "\.186\>" 102syn match masmDirective "\.286\>" 103syn match masmDirective "\.286C\>" 104syn match masmDirective "\.286P\>" 105syn match masmDirective "\.287\>" 106syn match masmDirective "\.386\>" 107syn match masmDirective "\.386C\>" 108syn match masmDirective "\.386P\>" 109syn match masmDirective "\.387\>" 110syn match masmDirective "\.486\>" 111syn match masmDirective "\.486P\>" 112syn match masmDirective "\.586\>" 113syn match masmDirective "\.586P\>" 114syn match masmDirective "\.686\>" 115syn match masmDirective "\.686P\>" 116syn match masmDirective "\.K3D\>" 117syn match masmDirective "\.MMX\>" 118syn match masmDirective "\.XMM\>" 119syn match masmDirective "\.ALPHA\>" 120syn match masmDirective "\.DOSSEG\>" 121syn match masmDirective "\.SEQ\>" 122syn match masmDirective "\.CODE\>" 123syn match masmDirective "\.CONST\>" 124syn match masmDirective "\.DATA\>" 125syn match masmDirective "\.DATA?" 126syn match masmDirective "\.EXIT\>" 127syn match masmDirective "\.FARDATA\>" 128syn match masmDirective "\.FARDATA?" 129syn match masmDirective "\.MODEL\>" 130syn match masmDirective "\.STACK\>" 131syn match masmDirective "\.STARTUP\>" 132syn match masmDirective "\.IF\>" 133syn match masmDirective "\.ELSE\>" 134syn match masmDirective "\.ELSEIF\>" 135syn match masmDirective "\.ENDIF\>" 136syn match masmDirective "\.REPEAT\>" 137syn match masmDirective "\.UNTIL\>" 138syn match masmDirective "\.UNTILCXZ\>" 139syn match masmDirective "\.WHILE\>" 140syn match masmDirective "\.ENDW\>" 141syn match masmDirective "\.BREAK\>" 142syn match masmDirective "\.CONTINUE\>" 143syn match masmDirective "\.ERR\>" 144syn match masmDirective "\.ERR1\>" 145syn match masmDirective "\.ERR2\>" 146syn match masmDirective "\.ERRB\>" 147syn match masmDirective "\.ERRDEF\>" 148syn match masmDirective "\.ERRDIF\>" 149syn match masmDirective "\.ERRDIFI\>" 150syn match masmDirective "\.ERRE\>" 151syn match masmDirective "\.ERRIDN\>" 152syn match masmDirective "\.ERRIDNI\>" 153syn match masmDirective "\.ERRNB\>" 154syn match masmDirective "\.ERRNDEF\>" 155syn match masmDirective "\.ERRNZ\>" 156syn match masmDirective "\.LALL\>" 157syn match masmDirective "\.SALL\>" 158syn match masmDirective "\.XALL\>" 159syn match masmDirective "\.LFCOND\>" 160syn match masmDirective "\.SFCOND\>" 161syn match masmDirective "\.TFCOND\>" 162syn match masmDirective "\.CREF\>" 163syn match masmDirective "\.NOCREF\>" 164syn match masmDirective "\.XCREF\>" 165syn match masmDirective "\.LIST\>" 166syn match masmDirective "\.NOLIST\>" 167syn match masmDirective "\.XLIST\>" 168syn match masmDirective "\.LISTALL\>" 169syn match masmDirective "\.LISTIF\>" 170syn match masmDirective "\.NOLISTIF\>" 171syn match masmDirective "\.LISTMACRO\>" 172syn match masmDirective "\.NOLISTMACRO\>" 173syn match masmDirective "\.LISTMACROALL\>" 174syn match masmDirective "\.FPO\>" 175syn match masmDirective "\.RADIX\>" 176syn match masmDirective "\.SAFESEH\>" 177syn match masmDirective "%OUT\>" 178syn match masmDirective "ALIGN\>" 179syn match masmOption "ALIGN([0-9]\+)" 180 181syn keyword masmRegister AX BX CX DX SI DI BP SP 182syn keyword masmRegister CS DS SS ES FS GS 183syn keyword masmRegister AH BH CH DH AL BL CL DL 184syn keyword masmRegister EAX EBX ECX EDX ESI EDI EBP ESP 185syn keyword masmRegister CR0 CR2 CR3 CR4 186syn keyword masmRegister DR0 DR1 DR2 DR3 DR6 DR7 187syn keyword masmRegister TR3 TR4 TR5 TR6 TR7 188syn match masmRegister "ST([0-7])" 189 190" x86-64 registers 191syn keyword masmRegister RAX RBX RCX RDX RSI RDI RBP RSP 192syn keyword masmRegister R8 R9 R10 R11 R12 R13 R14 R15 193syn keyword masmRegister R8D R9D R10D R11D R12D R13D R14D R15D 194syn keyword masmRegister R8W R9W R10W R11W R12W R13W R14W R15W 195syn keyword masmRegister R8B R9B R10B R11B R12B R13B R14B R15B 196 197" Instruction prefixes 198syn keyword masmOpcode LOCK REP REPE REPNE REPNZ REPZ 199 200" 8086/8088 opcodes 201syn keyword masmOpcode AAA AAD AAM AAS ADC ADD AND CALL CBW CLC CLD 202syn keyword masmOpcode CLI CMC CMP CMPS CMPSB CMPSW CWD DAA DAS DEC 203syn keyword masmOpcode DIV ESC HLT IDIV IMUL IN INC INT INTO IRET 204syn keyword masmOpcode JCXZ JMP LAHF LDS LEA LES LODS LODSB LODSW 205syn keyword masmOpcode LOOP LOOPE LOOPEW LOOPNE LOOPNEW LOOPNZ 206syn keyword masmOpcode LOOPNZW LOOPW LOOPZ LOOPZW MOV MOVS MOVSB 207syn keyword masmOpcode MOVSW MUL NEG NOP NOT OR OUT POP POPF PUSH 208syn keyword masmOpcode PUSHF RCL RCR RET RETF RETN ROL ROR SAHF SAL 209syn keyword masmOpcode SAR SBB SCAS SCASB SCASW SHL SHR STC STD STI 210syn keyword masmOpcode STOS STOSB STOSW SUB TEST WAIT XCHG XLAT XLATB 211syn keyword masmOpcode XOR 212syn match masmOpcode "J\(P[EO]\|\(N\?\([ABGL]E\?\|[CEOPSZ]\)\)\)\>" 213 214" 80186 opcodes 215syn keyword masmOpcode BOUND ENTER INS INSB INSW LEAVE OUTS OUTSB 216syn keyword masmOpcode OUTSW POPA PUSHA PUSHW 217 218" 80286 opcodes 219syn keyword masmOpcode ARPL LAR LSL SGDT SIDT SLDT SMSW STR VERR VERW 220 221" 80286/80386 privileged opcodes 222syn keyword masmOpcode CLTS LGDT LIDT LLDT LMSW LTR 223 224" 80386 opcodes 225syn keyword masmOpcode BSF BSR BT BTC BTR BTS CDQ CMPSD CWDE INSD 226syn keyword masmOpcode IRETD IRETDF IRETF JECXZ LFS LGS LODSD LOOPD 227syn keyword masmOpcode LOOPED LOOPNED LOOPNZD LOOPZD LSS MOVSD MOVSX 228syn keyword masmOpcode MOVZX OUTSD POPAD POPFD PUSHAD PUSHD PUSHFD 229syn keyword masmOpcode SCASD SHLD SHRD STOSD 230syn match masmOpcode "SET\(P[EO]\|\(N\?\([ABGL]E\?\|[CEOPSZ]\)\)\)\>" 231 232" 80486 opcodes 233syn keyword masmOpcode BSWAP CMPXCHG INVD INVLPG WBINVD XADD 234 235" Floating-point opcodes as of 487 236syn keyword masmOpFloat F2XM1 FABS FADD FADDP FBLD FBSTP FCHS FCLEX 237syn keyword masmOpFloat FNCLEX FCOM FCOMP FCOMPP FCOS FDECSTP FDISI 238syn keyword masmOpFloat FNDISI FDIV FDIVP FDIVR FDIVRP FENI FNENI 239syn keyword masmOpFloat FFREE FIADD FICOM FICOMP FIDIV FIDIVR FILD 240syn keyword masmOpFloat FIMUL FINCSTP FINIT FNINIT FIST FISTP FISUB 241syn keyword masmOpFloat FISUBR FLD FLDCW FLDENV FLDLG2 FLDLN2 FLDL2E 242syn keyword masmOpFloat FLDL2T FLDPI FLDZ FLD1 FMUL FMULP FNOP FPATAN 243syn keyword masmOpFloat FPREM FPREM1 FPTAN FRNDINT FRSTOR FSAVE FNSAVE 244syn keyword masmOpFloat FSCALE FSETPM FSIN FSINCOS FSQRT FST FSTCW 245syn keyword masmOpFloat FNSTCW FSTENV FNSTENV FSTP FSTSW FNSTSW FSUB 246syn keyword masmOpFloat FSUBP FSUBR FSUBRP FTST FUCOM FUCOMP FUCOMPP 247syn keyword masmOpFloat FWAIT FXAM FXCH FXTRACT FYL2X FYL2XP1 248 249" Floating-point opcodes in Pentium and later processors 250syn keyword masmOpFloat FCMOVE FCMOVNE FCMOVB FCMOVBE FCMOVNB FCMOVNBE 251syn keyword masmOpFloat FCMOVU FCMOVNU FCOMI FUCOMI FCOMIP FUCOMIP 252syn keyword masmOpFloat FXSAVE FXRSTOR 253 254" MMX opcodes (Pentium w/ MMX, Pentium II, and later) 255syn keyword masmOpcode MOVD MOVQ PACKSSWB PACKSSDW PACKUSWB 256syn keyword masmOpcode PUNPCKHBW PUNPCKHWD PUNPCKHDQ 257syn keyword masmOpcode PUNPCKLBW PUNPCKLWD PUNPCKLDQ 258syn keyword masmOpcode PADDB PADDW PADDD PADDSB PADDSW PADDUSB PADDUSW 259syn keyword masmOpcode PSUBB PSUBW PSUBD PSUBSB PSUBSW PSUBUSB PSUBUSW 260syn keyword masmOpcode PMULHW PMULLW PMADDWD 261syn keyword masmOpcode PCMPEQB PCMPEQW PCMPEQD PCMPGTB PCMPGTW PCMPGTD 262syn keyword masmOpcode PAND PANDN POR PXOR 263syn keyword masmOpcode PSLLW PSLLD PSLLQ PSRLW PSRLD PSRLQ PSRAW PSRAD 264syn keyword masmOpcode EMMS 265 266" SSE opcodes (Pentium III and later) 267syn keyword masmOpcode MOVAPS MOVUPS MOVHPS MOVHLPS MOVLPS MOVLHPS 268syn keyword masmOpcode MOVMSKPS MOVSS 269syn keyword masmOpcode ADDPS ADDSS SUBPS SUBSS MULPS MULSS DIVPS DIVSS 270syn keyword masmOpcode RCPPS RCPSS SQRTPS SQRTSS RSQRTPS RSQRTSS 271syn keyword masmOpcode MAXPS MAXSS MINPS MINSS 272syn keyword masmOpcode CMPPS CMPSS COMISS UCOMISS 273syn keyword masmOpcode ANDPS ANDNPS ORPS XORPS 274syn keyword masmOpcode SHUFPS UNPCKHPS UNPCKLPS 275syn keyword masmOpcode CVTPI2PS CVTSI2SS CVTPS2PI CVTTPS2PI 276syn keyword masmOpcode CVTSS2SI CVTTSS2SI 277syn keyword masmOpcode LDMXCSR STMXCSR 278syn keyword masmOpcode PAVGB PAVGW PEXTRW PINSRW PMAXUB PMAXSW 279syn keyword masmOpcode PMINUB PMINSW PMOVMSKB PMULHUW PSADBW PSHUFW 280syn keyword masmOpcode MASKMOVQ MOVNTQ MOVNTPS SFENCE 281syn keyword masmOpcode PREFETCHT0 PREFETCHT1 PREFETCHT2 PREFETCHNTA 282 283" SSE2 opcodes (Pentium 4 and later) 284syn keyword masmOpcode MOVAPD MOVUPD MOVHPD MOVLPD MOVMSKPD MOVSD 285syn keyword masmOpcode ADDPD ADDSD SUBPD SUBSD MULPD MULSD DIVPD DIVSD 286syn keyword masmOpcode SQRTPD SQRTSD MAXPD MAXSD MINPD MINSD 287syn keyword masmOpcode ANDPD ANDNPD ORPD XORPD 288syn keyword masmOpcode CMPPD CMPSD COMISD UCOMISD 289syn keyword masmOpcode SHUFPD UNPCKHPD UNPCKLPD 290syn keyword masmOpcode CVTPD2PI CVTTPD2PI CVTPI2PD CVTPD2DQ 291syn keyword masmOpcode CVTTPD2DQ CVTDQ2PD CVTPS2PD CVTPD2PS 292syn keyword masmOpcode CVTSS2SD CVTSD2SS CVTSD2SI CVTTSD2SI CVTSI2SD 293syn keyword masmOpcode CVTDQ2PS CVTPS2DQ CVTTPS2DQ 294syn keyword masmOpcode MOVDQA MOVDQU MOVQ2DQ MOVDQ2Q PMULUDQ 295syn keyword masmOpcode PADDQ PSUBQ PSHUFLW PSHUFHW PSHUFD 296syn keyword masmOpcode PSLLDQ PSRLDQ PUNPCKHQDQ PUNPCKLQDQ 297syn keyword masmOpcode CLFLUSH LFENCE MFENCE PAUSE MASKMOVDQU 298syn keyword masmOpcode MOVNTPD MOVNTDQ MOVNTI 299 300" SSE3 opcodes (Pentium 4 w/ Hyper-Threading and later) 301syn keyword masmOpcode FISTTP LDDQU ADDSUBPS ADDSUBPD 302syn keyword masmOpcode HADDPS HSUBPS HADDPD HSUBPD 303syn keyword masmOpcode MOVSHDUP MOVSLDUP MOVDDUP MONITOR MWAIT 304 305" Other opcodes in Pentium and later processors 306syn keyword masmOpcode CMPXCHG8B CPUID UD2 307syn keyword masmOpcode RSM RDMSR WRMSR RDPMC RDTSC SYSENTER SYSEXIT 308syn match masmOpcode "CMOV\(P[EO]\|\(N\?\([ABGL]E\?\|[CEOPSZ]\)\)\)\>" 309 310 311" Define the default highlighting. 312" For version 5.7 and earlier: only when not done already 313" For version 5.8 and later: only when an item doesn't have highlighting yet 314if version >= 508 || !exists("did_masm_syntax_inits") 315 if version < 508 316 let did_masm_syntax_inits = 1 317 command -nargs=+ HiLink hi link <args> 318 else 319 command -nargs=+ HiLink hi def link <args> 320 endif 321 322 " The default methods for highlighting. Can be overridden later 323 HiLink masmLabel PreProc 324 HiLink masmComment Comment 325 HiLink masmDirective Statement 326 HiLink masmType Type 327 HiLink masmOperator Type 328 HiLink masmOption Special 329 HiLink masmRegister Special 330 HiLink masmString String 331 HiLink masmText String 332 HiLink masmTitle Title 333 HiLink masmOpcode Statement 334 HiLink masmOpFloat Statement 335 336 HiLink masmHexadecimal Number 337 HiLink masmDecimal Number 338 HiLink masmOctal Number 339 HiLink masmBinary Number 340 HiLink masmFloatRaw Number 341 HiLink masmFloat Number 342 343 HiLink masmIdentifier Identifier 344 345 syntax sync minlines=50 346 347 delcommand HiLink 348endif 349 350let b:current_syntax = "masm" 351 352let &cpo = s:cpo_save 353unlet s:cpo_save 354 355" vim: ts=8 356