    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
