└── fasm-mode.el /fasm-mode.el: -------------------------------------------------------------------------------- 1 | ;;; fasm-mode.el --- Fasm major mode 2 | 3 | ;; Author: Fanael Linithien 4 | ;; URL: https://github.com/Fanael/fasm-mode 5 | ;; Version: 0.1.11 6 | 7 | ;; This file is NOT part of GNU Emacs. 8 | 9 | ;; Copyright (c) 2013-2014, Fanael Linithien 10 | ;; All rights reserved. 11 | ;; 12 | ;; Redistribution and use in source and binary forms, with or without 13 | ;; modification, are permitted provided that the following conditions are 14 | ;; met: 15 | ;; 16 | ;; * Redistributions of source code must retain the above copyright 17 | ;; notice, this list of conditions and the following disclaimer. 18 | ;; * Redistributions in binary form must reproduce the above copyright 19 | ;; notice, this list of conditions and the following disclaimer in the 20 | ;; documentation and/or other materials provided with the distribution. 21 | ;; 22 | ;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 23 | ;; IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 24 | ;; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 25 | ;; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 26 | ;; OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 27 | ;; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 28 | ;; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 29 | ;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 30 | ;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 31 | ;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 32 | ;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 | 34 | ;;; Code: 35 | 36 | (defvar fasm-mode-syntax-table 37 | (let ((syntaxtable (make-syntax-table))) 38 | (modify-syntax-entry ?_ "_" syntaxtable) 39 | (modify-syntax-entry ?. "_" syntaxtable) 40 | (modify-syntax-entry ?$ "_" syntaxtable) 41 | (modify-syntax-entry ?@ "_" syntaxtable) 42 | (modify-syntax-entry ?~ "_" syntaxtable) 43 | (modify-syntax-entry ?? "_" syntaxtable) 44 | (modify-syntax-entry ?! "_" syntaxtable) 45 | (modify-syntax-entry ?= "." syntaxtable) 46 | (modify-syntax-entry ?+ "." syntaxtable) 47 | (modify-syntax-entry ?- "." syntaxtable) 48 | (modify-syntax-entry ?* "." syntaxtable) 49 | (modify-syntax-entry ?/ "." syntaxtable) 50 | (modify-syntax-entry ?\\ "." syntaxtable) 51 | (modify-syntax-entry ?\; "<" syntaxtable) 52 | (modify-syntax-entry ?\n ">" syntaxtable) 53 | (modify-syntax-entry ?\" "\"" syntaxtable) 54 | (modify-syntax-entry ?\' "\"" syntaxtable) 55 | syntaxtable) 56 | "Syntax table for FASM mode.") 57 | 58 | (defvar fasm-mode-map 59 | (let ((map (make-sparse-keymap))) 60 | map) 61 | "Local keymap for FASM mode.") 62 | 63 | (defvar fasm-basic-offset 2 64 | "Offset for FASM mode indentation.") 65 | 66 | (defmacro fasm--regexp-from-keywords (&rest keywords) 67 | (rx-to-string `(and symbol-start (or ,@keywords) symbol-end))) 68 | 69 | (defconst fasm-font-lock-keywords 70 | `(;; Numbers 71 | (,(rx (and symbol-start 72 | (or (and (+ (any "0" "1")) 73 | "b") 74 | (and (any "0-9") 75 | (* (any "0-9" "a-f" "A-F")) 76 | "h") 77 | (and (or "0x" "$") 78 | (+ (any "0-9" "a-f" "A-F"))) 79 | (and (+ (any "0-9")) 80 | (? (and "." 81 | (* (any "0-9")))) 82 | (? (and (any "e" "E") 83 | (? (any "+" "-")) 84 | (+ (any "0-9")))))) 85 | symbol-end)) 86 | . font-lock-constant-face) 87 | ;; Types 88 | (,(fasm--regexp-from-keywords 89 | "byte" "word" "dword" "fword" "pword" "qword" "tbyte" "tword" "dqword" 90 | "xword" "qqword" "yword" "db" "rb" "dw" "du" "rw" "dd" "rd" "df" "dp" 91 | "rf" "rp" "dq" "rq" "dt" "rt") 92 | . font-lock-type-face) 93 | ;; Directives and operators 94 | (,(fasm--regexp-from-keywords 95 | "mod" "rva" "plt" "align" "as" "at" "defined" "dup" "eq" "eqtype" "from" 96 | "ptr" "relativeto" "used" "binary" "export" "fixups" "import" "native" 97 | "static" "console" "dynamic" "efiboot" "linkinfo" "readable" "resource" 98 | "writable" "shareable" "writeable" "efiruntime" "executable" "linkremove" 99 | "discardable" "interpreter" "notpageable" "if" "end" "err" "org" "data" 100 | "else" "heap" "load" "align" "break" "entry" "extrn" "label" "stack" 101 | "store" "times" "while" "assert" "format" "public" "repeat" "display" 102 | "section" "segment" "virtual" "file") 103 | . font-lock-keyword-face) 104 | ;; Preprocessor directives 105 | (,(fasm--regexp-from-keywords 106 | "define" "include" "irp" "irps" "macro" "match" "purge" "rept" "restore" 107 | "restruc" "struc" "common" "forward" "local" "reverse" "equ" "fix") 108 | . font-lock-preprocessor-face) 109 | ;; Registers 110 | (,(fasm--regexp-from-keywords 111 | "al" "bl" "cl" "dl" "spl" "bpl" "sil" "dil" "r8b" "r9b" "r10b" "r11b" 112 | "r12b" "r13b" "r14b" "r15b" "ah" "bh" "ch" "dh" "ax" "bx" "cx" "dx" "sp" 113 | "bp" "si" "di" "r8w" "r9w" "r10w" "r11w" "r12w" "r13w" "r14w" "r15w" 114 | "eax" "ebx" "ecx" "edx" "esp" "ebp" "esi" "edi" "r8d" "r9d" "r10d" "r11d" 115 | "r12d" "r13d" "r14d" "r15d" "rax" "rbx" "rcx" "rdx" "rsp" "rbp" "rsi" 116 | "rdi" "r8" "r9" "r10" "r11" "r12" "r13" "r14" "r15" "rip" "es" "cs" "ss" 117 | "ds" "fs" "gs" "cr0" "cr2" "cr3" "cr4" "dr0" "dr1" "dr2" "dr3" "st0" 118 | "st1" "st2" "st3" "st4" "st5" "st6" "st7" "mm0" "mm1" "mm2" "mm3" "mm4" 119 | "mm5" "mm6" "mm7" "xmm0" "xmm1" "xmm2" "xmm3" "xmm4" "xmm5" "xmm6" "xmm7" 120 | "xmm8" "xmm9" "xmm10" "xmm11" "xmm12" "xmm13" "xmm14" "xmm15" "ymm0" 121 | "ymm1" "ymm2" "ymm3" "ymm4" "ymm5" "ymm6" "ymm7" "ymm8" "ymm9" "ymm10" 122 | "ymm11" "ymm12" "ymm13" "ymm14" "ymm15") 123 | . font-lock-variable-name-face) 124 | ;; Instructions 125 | (,(fasm--regexp-from-keywords 126 | "bt" "in" "ja" "jb" "jc" "je" "jg" "jl" "jo" "jp" "js" "jz" "or" "aaa" 127 | "aad" "aam" "aas" "adc" "add" "and" "bsf" "bsr" "btc" "btr" "bts" "cbw" 128 | "cdq" "clc" "cld" "cli" "cmc" "cmp" "cqo" "cwd" "daa" "das" "dec" "div" 129 | "fld" "fst" "hlt" "inc" "ins" "int" "jae" "jbe" "jge" "jle" "jmp" "jna" 130 | "jnb" "jnc" "jne" "jng" "jnl" "jno" "jnp" "jns" "jnz" "jpe" "jpo" "lar" 131 | "lds" "lea" "les" "lfs" "lgs" "lsl" "lss" "ltr" "mov" "mul" "neg" "nop" 132 | "not" "out" "pop" "por" "rcl" "rcr" "rep" "ret" "rol" "ror" "rsm" "sal" 133 | "sar" "sbb" "shl" "shr" "stc" "std" "sti" "str" "sub" "ud2" "xor" "adcx" 134 | "adox" "andn" "arpl" "blci" "blcs" "blsi" "blsr" "bzhi" "call" "cdqe" 135 | "clac" "clgi" "clts" "cmps" "cwde" "dppd" "dpps" "emms" "fabs" "fadd" 136 | "fbld" "fchs" "fcom" "fcos" "fdiv" "feni" "fild" "fist" "fld1" "fldz" 137 | "fmul" "fnop" "fsin" "fstp" "fsub" "ftst" "fxam" "fxch" "idiv" "imul" 138 | "insb" "insd" "insw" "int1" "int3" "into" "invd" "iret" "jcxz" "jnae" 139 | "jnbe" "jnge" "jnle" "lahf" "lgdt" "lidt" "lldt" "lmsw" "lock" "lods" 140 | "loop" "movd" "movq" "movs" "mulx" "orpd" "orps" "outs" "pand" "pdep" 141 | "pext" "popa" "popd" "popf" "popq" "popw" "push" "pxor" "repe" "repz" 142 | "retd" "retf" "retn" "retq" "retw" "rorx" "sahf" "salc" "sarx" "scas" 143 | "seta" "setb" "setc" "sete" "setg" "setl" "seto" "setp" "sets" "setz" 144 | "sgdt" "shld" "shlx" "shrd" "shrx" "sidt" "sldt" "smsw" "stac" "stgi" 145 | "stos" "test" "verr" "verw" "vpor" "wait" "xadd" "xchg" "xend" "xlat" 146 | "addpd" "addps" "addsd" "addss" "andpd" "andps" "bextr" "blcic" "blsic" 147 | "bound" "bswap" "cmova" "cmovb" "cmovc" "cmove" "cmovg" "cmovl" "cmovo" 148 | "cmovp" "cmovs" "cmovz" "cmppd" "cmpps" "cmpsb" "cmpsd" "cmpsq" "cmpss" 149 | "cmpsw" "cpuid" "crc32" "divpd" "divps" "divsd" "divss" "enter" "extrq" 150 | "f2xm1" "faddp" "fbstp" "fclex" "fcomi" "fcomp" "fdisi" "fdivp" "fdivr" 151 | "femms" "ffree" "fiadd" "ficom" "fidiv" "fimul" "finit" "fistp" "fisub" 152 | "fldcw" "fldpi" "fmulp" "fneni" "fprem" "fptan" "fsave" "fsqrt" "fstcw" 153 | "fstsw" "fsubp" "fsubr" "fucom" "fwait" "fyl2x" "icebp" "iretd" "iretq" 154 | "iretw" "jecxz" "jrcxz" "lddqu" "leave" "lodsb" "lodsd" "lodsq" "lodsw" 155 | "loopd" "loope" "loopq" "loopw" "loopz" "lzcnt" "maxpd" "maxps" "maxsd" 156 | "maxss" "minpd" "minps" "minsd" "minss" "movbe" "movsb" "movsd" "movsq" 157 | "movss" "movsw" "movsx" "movzx" "mulpd" "mulps" "mulsd" "mulss" "mwait" 158 | "outsb" "outsd" "outsw" "pabsb" "pabsd" "pabsw" "paddb" "paddd" "paddq" 159 | "paddw" "pandn" "pause" "pavgb" "pavgw" "pf2id" "pf2iw" "pfacc" "pfadd" 160 | "pfmax" "pfmin" "pfmul" "pfrcp" "pfsub" "pi2fd" "pi2fw" "popad" "popaw" 161 | "popfd" "popfq" "popfw" "pslld" "psllq" "psllw" "psrad" "psraw" "psrld" 162 | "psrlq" "psrlw" "psubb" "psubd" "psubq" "psubw" "ptest" "pusha" "pushd" 163 | "pushf" "pushq" "pushw" "rcpps" "rcpss" "rdmsr" "rdpmc" "rdtsc" "repne" 164 | "repnz" "retfd" "retfq" "retfw" "retnd" "retnq" "retnw" "scasb" "scasd" 165 | "scasq" "scasw" "setae" "setbe" "setge" "setle" "setna" "setnb" "setnc" 166 | "setne" "setng" "setnl" "setno" "setnp" "setns" "setnz" "setpe" "setpo" 167 | "stosb" "stosd" "stosq" "stosw" "subpd" "subps" "subsd" "subss" "tzcnt" 168 | "tzmsk" "vdppd" "vdpps" "vmovd" "vmovq" "vmrun" "vmxon" "vorpd" "vorps" 169 | "vpand" "vpxor" "wrmsr" "xlatb" "xorpd" "xorps" "xsave" "xtest" "aesdec" 170 | "aesenc" "aesimc" "andnpd" "andnps" "blcmsk" "blsmsk" "cmovae" "cmovbe" 171 | "cmovge" "cmovle" "cmovna" "cmovnb" "cmovnc" "cmovne" "cmovng" "cmovnl" 172 | "cmovno" "cmovnp" "cmovns" "cmovnz" "cmovpe" "cmovpo" "comisd" "comiss" 173 | "fcmovb" "fcmove" "fcmovu" "fcomip" "fcompp" "fdivrp" "ffreep" "ficomp" 174 | "fidivr" "fisttp" "fisubr" "fldenv" "fldl2e" "fldl2t" "fldlg2" "fldln2" 175 | "fnclex" "fndisi" "fninit" "fnsave" "fnstcw" "fnstsw" "fpatan" "fprem1" 176 | "frstor" "frstpm" "fsaved" "fsavew" "fscale" "fsetpm" "fstenv" "fsubrp" 177 | "fucomi" "fucomp" "fxsave" "getsec" "haddpd" "haddps" "hsubpd" "hsubps" 178 | "invept" "invlpg" "lfence" "llwpcb" "looped" "loopeq" "loopew" "loopne" 179 | "loopnz" "loopzd" "loopzq" "loopzw" "lwpins" "lwpval" "mfence" "movapd" 180 | "movaps" "movdqa" "movdqu" "movhpd" "movhps" "movlpd" "movlps" "movnti" 181 | "movntq" "movsxd" "movupd" "movups" "paddsb" "paddsw" "pextrb" "pextrd" 182 | "pextrq" "pextrw" "pfnacc" "pfsubr" "phaddd" "phaddw" "phsubd" "phsubw" 183 | "pinsrb" "pinsrd" "pinsrq" "pinsrw" "pmaxsb" "pmaxsd" "pmaxsw" "pmaxub" 184 | "pmaxud" "pmaxuw" "pminsb" "pminsd" "pminsw" "pminub" "pminud" "pminuw" 185 | "pmuldq" "pmulhw" "pmulld" "pmullw" "popcnt" "psadbw" "pshufb" "pshufd" 186 | "pshufw" "psignb" "psignd" "psignw" "pslldq" "psrldq" "psubsb" "psubsw" 187 | "pswapd" "pushad" "pushaw" "pushfd" "pushfq" "pushfw" "rdmsrq" "rdrand" 188 | "rdseed" "rdtscp" "setalc" "setnae" "setnbe" "setnge" "setnle" "sfence" 189 | "shufpd" "shufps" "skinit" "slwpcb" "sqrtpd" "sqrtps" "sqrtsd" "sqrtss" 190 | "swapgs" "sysret" "t1mskc" "vaddpd" "vaddps" "vaddsd" "vaddss" "vandpd" 191 | "vandps" "vcmppd" "vcmpps" "vcmpsd" "vcmpss" "vdivpd" "vdivps" "vdivsd" 192 | "vdivss" "vlddqu" "vmaxpd" "vmaxps" "vmaxsd" "vmaxss" "vmcall" "vminpd" 193 | "vminps" "vminsd" "vminss" "vmload" "vmovsd" "vmovss" "vmread" "vmsave" 194 | "vmulpd" "vmulps" "vmulsd" "vmulss" "vmxoff" "vpabsb" "vpabsd" "vpabsw" 195 | "vpaddb" "vpaddd" "vpaddq" "vpaddw" "vpandn" "vpavgb" "vpavgw" "vpcmov" 196 | "vpcomb" "vpcomd" "vpcomq" "vpcomw" "vpermd" "vpermq" "vpperm" "vprotb" 197 | "vprotd" "vprotq" "vprotw" "vpshab" "vpshad" "vpshaq" "vpshaw" "vpshlb" 198 | "vpshld" "vpshlq" "vpshlw" "vpslld" "vpsllq" "vpsllw" "vpsrad" "vpsraw" 199 | "vpsrld" "vpsrlq" "vpsrlw" "vpsubb" "vpsubd" "vpsubq" "vpsubw" "vptest" 200 | "vrcpps" "vrcpss" "vsubpd" "vsubps" "vsubsd" "vsubss" "vxorpd" "vxorps" 201 | "wbinvd" "wrmsrq" "xabort" "xbegin" "xgetbv" "xrstor" "xsetbv" "blcfill" 202 | "blendpd" "blendps" "blsfill" "clflush" "cmovnae" "cmovnbe" "cmovnge" 203 | "cmovnle" "cmpeqpd" "cmpeqps" "cmpeqsd" "cmpeqss" "cmplepd" "cmpleps" 204 | "cmplesd" "cmpless" "cmpltpd" "cmpltps" "cmpltsd" "cmpltss" "cmpxchg" 205 | "fcmovbe" "fcmovnb" "fcmovne" "fcmovnu" "fdecstp" "fincstp" "fldenvd" 206 | "fldenvw" "fnsaved" "fnsavew" "fnstenv" "frndint" "frstord" "frstorw" 207 | "fsincos" "fstenvd" "fstenvw" "fucomip" "fucompp" "fxrstor" "fxtract" 208 | "fyl2xp1" "insertq" "invlpga" "invpcid" "invvpid" "ldmxcsr" "loopned" 209 | "loopneq" "loopnew" "loopnzd" "loopnzq" "loopnzw" "monitor" "movddup" 210 | "movdq2q" "movhlps" "movlhps" "movntdq" "movntpd" "movntps" "movntsd" 211 | "movntss" "movq2dq" "mpsadbw" "paddusb" "paddusw" "palignr" "pavgusb" 212 | "pblendw" "pcmpeqb" "pcmpeqd" "pcmpeqq" "pcmpeqw" "pcmpgtb" "pcmpgtd" 213 | "pcmpgtq" "pcmpgtw" "pfcmpeq" "pfcmpge" "pfcmpgt" "pfpnacc" "pfrsqrt" 214 | "phaddsw" "phsubsw" "pmaddwd" "pmulhrw" "pmulhuw" "pmuludq" "pshufhw" 215 | "pshuflw" "psubusb" "psubusw" "roundpd" "roundps" "roundsd" "roundss" 216 | "rsqrtps" "rsqrtss" "stmxcsr" "syscall" "sysexit" "sysretq" "ucomisd" 217 | "ucomiss" "vaesdec" "vaesenc" "vaesimc" "vandnpd" "vandnps" "vcomisd" 218 | "vcomiss" "vfrczpd" "vfrczps" "vfrczsd" "vfrczss" "vhaddpd" "vhaddps" 219 | "vhsubpd" "vhsubps" "vmclear" "vmmcall" "vmovapd" "vmovaps" "vmovdqa" 220 | "vmovdqu" "vmovhpd" "vmovhps" "vmovlpd" "vmovlps" "vmovupd" "vmovups" 221 | "vmptrld" "vmptrst" "vmwrite" "vpaddsb" "vpaddsw" "vpcomub" "vpcomud" 222 | "vpcomuq" "vpcomuw" "vpermpd" "vpermps" "vpextrb" "vpextrd" "vpextrq" 223 | "vpextrw" "vphaddd" "vphaddw" "vphsubd" "vphsubw" "vpinsrb" "vpinsrd" 224 | "vpinsrq" "vpinsrw" "vpmaxsb" "vpmaxsd" "vpmaxsw" "vpmaxub" "vpmaxud" 225 | "vpmaxuw" "vpminsb" "vpminsd" "vpminsw" "vpminub" "vpminud" "vpminuw" 226 | "vpmuldq" "vpmulhw" "vpmulld" "vpmullw" "vpsadbw" "vpshufb" "vpshufd" 227 | "vpsignb" "vpsignd" "vpsignw" "vpslldq" "vpsllvd" "vpsllvq" "vpsravd" 228 | "vpsrldq" "vpsrlvd" "vpsrlvq" "vpsubsb" "vpsubsw" "vshufpd" "vshufps" 229 | "vsqrtpd" "vsqrtps" "vsqrtsd" "vsqrtss" "vtestpd" "vtestps" "xsave64" 230 | "addsubpd" "addsubps" "blendvpd" "blendvps" "cmpneqpd" "cmpneqps" 231 | "cmpneqsd" "cmpneqss" "cmpnlepd" "cmpnleps" "cmpnlesd" "cmpnless" 232 | "cmpnltpd" "cmpnltps" "cmpnltsd" "cmpnltss" "cmpordpd" "cmpordps" 233 | "cmpordsd" "cmpordss" "cvtdq2pd" "cvtdq2ps" "cvtpd2dq" "cvtpd2pi" 234 | "cvtpd2ps" "cvtpi2pd" "cvtpi2ps" "cvtps2dq" "cvtps2pd" "cvtps2pi" 235 | "cvtsd2si" "cvtsd2ss" "cvtsi2sd" "cvtsi2ss" "cvtss2sd" "cvtss2si" 236 | "fcmovnbe" "fnstenvd" "fnstenvw" "fxsave64" "insertps" "maskmovq" 237 | "movmskpd" "movmskps" "movntdqa" "movshdup" "movsldup" "packssdw" 238 | "packsswb" "packusdw" "packuswb" "pblendvb" "pfrcpit1" "pfrcpit2" 239 | "pfrsqit1" "pmovmskb" "pmovsxbd" "pmovsxbq" "pmovsxbw" "pmovsxdq" 240 | "pmovsxwd" "pmovsxwq" "pmovzxbd" "pmovzxbq" "pmovzxbw" "pmovzxdq" 241 | "pmovzxwd" "pmovzxwq" "pmulhrsw" "prefetch" "rdfsbase" "rdgsbase" 242 | "sysenter" "sysexitq" "unpckhpd" "unpckhps" "unpcklpd" "unpcklps" 243 | "vblendpd" "vblendps" "vcmpeqpd" "vcmpeqps" "vcmpeqsd" "vcmpeqss" 244 | "vcmpgepd" "vcmpgeps" "vcmpgesd" "vcmpgess" "vcmpgtpd" "vcmpgtps" 245 | "vcmpgtsd" "vcmpgtss" "vcmplepd" "vcmpleps" "vcmplesd" "vcmpless" 246 | "vcmpltpd" "vcmpltps" "vcmpltsd" "vcmpltss" "vfmaddpd" "vfmaddps" 247 | "vfmaddsd" "vfmaddss" "vfmsubpd" "vfmsubps" "vfmsubsd" "vfmsubss" 248 | "vldmxcsr" "vmlaunch" "vmovddup" "vmovhlps" "vmovlhps" "vmovntdq" 249 | "vmovntpd" "vmovntps" "vmpsadbw" "vmresume" "vpaddusb" "vpaddusw" 250 | "vpalignr" "vpblendd" "vpblendw" "vpcmpeqb" "vpcmpeqd" "vpcmpeqq" 251 | "vpcmpeqw" "vpcmpgtb" "vpcmpgtd" "vpcmpgtq" "vpcmpgtw" "vpcomeqb" 252 | "vpcomeqd" "vpcomeqq" "vpcomeqw" "vpcomgeb" "vpcomged" "vpcomgeq" 253 | "vpcomgew" "vpcomgtb" "vpcomgtd" "vpcomgtq" "vpcomgtw" "vpcomleb" 254 | "vpcomled" "vpcomleq" "vpcomlew" "vpcomltb" "vpcomltd" "vpcomltq" 255 | "vpcomltw" "vphaddbd" "vphaddbq" "vphaddbw" "vphadddq" "vphaddsw" 256 | "vphaddwd" "vphaddwq" "vphsubbw" "vphsubdq" "vphsubsw" "vphsubwd" 257 | "vpmacsdd" "vpmacswd" "vpmacsww" "vpmaddwd" "vpmulhuw" "vpmuludq" 258 | "vpshufhw" "vpshuflw" "vpsubusb" "vpsubusw" "vroundpd" "vroundps" 259 | "vroundsd" "vroundss" "vrsqrtps" "vrsqrtss" "vstmxcsr" "vucomisd" 260 | "vucomiss" "vzeroall" "wrfsbase" "wrgsbase" "xacquire" "xrelease" 261 | "xrstor64" "xsaveopt" "cmpxchg8b" "cvttpd2dq" "cvttpd2pi" "cvttps2dq" 262 | "cvttps2pi" "cvttsd2si" "cvttss2si" "extractps" "fxrstor64" "pclmulqdq" 263 | "pcmpestri" "pcmpestrm" "pcmpistri" "pcmpistrm" "pmaddubsw" "prefetchw" 264 | "punpckhbw" "punpckhdq" "punpckhwd" "punpcklbw" "punpckldq" "punpcklwd" 265 | "vaddsubpd" "vaddsubps" "vblendvpd" "vblendvps" "vcmpneqpd" "vcmpneqps" 266 | "vcmpneqsd" "vcmpneqss" "vcmpngepd" "vcmpngeps" "vcmpngesd" "vcmpngess" 267 | "vcmpngtpd" "vcmpngtps" "vcmpngtsd" "vcmpngtss" "vcmpnlepd" "vcmpnleps" 268 | "vcmpnlesd" "vcmpnless" "vcmpnltpd" "vcmpnltps" "vcmpnltsd" "vcmpnltss" 269 | "vcmpordpd" "vcmpordps" "vcmpordsd" "vcmpordss" "vcvtdq2pd" "vcvtdq2ps" 270 | "vcvtpd2dq" "vcvtpd2ps" "vcvtph2ps" "vcvtps2dq" "vcvtps2pd" "vcvtps2ph" 271 | "vcvtsd2si" "vcvtsd2ss" "vcvtsi2sd" "vcvtsi2ss" "vcvtss2sd" "vcvtss2si" 272 | "vfnmaddpd" "vfnmaddps" "vfnmaddsd" "vfnmaddss" "vfnmsubpd" "vfnmsubps" 273 | "vfnmsubsd" "vfnmsubss" "vinsertps" "vmovmskpd" "vmovmskps" "vmovntdqa" 274 | "vmovshdup" "vmovsldup" "vpackssdw" "vpacksswb" "vpackusdw" "vpackuswb" 275 | "vpblendvb" "vpcomequb" "vpcomequd" "vpcomequq" "vpcomequw" "vpcomgeub" 276 | "vpcomgeud" "vpcomgeuq" "vpcomgeuw" "vpcomgtub" "vpcomgtud" "vpcomgtuq" 277 | "vpcomgtuw" "vpcomleub" "vpcomleud" "vpcomleuq" "vpcomleuw" "vpcomltub" 278 | "vpcomltud" "vpcomltuq" "vpcomltuw" "vpcomneqb" "vpcomneqd" "vpcomneqq" 279 | "vpcomneqw" "vpermilpd" "vpermilps" "vphaddubd" "vphaddubq" "vphaddubw" 280 | "vphaddudq" "vphadduwd" "vphadduwq" "vpmacsdqh" "vpmacsdql" "vpmacssdd" 281 | "vpmacsswd" "vpmacssww" "vpmadcswd" "vpmovmskb" "vpmovsxbd" "vpmovsxbq" 282 | "vpmovsxbw" "vpmovsxdq" "vpmovsxwd" "vpmovsxwq" "vpmovzxbd" "vpmovzxbq" 283 | "vpmovzxbw" "vpmovzxdq" "vpmovzxwd" "vpmovzxwq" "vpmulhrsw" "vunpckhpd" 284 | "vunpckhps" "vunpcklpd" "vunpcklps" "aesdeclast" "aesenclast" 285 | "cmpunordpd" "cmpunordps" "cmpunordsd" "cmpunordss" "cmpxchg16b" 286 | "loadall286" "loadall386" "maskmovdqu" "phminposuw" "prefetcht0" 287 | "prefetcht1" "prefetcht2" "punpckhqdq" "punpcklqdq" "vcmptruepd" 288 | "vcmptrueps" "vcmptruesd" "vcmptruess" "vcvttpd2dq" "vcvttps2dq" 289 | "vcvttsd2si" "vcvttss2si" "vextractps" "vgatherdpd" "vgatherdps" 290 | "vgatherqpd" "vgatherqps" "vmaskmovpd" "vmaskmovps" "vpclmulqdq" 291 | "vpcmpestri" "vpcmpestrm" "vpcmpistri" "vpcmpistrm" "vpcomnequb" 292 | "vpcomnequd" "vpcomnequq" "vpcomnequw" "vpcomtrueb" "vpcomtrued" 293 | "vpcomtrueq" "vpcomtruew" "vperm2f128" "vperm2i128" "vpermil2pd" 294 | "vpermil2ps" "vpgatherdd" "vpgatherdq" "vpgatherqd" "vpgatherqq" 295 | "vpmacssdqh" "vpmacssdql" "vpmadcsswd" "vpmaddubsw" "vpmaskmovd" 296 | "vpmaskmovq" "vpunpckhbw" "vpunpckhdq" "vpunpckhwd" "vpunpcklbw" 297 | "vpunpckldq" "vpunpcklwd" "vzeroupper" "xsaveopt64" "pclmulhqhdq" 298 | "pclmullqhdq" "prefetchnta" "vaesdeclast" "vaesenclast" "vcmpeq_ospd" 299 | "vcmpeq_osps" "vcmpeq_ossd" "vcmpeq_osss" "vcmpeq_uqpd" "vcmpeq_uqps" 300 | "vcmpeq_uqsd" "vcmpeq_uqss" "vcmpeq_uspd" "vcmpeq_usps" "vcmpeq_ussd" 301 | "vcmpeq_usss" "vcmpfalsepd" "vcmpfalseps" "vcmpfalsesd" "vcmpfalsess" 302 | "vcmpge_oqpd" "vcmpge_oqps" "vcmpge_oqsd" "vcmpge_oqss" "vcmpgt_oqpd" 303 | "vcmpgt_oqps" "vcmpgt_oqsd" "vcmpgt_oqss" "vcmple_oqpd" "vcmple_oqps" 304 | "vcmple_oqsd" "vcmple_oqss" "vcmplt_oqpd" "vcmplt_oqps" "vcmplt_oqsd" 305 | "vcmplt_oqss" "vcmpord_spd" "vcmpord_sps" "vcmpord_ssd" "vcmpord_sss" 306 | "vcmpunordpd" "vcmpunordps" "vcmpunordsd" "vcmpunordss" "vfmadd132pd" 307 | "vfmadd132ps" "vfmadd132sd" "vfmadd132ss" "vfmadd213pd" "vfmadd213ps" 308 | "vfmadd213sd" "vfmadd213ss" "vfmadd231pd" "vfmadd231ps" "vfmadd231sd" 309 | "vfmadd231ss" "vfmaddsubpd" "vfmaddsubps" "vfmsub132pd" "vfmsub132ps" 310 | "vfmsub132sd" "vfmsub132ss" "vfmsub213pd" "vfmsub213ps" "vfmsub213sd" 311 | "vfmsub213ss" "vfmsub231pd" "vfmsub231ps" "vfmsub231sd" "vfmsub231ss" 312 | "vfmsubaddpd" "vfmsubaddps" "vinsertf128" "vinserti128" "vmaskmovdqu" 313 | "vpcomfalseb" "vpcomfalsed" "vpcomfalseq" "vpcomfalsew" "vpcomtrueub" 314 | "vpcomtrueud" "vpcomtrueuq" "vpcomtrueuw" "vphminposuw" "vpunpckhqdq" 315 | "vpunpcklqdq" "pclmulhqhqdq" "pclmulhqlqdq" "pclmullqhqdq" "pclmullqlqdq" 316 | "vbroadcastsd" "vbroadcastss" "vcmpneq_oqpd" "vcmpneq_oqps" 317 | "vcmpneq_oqsd" "vcmpneq_oqss" "vcmpneq_ospd" "vcmpneq_osps" 318 | "vcmpneq_ossd" "vcmpneq_osss" "vcmpneq_uspd" "vcmpneq_usps" 319 | "vcmpneq_ussd" "vcmpneq_usss" "vcmpnge_uqpd" "vcmpnge_uqps" 320 | "vcmpnge_uqsd" "vcmpnge_uqss" "vcmpngt_uqpd" "vcmpngt_uqps" 321 | "vcmpngt_uqsd" "vcmpngt_uqss" "vcmpnle_uqpd" "vcmpnle_uqps" 322 | "vcmpnle_uqsd" "vcmpnle_uqss" "vcmpnlt_uqpd" "vcmpnlt_uqps" 323 | "vcmpnlt_uqsd" "vcmpnlt_uqss" "vextractf128" "vextracti128" 324 | "vfnmadd132pd" "vfnmadd132ps" "vfnmadd132sd" "vfnmadd132ss" 325 | "vfnmadd213pd" "vfnmadd213ps" "vfnmadd213sd" "vfnmadd213ss" 326 | "vfnmadd231pd" "vfnmadd231ps" "vfnmadd231sd" "vfnmadd231ss" 327 | "vfnmsub132pd" "vfnmsub132ps" "vfnmsub132sd" "vfnmsub132ss" 328 | "vfnmsub213pd" "vfnmsub213ps" "vfnmsub213sd" "vfnmsub213ss" 329 | "vfnmsub231pd" "vfnmsub231ps" "vfnmsub231sd" "vfnmsub231ss" 330 | "vpbroadcastb" "vpbroadcastd" "vpbroadcastq" "vpbroadcastw" 331 | "vpclmulhqhdq" "vpclmullqhdq" "vpcomfalseub" "vpcomfalseud" 332 | "vpcomfalseuq" "vpcomfalseuw" "vpermilmo2pd" "vpermilmo2ps" 333 | "vpermilmz2pd" "vpermilmz2ps" "vpermiltd2pd" "vpermiltd2ps" 334 | "vcmptrue_uspd" "vcmptrue_usps" "vcmptrue_ussd" "vcmptrue_usss" 335 | "vcmpunord_spd" "vcmpunord_sps" "vcmpunord_ssd" "vcmpunord_sss" 336 | "vpclmulhqlqdq" "vpclmullqlqdq" "vbroadcastf128" "vbroadcasti128" 337 | "vcmpfalse_ospd" "vcmpfalse_osps" "vcmpfalse_ossd" "vcmpfalse_osss" 338 | "vfmaddsub132pd" "vfmaddsub132ps" "vfmaddsub213pd" "vfmaddsub213ps" 339 | "vfmaddsub231pd" "vfmaddsub231ps" "vfmsubadd132pd" "vfmsubadd132ps" 340 | "vfmsubadd213pd" "vfmsubadd213ps" "vfmsubadd231pd" "vfmsubadd231ps" 341 | "aeskeygenassist" "vaeskeygenassist") 342 | . font-lock-builtin-face) 343 | ;; Labels 344 | (,(rx (and line-start 345 | (* (any " " "\t")) 346 | (group (and (any "a-z" "A-Z" "0-9" "." "?" "!" "@") 347 | (* (or (syntax word) 348 | (syntax symbol))))) 349 | ":")) 350 | 1 font-lock-function-name-face) 351 | ;; Macro names 352 | (,(rx (and (or "macro" "struct") 353 | (+ (any " " "\t")) 354 | (group (and (any "a-z" "A-Z" "0-9" "." "?" "!" "@") 355 | (* (or (syntax word) 356 | (syntax symbol))))))) 357 | 1 font-lock-function-name-face)) 358 | "Syntax highlighting for FASM mode.") 359 | 360 | (defun fasm--get-indent-level (lineoffset) 361 | (save-excursion 362 | (forward-line (1- lineoffset)) 363 | (back-to-indentation) 364 | (current-column))) 365 | 366 | (defun fasm-indent-line () 367 | "Indent according to FASM major mode." 368 | (interactive) 369 | (let ((previndent (fasm--get-indent-level 0)) 370 | (currindent (fasm--get-indent-level 1))) 371 | (if (or (> previndent currindent) 372 | (memq this-command '(newline-and-indent evil-ret-and-indent))) 373 | (indent-to previndent) 374 | (indent-to (* fasm-basic-offset (1+ (/ currindent fasm-basic-offset))))))) 375 | 376 | ;; Emacs < 24 did not have prog-mode 377 | (defalias 'fasm-parent-mode 378 | (if (fboundp 'prog-mode) #'prog-mode #'fundamental-mode)) 379 | 380 | (defmacro fasm--set-local (variable value) 381 | `(set (make-local-variable ',variable) ,value)) 382 | 383 | ;;;###autoload 384 | (define-derived-mode fasm-mode fasm-parent-mode "Fasm" 385 | "Major mode for editing assembly in FASM format." 386 | (fasm--set-local font-lock-defaults '(fasm-font-lock-keywords nil t)) 387 | (fasm--set-local indent-line-function #'fasm-indent-line) 388 | (fasm--set-local comment-use-syntax t) 389 | (fasm--set-local comment-start ";") 390 | (fasm--set-local comment-end "") 391 | (fasm--set-local comment-start-skip ";+[ \t]*") 392 | (fasm--set-local comment-column 0)) 393 | 394 | (provide 'fasm-mode) 395 | ;;; fasm-mode.el ends here 396 | --------------------------------------------------------------------------------