This is an old revision of the document!
Table of Contents
https://sysprog.ru/post/komanda-cmp https://flatassembler.net/docs.php?article=manual http://www.club155.ru/x86cmd/MUL
FASM
Data sizes, definitions, Constants and labels
Operator | Bits | Bytes |
---|---|---|
byte | 8 | 1 |
word | 16 | 2 |
dword | 32 | 4 |
fword | 48 | 6 |
pword | 48 | 6 |
qword | 64 | 8 |
tbyte | 80 | 10 |
tword | 80 | 10 |
dqword | 128 | 16 |
xword | 128 | 16 |
qqword | 256 | 32 |
yword | 256 | 32 |
dqqword | 512 | 64 |
zword | 512 | 64 |
Definitions
Size (bytes) | Define data | Reserve data |
---|---|---|
1 | db file | rb |
2 | dw du | rw |
4 | dd | rd |
6 | dp df | rp rf |
8 | dq | rq |
10 | dt | rt |
db 1,2,3 db 'abc' dp 1234:5678 df 1234:5678 dt 70000:80000 dt 2670.0 db 5 dup (1,2) file 'data.bin':10h,4
Constants and labels
count = 17 mov cx,count - char db 224 mov bx,char mov dl,[char] mov ax,[char] - error mov ax, word [char] label wchar word at char mov ax,[wchar] .label2 (wchar.label2) @@ @r @f
—-
Registers
Type | Bits | Registers | |||||||
---|---|---|---|---|---|---|---|---|---|
General | 8 | al | cl | dl | bl | ah | ch | dh | bh |
16 | ax | cx | dx | bx | sp | bp | si | di | |
32 | eax | ecx | edx | ebx | esp | ebp | esi | edi | |
Segment | 16 | es | cs | ss | ds | fs | gs | ||
Control | 32 | cr0 | cr2 | cr3 | cr4 | ||||
Debug | 32 | dr0 | dr1 | dr2 | dr3 | dr6 | dr7 | ||
FPU | 80 | st0 | st1 | st2 | st3 | st4 | st5 | st6 | st7 |
MMX | 64 | mm0 | mm1 | mm2 | mm3 | mm4 | mm5 | mm6 | mm7 |
SSE | 128 | xmm0 | xmm1 | xmm2 | xmm3 | xmm4 | xmm5 | xmm6 | xmm7 |
AVX | 256 | ymm0 | ymm1 | ymm2 | ymm3 | ymm4 | ymm5 | ymm6 | ymm7 |
AVX-512 | 512 | zmm0 | zmm1 | zmm2 | zmm3 | zmm4 | zmm5 | zmm6 | zmm7 |
Opmask | 64 | k0 | k1 | k2 | k3 | k4 | k5 | k6 | k7 |
Bounds | 128 | bnd0 | bnd1 | bnd2 | bnd3 |
Numerical expressions
100110101b 123456701233o 0x01234567890ABCDEF 01234567890ABCDEF$ 01234567890ABCDEFh "234567" $ (current address) $$ (base address of current addressing space) % (number of current repeat in parts of code) %t (current time stamp) 1.0, 1E0 and 1f define the same floating point value
Priority | Operators |
---|---|
0 | + - |
1 | * / |
2 | mod |
3 | and or xor |
4 | shl shr |
5 | not |
6 | bsf bsr |
7 | rva plt |
Instruction set
MOV
Processor : 8086+
Flags : No
mov bx,ax ; general register to general register mov [char],al ; general register to memory mov bl,[char] ; memory to general register mov dl,32 ; immediate value to general register mov [char],32 ; immediate value to memory mov ax,ds ; segment register to general register mov [bx],ds ; segment register to memory mov ds,ax ; general register to segment register mov ds,[bx] ; memory to segment register mov eax,cr0 ; control register to general register mov cr3,ebx ; general register to control register
XCHG
Processor : 80386+
Flags : No
xchg ax,bx ; swap two general registers xchg al,[char] ; swap register with memory
PUSH
Processor : 8086+
Flags : No
push ax ; store general register push es ; store segment register pushw [bx] ; store word in memory push 1000h ; store immediate value pushd [ax] ; store double word push ax bx cx dx; pusha ; store general registers pushaw pushad
POP
Processor : 8086+
Flags : No
pop bx ; restore general register pop ds ; restore segment register popw [si] ; restore memory
CWD
Processor : 8086+
Flags : No
cwd ; convert AX to DX:AX using the sign
CDQ
Processor : 80386+
Flags : No
cdq ; convert EAX to EDX:EAX using the sign
CBW
Processor : 8086+
Flags : No
cbw ; convert AL to AX using the sign
CWDE
Processor : 80386+
Flags : No
cwde ; convert AX to EAX using the sign
MOVSX
Processor : 80386+
Flags : No
movsx ax,al ; copy byte register to word register with sign movsx edx,dl ; byte register to double word register movsx eax,ax ; word register to double word register movsx ax,byte [bx] ; byte memory to word register movsx edx,byte [bx] ; byte memory to double word register movsx eax,word [bx] ; word memory to double word register
MOVZX
Processor : 80386+
Flags : No
movsx ax,al ; copy byte register to word register without sign movsx edx,dl ; byte register to double word register movsx eax,ax ; word register to double word register movsx ax,byte [bx] ; byte memory to word register movsx edx,byte [bx] ; byte memory to double word register movsx eax,word [bx] ; word memory to double word register
ADD, SUB
Processor : 8086+
Flags : OF, SF, ZF, AF, CF, PF
add ax,bx ; add register to register sub ax,bx ; subtract register from register add ax,[si] ; add memory to register add [di],al ; add register to memory add al,48 ; add immediate value to register add [char],48 ; add immediate value to memory
ADС, SBB
Processor : 8086+
Flags : OF, SF, ZF, AF, CF, PF
adс ax,bx ; add register to register with CF sbb ax,bx ; subtract register from register with CF adс ax,[si] ; add memory to register adс [di],al ; add register to memory adс al,48 ; add immediate value to register adс [char],48 ; add immediate value to memory
INС, DEC
Processor : 8086+
Flags : OF, SF, ZF, AF, PF
inc ax ; increment register by one dec ax ; decrement register by one inc byte [bx] ; increment memory by one
CMP
Processor : 8086+
Flags : OF, SF, ZF, AF, CF, PF
cmp ax,bx ; compare register to register (like a SUB)
NEG
Processor : 8086+
Flags : OF, SF, ZF, AF, PF, CF
neg ax ; ax = 0 - ax
XADD
Processor : 80486+
Flags : OF, SF, ZF, AF, PF, CF
xadd eax, ebx ; ebx = eax & eax = eax + ebx
MUL
Processor : 8086+
Flags : OF, CF
MUL r/m8 ; AX = AL * r/m8 (8086+) MUL r/m16 ; DX:AX = AX * r/m16 (8086+) MUL r/m32 ; EDX:EAX = EAX * r/m32 (80386+)
IMUL
Processor : 8086+, 80386+
Flags : OF, CF
IMUL r/m8 ; AX=AL*r/m8 (8086+) IMUL r/m16 ; DX:AX=AX*r/m16 (8086+) IMUL r/m32 ; EDX:EAX=EAX*r/m32 (80386+) IMUL r16,r/m16 ; r16=r16*r/m16 (80386+) IMUL r32,r/m32 ; r32=r32*r/m32 (80386+) IMUL r16,r/m16,imm8 ; r16=r/m16*(знакорасширенное imm8) (80186+) IMUL r32,r/m32,imm8 ; r32=r/m32*(знакорасширенное imm8) (80386+) IMUL r16,imm8 ; r16=r16*(знакорасширенное imm8) (80186+) IMUL r32,imm8 ; r32=r32*(знакорасширенное imm8) (80386+) IMUL r16,r/m16,imm16 ; r16=r/m16*(знакорасширенное imm16) (80186+) IMUL r32,r/m32,imm16 ; r32=r/m32*(знакорасширенное imm16) (80386+) IMUL r16,imm16 ; r16=r16*imm16 (80186+) IMUL r32,imm32 ; r32=r32*imm32 (80386+)
DIV
Processor : 8086+
Flags : no
DIV AL,r/m8 ; Беззнаковое деление AX на r/m8, частное помещается в AL, остаток от деления - в AH ; (8086+) DIV AX,r/m16 ; Беззнаковое деление DX:AX на r/m16, частное помещается в AX, остаток от деления - в DX ; (8086+) DIV EAX,r/m32 ; Беззнаковое деление EDX:EAX на r/m32, частное помещается в EAX, ; остаток от деления - в EDX (80386+)
IDIV
Processor : 8086+
Flags : no
IDIV AL,r/m8 ; Знаковое деление AX на r/m8, частное помещается в AL, остаток от деления - в AH ; (8086+) IDIV AX,r/m16 ; Знаковое деление DX:AX на r/m16, частное помещается в AX, остаток от деления - в DX ; (8086+) IDIV EAX,r/m32 ; Знаковое деление EDX:EAX на r/m32, частное помещается в EAX, ; остаток от деления - в EDX (80386+)
DAA
Processor : 8086+
Flags : SF, ZF, AF, PF, CF
DAA ; Десятичная коррекция AL после сложения
DAS
Processor : 8086+
Flags : SF, ZF, AF, PF, CF
DAS ; Десятичная коррекция AL после вычитания
AAA
Processor : 8086+
Flags : AF, CF
AAA ; ASCII коррекция AL после сложения
AAS
Processor : 8086+
Flags : AF, CF
AAS ; ASCII коррекция AL после вычитания
AAM
Processor : 8086+
Flags : SF, ZF, PF
AAM ; ASCII коррекция AX после умножения AAM imm8 ; ASCII коррекция AX после умножения по числу, базирующемуся на imm8
AAD
Processor : 8086+
Flags : SF, ZF, PF
AAD ; ASCII коррекция AX перед делением AAD imm8 ; ASCII коррекция AX перед делением по числу, базирующемуся на imm8
NOT
Processor : 8086+
Flags : no
NOT r/m8 ; r/m8 = NOT r/m8 (8086+) NOT r/m16 ; r/m16 = NOT r/m16 (8086+) NOT r/m32 ; r/m32 = NOT r/m32 (80386+)
AND
Processor : 8086+
Flags : OF, SF, ZF, PF, CF
20 /r AND r/m8,r8 ; r/m8 AND r8 (8086+) 21 /r AND r/m16,r16 ; r/m16 AND r16 (8086+) 21 /r AND r/m32,r32 ; r/m32 AND r32 (80386+) 22 /r AND r8,r/m8 ; r8 AND r/m8 (8086+) 23 /r AND r16,r/m16 ; r16 AND r/m16 (8086+) 23 /r AND r32,r/m32 ; r32 AND r/m32 (80386+) 24 ib AND AL,imm8 ; АL AND imm8 (8086+) 25 iw AND AX,imm16 ; AX AND imm16 (8086+) 25 id AND EAX,imm32 ; EAX AND imm32 (80386+) 80 /4 ib AND r/m8,imm8 ; r/m8 AND imm8 (8086+) 81 /4 iw AND r/m16,imm16 ; r/m16 AND imm16 (8086+) 81 /4 id AND r/m32,imm32 ; r/m32 AND imm32 (80386+) 83 /4 ib AND r/m16,imm8 ; r/m16 AND imm8 (знакорасшир.) (8086+) 83 /4 ib AND r/m32,imm8 ; r/m32 AND imm8 (знакорасшир.) (80386+)
OR
Processor : 8086+
Flags : OF, SF, ZF, PF, CF
0C ib OR AL,imm8 ; AL = AL OR imm8 (8086+) 0D iw OR AX,imm16 ; AX = AX OR imm16 (8086+) 0D id OR EAX,imm32 ; EAX = EAX OR imm32 (80386+) 80 /1 ib OR r/m8,imm8 ; r/m8 = r/m8 OR imm8 (8086+) 81 /1 iw OR r/m16,imm16 ; r/m16 = r/m16 OR imm16 (8086+) 81 /1 id OR r/m32,imm32 ; r/m32 = r/m32 OR imm32 (80386+) 83 /1 ib OR r/m16,imm8 ; r/m16 = r/m16 OR (Знакорасширенное imm8) (8086+) 83 /1 ib OR r/m32,imm8 ; r/m32 = r/m32 OR (Знакорасширенное imm8) (80386+) 08 /r OR r/m8,r8 ; r/m8 = r/m8 OR r8 (8086+) 09 /r OR r/m16,r16 ; r/m16 = r/m16 OR r16 (8086+) 09 /r OR r/m32,r32 ; r/m32 = r/m32 OR r32 (80386+) 0A /r OR r8,r/m8 ; r8 = r8 OR r/m8 (8086+) 0B /r OR r16,r/m16 ; r16 = r16 OR r/m16 (8086+) 0B /r OR r32,r/m32 ; r32 = r32 OR r/m32 (80386+)
XOR
Processor : 8086+
Flags : OF, SF, ZF, PF, CF
34 ib XOR AL,imm8 ; AL = AL XOR imm8 (8086+) 35 iw XOR AX,imm16 ; AX = AX XOR imm16 (8086+) 35 id XOR EAX,imm32 ; EAX = EAX XOR imm32 (80386+) 80 /6 ib XOR r/m8,imm8 ; r/m8 = r/m8 XOR imm8 (8086+) 81 /6 iw XOR r/m16,imm16 ; r/m16 = r/m16 XOR imm16 (8086+) 81 /6 id XOR r/m32,imm32 ; r/m32 = r/m32 XOR imm32 (80386+) 83 /6 ib XOR r/m16,imm8 ; r/m16 = r/m16 XOR (Знакорасширенное imm8) (8086+) 83 /6 ib XOR r/m32,imm8 ; r/m32 = r/m32 XOR (Знакорасширенное imm8) (80386+) 30 /r XOR r/m8,r8 ; r/m8 = r/m8 XOR r8 (8086+) 31 /r XOR r/m16,r16 ; r/m16 = r/m16 XOR r16 (8086+) 31 /r XOR r/m32,r32 ; r/m32 = r/m32 XOR r32 (80386+) 32 /r XOR r8,r/m8 ; r8 = r8 XOR r/m8 (8086+) 33 /r XOR r16,r/m16 ; r16 = r16 XOR r/m16 (8086+) 33 /r XOR r32,r/m32 ; r32 = r32 XOR r/m32 (80386+)
BT
Processor : 80386+
Flags : CF
0F A3 BT r/m16,r16 ; Сохранить выбираемый r16 бит r/m16 в CF 0F A3 BT r/m32,r32 ; Сохранить выбираемый r32 бит r/m32 в CF 0F BA /4 ib BT r/m16,imm8 ; Сохранить выбираемый imm8 бит r/m16 в CF 0F BA /4 ib BT r/m32,imm8 ; Сохранить выбираемый imm8 бит r/m32 в CF
BTS
Processor : 80386+
Flags : CF
0F A3 BT r/m16,r16 ; Сохранить выбираемый r16 бит r/m16 в CF 0F AB BTS r/m16,r16 ; Выбрать по r16 бит из r/m16 в CF установить этот бит 0F AB BTS r/m32,r32 ; Выбрать по r32 бит из r/m32 в CF установить этот бит 0F BA /5 ib BTS r/m16,imm8 ; Выбрать по imm8 бит из r/m16 в CF установить этот бит 0F BA /5 ib BTS r/m32,imm8 ; Выбрать по imm8 бит из r/m32 в CF установить этот бит
BTR
Processor : 80386+
Flags : CF
0F B3 BTR r/m16,r16 ; Выбрать по r16 бит из r/m16 в CF сбросить этот бит 0F B3 BTR r/m32,r32 ; Выбрать по r32 бит из r/m32 в CF сбросить этот бит 0F BA /6 ib BTR r/m16,imm8 ; Выбрать по imm8 бит из r/m16 в CF сбросить этот бит 0F BA /6 ib BTR r/m32,imm8 ; Выбрать по imm8 бит из r/m32 в CF сбросить этот бит
BTC
Processor : 80386+
Flags : CF
0F BB BTC r/m16,r16 ; Выбрать по r16 бит из r/m16 в CF инвертировать этот бит 0F BB BTC r/m32,r32 ; Выбрать по r32 бит из r/m32 в CF инвертировать этот бит 0F BA /7 ib BTC r/m16,imm8 ; Выбрать по imm8 бит из r/m16 в CF инвертировать этот бит 0F BA /7 ib BTC r/m32,imm8 ; Выбрать по imm8 бит из r/m32 в CF инвертировать этот бит
BSF
Processor : 80386+
Flags : ZF
0F BC BSF r16,r/m16 ; Сканирование битов r/m16 вперед 0F BC BSF r32,r/m32 ; Сканирование битов r/m32 вперед
BSR
Processor : 80386+
Flags : ZF
0F BD BSR r16,r/m16 ; Сканирование битов r/m16 назад 0F BD BSR r32,r/m32 ; Сканирование битов r/m32 назад
SHL, SHR, SAL, SAR
Processor : 8086+
Flags : SF, ZF, PF, CF
D0 /4 SAL r/m8,1 ; Арифметический сдвиг r/m8 влево (r/m8 = r/m8 * 2) (8086+) D2 /4 SAL r/m8,CL ; Арифметический сдвиг r/m8 влево (r/m8 = r/m8 * 2^CL) (8086+) C0 /4 ib SAL r/m8,imm8 ; Арифметический сдвиг r/m8 влево (r/m8 = r/m8 * 2^imm8) (8086+) D1 /4 SAL r/m16,1 ; Арифметический сдвиг r/m16 влево (r/m16 = r/m16 * 2) (8086+) D3 /4 SAL r/m16,CL ; Арифметический сдвиг r/m16 влево (r/m16 = r/m16 * 2^CL) (8086+) C1 /4 ib SAL r/m16,imm8 ; Арифметический сдвиг r/m16 влево (r/m16 = r/m16 * 2^imm8) (8086+) D1 /4 SAL r/m32,1 ; Арифметический сдвиг r/m32 влево (r/m32 = r/m32 * 2) (80386+) D3 /4 SAL r/m32,CL ; Арифметический сдвиг r/m32 влево (r/m32 = r/m32 * 2^CL) (80386+) C1 /4 ib SAL r/m32,imm8 ; Арифметический сдвиг r/m32 влево (r/m32 = r/m32 * 2^imm8) (80386+) D0 /7 SAR r/m8,1 ; Арифметический сдвиг r/m8 вправо (r/m8 = sign(r/m8) * r/m8 / 2) (8086+) D2 /7 SAR r/m8,CL ; Арифметический сдвиг r/m8 вправо (r/m8 = sign(r/m8) * r/m8 / 2^CL) (8086+) C0 /7 ib SAR r/m8,imm8 ; Арифметический сдвиг r/m8 вправо (r/m8 = sign(r/m8) * r/m8 / 2^imm8) (8086+) D1 /7 SAR r/m16,1 ; Арифметический сдвиг r/m16 вправо (r/m16 = sign(r/m16) * r/m16 / 2) (8086+) D3 /7 SAR r/m16,CL ; Арифметический сдвиг r/m16 вправо (r/m16 = sign(r/m16) * r/m16 / 2^CL) C1 /7 ib SAR r/m16,imm8 ; Арифметический сдвиг r/m16 вправо (r/m16 = sign(r/m16) * r/m16 / 2^imm8) (8086+) D1 /7 SAR r/m32,1 ; Арифметический сдвиг r/m32 вправо (r/m32 = sign(r/m32) * r/m32 / 2) (80386+) D3 /7 SAR r/m32,CL ; Арифметический сдвиг r/m32 вправо (r/m32 = sign(r/m32) * r/m32 / 2^CL) (80386+) C1 /7 ib SAR r/m32,imm8 ; Арифметический сдвиг r/m32 вправо (r/m32 = sign(r/m32) * r/m32 / 2^imm8) (80386+) D0 /4 SHL r/m8,1 ; Логический сдвиг r/m8 влево (r/m8 = r/m8 * 2) D2 /4 SHL r/m8,CL ; Логический сдвиг r/m8 влево (r/m8 = r/m8 * 2^CL) (8086+) C0 /4 ib SHL r/m8,imm8 ; Логический сдвиг r/m8 влево (r/m8 = r/m8 * 2^imm8) (8086+) D1 /4 SHL r/m16,1 ; Логический сдвиг r/m16 влево (r/m16 = r/m16 * 2) (8086+) D3 /4 SHL r/m16,CL ; Логический сдвиг r/m16 влево (r/m16 = r/m16 * 2^CL) (8086+) C1 /4 ib SHL r/m16,imm8 ; Логический сдвиг r/m16 влево (r/m16 = r/m16 * 2^imm8) (8086+) D1 /4 SHL r/m32,1 ; Логический сдвиг r/m32 влево (r/m32 = r/m32 * 2) (80386+) D3 /4 SHL r/m32,CL ; Логический сдвиг r/m32 влево (r/m32 = r/m32 * 2^CL) (80386+) C1 /4 ib SHL r/m32,imm8 ; Логический сдвиг r/m32 влево (r/m32 = r/m32 * 2^imm8) (80386+) D0 /5 SHR r/m8,1 ; Логический сдвиг r/m8 вправо (r/m8 = |r/m8| / 2) (8086+) D2 /5 SHR r/m8,CL ; Логический сдвиг r/m8 вправо (r/m8 = |r/m8| / 2^CL) C0 /5 ib SHR r/m8,imm8 ; Логический сдвиг r/m8 вправо (r/m8 = |r/m8| / 2^imm8) (8086+) D1 /5 SHR r/m16,1 ; Логический сдвиг r/m16 вправо (r/m16 = |r/m16| / 2) (8086+) D3 /5 SHR r/m16,CL ; Логический сдвиг r/m16 вправо (r/m16 = |r/m16| / 2^CL) (8086+) C1 /5 ib SHR r/m16,imm8 ; Логический сдвиг r/m16 вправо (r/m16 = |r/m16| / 2^imm8) (8086+) D1 /5 SHR r/m32,1 ; Логический сдвиг r/m32 вправо (r/m32 = |r/m32| / 2)(80386+) D3 /5 SHR r/m32,CL ; Логический сдвиг r/m32 вправо (r/m32 = |r/m32| / 2^CL) (80386+) C1 /5 ib SHR r/m32,imm8 ; Логический сдвиг r/m32 вправо (r/m32 = |r/m32| / 2^imm8) (80386+)