highlight.asm-fasm

        jmp near dword [0]
        jmp far dword [0]

        mov bx,ax       ; general register to general register
        mov [char],al   ; general register to memory
        mov dl,32       ; immediate value to general register
        mov cr3,ebx     ; general register to control register

        xchg ax,bx      ; swap two general registers
        xchg al,[char]  ; swap register with memory

        push ax         ; store general register
        push es         ; store segment register
        pushw [bx]      ; store memory
        push 1000h      ; store immediate value

        imul ax,[si],10 ; memory by immediate value to register

        bt  ax,15        ; test bit in register
        bts word [bx],15 ; test and set bit in memory

        bswap edx        ; swap bytes in register

        jmp 100h         ; direct near jump
        jmp 0FFFFh:0     ; direct far jump
        jmp ax           ; indirect near jump
        jmp pword [ebx]  ; indirect far jump

        movs byte [di],[si]        ; transfer byte
        movs word [es:di],[ss:si]  ; transfer word
        movsd                      ; transfer double word

        cmpxchg8b [bx]   ; compare and exchange 8 bytes

        movq2dq xmm0,mm1   ; move from MMX register to SSE register
        movdq2q mm0,xmm1   ; move from SSE register to MMX register

        enter 2048,0     ; enter and allocate 2048 bytes on stack

        mov [rip+3],sil    ; manual RIP-relative addressing

        blendvps xmm3,xmm7,xmm0 ; blend according to mask
        vgatherqps xmm0,[xmm2],xmm3        ; gather two floats
        vgatherqps xmm0,[ymm2+64],xmm3     ; gather four floats
        vfmsub231ps ymm1,ymm2,ymm3     ; multiply and subtract
        vfnmadd132sd xmm0,xmm5,[ebx]   ; multiply, negate and add
        vpermil2ps ymm0,ymm3,ymm7,ymm2,0  ; permute from two sources

        vscatterdps [eax+xmm1]{k1},xmm0    ; scatter four floats
        vscatterdpd [ymm3*8]{k3},zmm0      ; scatter eight doubles

        dd sum
        x = 1
        x = x+2
        sum = x

        if count>0
            mov cx,count
            rep movsb
        end if

        if count & ~ count mod 4
            mov cx,count/4
            rep movsd
        else if count>4
            mov cx,count/4
            rep movsd
            mov cx,count mod 4
            rep movsb
        else
            mov cx,count
            rep movsb
        end if

        repeat 8
            mov byte [bx],%
            inc bx
        end repeat

        s = x/2
        repeat 100
            if x/s = s
                break
            end if
            s = (s+x/s)/2
        end repeat

        repeat $-$$
            load a byte from $$+%-1
            store byte a xor c at $$+%-1
        end repeat

        GDTR dp ?
        virtual at GDTR
            GDT_limit dw ?
            GDT_address dd ?
        end virtual

        virtual at 0
            file 'a.txt':10h,1
            load char from 0
        end virtual

        virtual at 0 as 'asc'
            times 256 db %-1
        end virtual

        virtual at 0
            hex_digits::
            db '0123456789ABCDEF'
        end virtual
        load a byte from hex_digits:10

        bits = 16
        display 'Current offset is 0x'
        repeat bits/4
            d = '0' + $ shr (bits-%*4) and 0Fh
            if d > '9'
                d = d + 'A'-'9'-1
            end if
            display d
        end repeat
        display 13,10

        if ~ defined alpha
            alpha:
        end if

        if ~ defined alpha | defined @f
            alpha:
            @@:
        end if

        include 'macros.inc'

        d equ dword
        NULL equ d 0
        d equ edx

        d equ d,eax

        b equ byte
        w equ word
        d equ dword
        p equ pword
        f equ fword
        q equ qword
        t equ tword
        x equ dqword
        y equ qqword

        incl fix include

        macro tst {test al,0xFF}

        macro stos0
         {
            xor al,al
            stosb
         }

        macro align value { rb (value-1)-($+value-1) mod value }

        macro mov op1,op2
         {
          if op1 in <ds,es,fs,gs,ss> & op2 in <cs,ds,es,fs,gs,ss>
            push  op2
            pop   op1
          else
            mov   op1,op2
          end if
         }

        macro stoschar [char]
         {
            mov al,char
            stosb
         }

        macro movstr
         {
            local move
          move:
            lodsb
            stosb
            test al,al
            jnz move
         }

        macro strtbl name,[string]
         {
          common
            label name dword
          forward
            local label
            dd label
          forward
            label db string,0
         }

        push 3
        push 2
        push 1
        call foo

        macro invoke proc,[arg]
         { common stdcall [proc],arg }

        macro jif op1,cond,op2,label
         {
            cmp op1,op2
            j#cond label
         }

        macro label name
         {
            label name
            if ~ used name
              display `name # " is defined but not used.",13,10
            end if
         }

        macro message arg
         {
          if arg eqtype ""
            local str
            jmp   @f
            str   db arg,0Dh,0Ah,24h
            @@:
            mov   dx,str
          else
            mov   dx,arg
          end if
            mov   ah,9
            int   21h
         }

        macro ext instr
         {
          macro instr op1,op2,op3
           \{
            if op3 eq
              instr op1,op2
            else
              instr op1,op2
              instr op2,op3
            end if
           \}
         }

        ext add
        ext sub

        macro tmacro [params]
         {
          common macro params {
         }
        MACRO fix tmacro
        ENDM fix }

        MACRO stoschar char
            mov al,char
            stosb
        ENDM

        postpone
         {
          code_size = $
         }

        struc point x,y
         {
            .x dw x
            .y dw y
         }

        struc db [data]
         {
           common
            . db data
            .size = $ - .
         }

        rept 5 { in al,dx }

        rept 3 counter
         {
            byte#counter db counter
         }

        match +,+ { include 'first.inc' }
        match +,- { include 'second.inc' }
        match a b, 1+2+3 { db a }

        V fix {
          macro empty
           V
        V fix }
           V

        list equ

        macro append item
         {
           match any, list \{ list equ list,item \}
           match , list \{ list equ item \}
         }

        define a b+4
        define b 3
        rept 1 result:a*b+2 { define c result }

        rept 8 n:0 { pxor xmm#n,xmm#n }

       irps reg, al bx ecx
        { xor reg,reg }

        if 0
        a = 1
        b equ 2
        end if
        dd b

        extrn exit
        extrn '__imp__MessageBoxA@16' as MessageBox:dword

        extrn 'printf' as _printf
        printf = PLT _printf

        tester? = 0

            space:
            space.x = 1
            space.y = 2
            space.color:
            space.color.r = 0
            space.color.g = 0
            space.color.b = 0

            space:
            namespace space
                    x = 1
                    y = 2
                    color:
                    .r = 0
                    .g = 0
                    .b = 0
            end namespace

            first:
                    .child = 1
                    ..other = 0
            second:
                    .child = 2
                    ..another = ..other

            label character:byte
            label char:1

            byte? = 1       ; 8 bits
            word? = 2       ; 16 bits
            dword? = 4      ; 32 bits
            fword? = 6      ; 48 bits
            pword? = 6      ; 48 bits
            qword? = 8      ; 64 bits
            tbyte? = 10     ; 80 bits
            tword? = 10     ; 80 bits
            dqword? = 16    ; 128 bits
            xword? = 16     ; 128 bits
            qqword? = 32    ; 256 bits
            yword? = 32     ; 256 bits
            dqqword? = 64   ; 512 bits
            zword? = 64     ; 512 bits

            element A
            linpoly = A + A + 3
            vterm = linpoly scale 1 * linpoly element 1     ; vterm = 2 * A

            db 4 dup 90h            ; generate 4 bytes
            db 2 dup ('abc',10)     ; generate 8 bytes

            macro measured name,string
                    local top
                    name db string
                    top: name.length = top - name
            end macro

            measured hello, 'Hello!'        ; hello.length = 6

            A equ 1
            A equ 2

            drop A
            drop A

            data1 dw 1
            buffer1 rb 10h          ; zeroed and present in the output

            org 400h
            data dw 2
            buffer2 rb 20h          ; not in the output

            section 1000h
            data3 dw 3
            buffer3 rb 30h          ; not in the output

            virtual at 0
                    hex_digits::
                    db '0123456789ABCDEF'
            end virtual
            load a:byte from hex_digits:10  ; a = 'A'

            db "Text"
            key = 7Bh
            repeat $-$$
                    load a : byte from $$+%-1
                    store a xor key : byte at $$+%-1
            end repeat

            load char : byte from const:0

            if $>10000h
                    err 'segment too large'
            end if
            calminstruction please? cmd&
                    match =do? =not? cmd, cmd
                    jyes done
                    assemble cmd
                done:
            end calminstruction

            please do not display 'Bye!'

            macro jmpi target
                    if target-($+2) < 80h & target-($+2) >= -80h
                            db 0EBh
                            db target-($+1)
                    else
                            db 0E9h
                            dw target-($+2)
                    end if
            end macro

            macro EX? first,second
                    match (=SP?), first
                            match =HL?, second
                                    db 0E3h
                            else match =IX?, second
                                    db 0DDh,0E3h
                            else match =IY?, second
                                    db 0FDh,0E3h
                            else
                                    err "incorrect second argument"
                            end match
                    else match =AF?, first
                            match =AF'?, second
                                    db 08h
                            else
                                    err "incorrect second argument"
                            end match
                    else match =DE?, first
                            match =HL?, second
                                    db 0EBh
                            else
                                    err "incorrect second argument"
                            end match
                    else
                            err "incorrect first argument"
                    end match
            end macro

            EX (SP),HL

            macro INC? argument
                    match [:r:], argument
                            db 100b + r shl 3
                    else match (=HL?), argument
                            db 34h
                    else match (=IX?+d), argument
                            db 0DDh,34h,d
                    else match (=IY?+d), argument
                            db 0FDh,34h,d
                    else
                            err "incorrect argument"
                    end match
            end macro

            INC (IX+2)

            element IY?

            element L? : register + 101b

            macro CALL? arguments&
                    local cc,nn
                    match condition =, target, arguments
                            cc = condition - CC
                            nn = target
                            db 0C4h + cc shl 3
                    else
                            nn = arguments
                            db 0CDh
                    end match
                    dw nn
            end macro