Obsah

Procesor 8086

Proč se zajímat o tak starej procesor? Protože kvůli zpětný kompatibilitě se všechny procesory spouštěj v reálnym režimu, kerej je kompatibilní právě s tímhle procesorem.
Procesor dokáže provádět programy ve strojovym kódu. Jenomže ve strojovym kódu se programuje špatně. Proto byly vyvinutý programovací jazyky, kerý se daj převejst do strojovýho kódu. První programovací jazyk byl Assembler (assembly language), kerej se dá převejst do strojovýho kódu a zpátky. Instrukce na týhle stránce jsou v Assembleru.

16bitový registry

ax - accumulator
cx - counter
dx - data
bx - base
sp - stack pointer
bp - base pointer
si - source index
di - destination index

16bitový segmentový registry

es - extra segment
cs - code segment
ss - stack segment
ds - data segment

16bitový speciální registry

ip - instruction pointer
flags
Bit012345 6789101112 131415
Významcf - carry pf - parity  af - auxiliary zf - zero sf - signtf - traceif - interrupt df - decrementof - overflow     

8bitový registry

al - bity 0-7 registru ax
cl - bity 0-7 registru cx
dl - bity 0-7 registru dx
bl - bity 0-7 registru bx
ah - bity 8-15 registru ax
ch - bity 8-15 registru cx
dh - bity 8-15 registru dx
bh - bity 8-15 registru bx

Adresace paměti

Adresa se skládá ze segmentu a offsetu. Zapisuje se segment:offset.
Lineární adresa = fyzická adresa = segment * 16 + offset.

Adresa právě prováděný instrukce je cs:ip.
Adresa posledního záznamu v zásobníku je ss:sp.

Instrukce

mov

mov ax, 6 ; Do registru ax se uloží hodnota 6
mov ax, cx ; Do registru ax se uloží hodnota registru cx
mov byte ptr [0x100], 6 ; Na adresu ds:256 se uloží hodnota 6
mov word ptr [0x100], 6 ; Na adresu ds:256 se uloží hodnota 6 jako 2 bajty
mov ax, [0x100] ; Do registru ax se uloží hodnota na adrese ds:256 (2 bajty)
mov [0x100], ax ; Na adresu ds:256 se uloží hodnota registru ax (2 bajty)
mov es:[bx+0x100], ax ; Na adresu es:bx+256 se uloží hodnota registru ax (2 bajty)

mov [si+bx+0x100], ax ; Pokud není uvedeno jinak, bere se segment ds
mov [di+bx+0x100], ax
mov [si+bp+0x100], ax
mov [di+bp+0x100], ax
mov [si+0x100], ax
mov [di+0x100], ax
mov [bp+0x100], ax
mov [bx+0x100], ax
mov es:[bx+0x100], ax ; Jako segment se bere es

xchg

xchg A, B ; prohodí hodnoty A a B

cmp

cmp A, B ; Porovná hodnoty A a B (A-B)

jz/je Ljump if zero/equalif A == B then goto L
jnz/jne Ljump if not zero/not equalif A != B then goto L
jc/jb Ljump if carry/belowif unsigned A < B then goto L
jnc/jnb/jae Ljump if not carry/not below/above or equalif unsigned A >= B then goto L
ja Ljump if aboveif unsigned A > B then goto L
jna/jbe Ljump if above/below or equalif unsigned A <= B then goto L
jl Ljump if lessif integer A < B then goto L
jnl/jge Ljump if not less/greater or equalif integer A >= B then goto L
jg Ljump if greaterif integer A > B then goto L
jng/jle Ljump if not greater/less or equalif integer A <= B then goto L
js Ljump if sign
jns Ljump if not sign
jp/jpe Ljump if parity even
jnp/jpo Ljump if not parity/parity odd
jo Ljump if overflow
jno Ljump if not overflow

push, pop

push A ; sp=sp-2; ss:[sp]=A
pop A ; A=ss:[sp]; sp=sp+2
pushf ; push flags
popf ; pop flags

set, clear

clc ; clear cf (nuluj cf)
stc ; set cf (nastav cf)
cli ; clear if
sti ; set if
cld ; clear decrement (pro instrukce movsb a podobně)
std ; set decrement

jmp, call, ret, int, iret

jmp L ; Skočí na L
jmp A:B ; Skočí na adresu A:B
jmp [bx+0x100] ; Skočí na hodnotu uloženou na adrese ds:bx+256

call L ; Volá funkci L
call [bx+0x100] ; Volá funkci, jejíž adresa je uložená na adrese ds:bx+256 (2 bajty)
ret ; Návrat z funkce

call A:B ; Volání vzdálený funkce (v jinym segmentu)
call dword ptr [bx+0x100] ; Volá funkci, jejíž adresa je uložená na adrese ds:bx+256 (4 bajty)
retf ; Návrat ze vzdálený funkce

int N ; Volá přerušení číslo N
iret ; Návrat z přerušení

Porty

in al, 60h ; Do registru al se uloží hodnota portu 60h. Pouze pro porty 0-255
in al, dx
in ax, dx ; Do ax se uložej 2 bajty z portu dx
out 20h, al
out dx, al
out dx, ax

Aritmeticko-logický instrukce

inc AA=A+1
dec AA=A-1
add A, BA=A+B
adc A, BA=A+B+cf (add with carry)
sub A, BA=A-B
sbb A, BA=A-B-cf (subtraction with borrow)
and A, BA=A and B
or A, BA=A or B
xor A, BA=A xor B
test A, BA and B - pouze nastaví flags
not AA=~A
neg AA=-A
mul Bunsigned dx:ax = ax * B
imul Binteger dx:ax = ax * B
div Bunsigned ax = dx:ax / B; dx = dx:ax % B
idiv Binteger ax = dx:ax / B; dx = dx:ax % B

Bitový posuny

rol A, clrotate left...
ror A, clrotate right...
rcl A, clrotate left through carry...
rcr A, clrotate right through carry...
shl A, clshift left...
shr A, clshift right...
sal A, clshift arithmetic left...
sar A, clshift arithmetic right...

Řetězcový operace

movsb ; [es:di] = [ds:si]; di++; si++; Pokud je zapnutej decrement: di--, si--
movsw ; word[es:di] = word[ds:si]; di+=2, si+=2
cmpsb ; cmp [ds:si], [es:di]; di++; si++
cmpsw
scasb ; cmp al, [es:di]
scasw
lodsb ; al = [ds:si]; si++
lodsw
stosb ; [es:di] = al; di++
stosw

Lze je kombinovat s prefixem rep/repz/repnz:
rep movsb ; provede operaci movsb tolikrát, kolik je hodnota cx
repz cmpsb ; provádí, pokud se hodnoty rovnají, maximálně cx-krát
repnz cmpsb

Instrukce koprocesoru

Koprocesor obsahuje 8 80-bitovejch registrů značenejch st0..st7

fld A/st(i)
fst A
fstp A
fldenv A
fldcw A
fnstenv A
fnstcw A
fxch st(i)

fadd A/st(i)
fmul A/st(i)
fcom A/st(i)
fcomp A/st(i)
fsub A/st(i)
fsubr A/st(i)
fdiv A/st(i)
fdivr A/st(i)

fiadd A
fimul A
ficom A
ficomp A
fisub A
fisubr A
fidiv A
fidivr A

fnop
fchs
fabs
ftst
fxam
fld1
fldl2t
fldl2e
fldpi
fldlg2
fldln2
fldz
f2xml
fyl2x
fptan
fpatan
fxtract
fprem1
fdecstp
fincstp
fprem
fyl2xp1
fsqrt
fsincos
frndint
fscale
fsin
fcos

Kompletní seznam instrukcí viz dokument "Instruction Set Reference".