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
:
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

end if

if ~ defined alpha | defined


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

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
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.x = 1
space.y = 2

space.color.r = 0
space.color.g = 0
space.color.b = 0


namespace space
x = 1
y = 2

.r = 0
.g = 0
.b = 0
end namespace



.child = 1
..other = 0

.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
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
:
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

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