You are on page 1of 15

Instrukční soubor 8086 1

1 Popis instrukčního souboru mikroprocesoru 8086


Mikroprocesor 8086 má instrukční soubor s celkovým počtem 104 jedinečných
instrukcí. Instrukce lze rozdělit do 5 skupin:
• Instrukce přenosu dat (15) – přenos dat může probíhat mezi registry, mezi registry a
pamětí, mezi registry a zásobníkem a mezi registry a V/V branami.
• Aritmetické a logické instrukce (33) – zahrnují sčítání, odečítání, násobení a dělení
různých formátů dat. Slovní nebo slabikové posuvy a rotace, logické funkce negace,
součinu, součtu a neekvivalence. Podle výsledku se nastavují příznakové bity.
• Instrukce pro práci s řetězci (18) – přesuny, porovnávání a prohlížení hodnot řetězců až
do délky 64kB. Speciální instrukční předpona rep dovoluje opakování řetězcové operace
technickými prostředky s možností přerušení.
• Instrukce řízení běhu programu (26) – podmíněné a nepodmíněné skoky, cykly, volání
a návraty z podprogramů. Tyto instrukce mění obsah registru ip (případně cs).
• Instrukce řízení procesoru (12) – nulování a nastavování příznakových bitů,
synchronizace procesoru s externími ději, vyvolání a návrat z přerušení.

1.1 Zkratky pro značení operandů

r8 8-i bitový registr (al, bl, cl, dl, ah, bh, ch, dh)
r16 16-i bitový registr (ax, bx, cx, dx, sp, bp, si, di)
sr segmentový registr (cs, ds, ss, es)
i8 přímý operand (konstanta) 1 B
i16 přímý operand (konstanta) 2 B
m8, m16 přímá adresa
mi8, mi16 indexovaná adresa, bázovaná nebo bázově-indexovaná adresa
mb8, mb16 pouze bázovaná adresa
flags registr příznaků
sdisp cílová adresa v rozsahu [-128 .. +127] byte

1.2 Instrukce přenosu dat


MOV cíl, zdroj cíl:=zdroj
r8, r8 mov c1,dh
m8 mov bl,byte ptr ds:20h
i8 mov ah,66h
mi8 mov dl,byte ptr ds:[si]
r16, r16 mov bx,bp

Ing. Miroslav Balík. Ph.D.


2 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

m16 mov si,word ptr es:5h


i16 mov cx,30ABh
mi16 mov dx,word ptr cs:[bp]
sr mov cx,es
sr, ax mov cs,ax
r16 nesmí být cs mov ds,di
m16 nesmí být cs mov es,word ptr ss:5h
mi16 nesmí být cs mov ss,word ptr ds:[bx] [di]
m8, r8 mov byte ptr ds:0Fh,ch
i8 mov byte ptr cs:1,bl
m16, r16 mov word ptr es:2,dx
i16 mov word ptr ds:0,1234h
sr mov word ptr cs:6,cs
mi8, r8 mov byte ptr [si],bh
i8 mov byte ptr es:[bp][di],"X'
mi16, r16 mov word ptr ss: [bp+2],di
i16 mov word ptr [si],0FFFFh
sr mov word ptr ds:[di],ds

XCHG cíl, zdroj vzájemná výměna hodnot operandů


r8, r8 xchg al,ch
m8, r8 xchg byte ptr cs:0,dl
mi8, r8 xchg byte ptr [si],bl
r16, r16 xchg ax, si
m16, r16 xchg word ptr es:1ah,bp
mi16, r16 xchg word ptr cs:[bx][di],dx

XLAT získání hodnoty z tabulky (table look-up operation)


m8 operand je formální al:=ds:[bx+al]

XLATB umožňuje změnit segment - xlat ss:0 => al:=ss:[bx+al]

LEA cíl, zdroj cíl:=offset zdrojového operandu (efektivní adresa)


r16, m16 lea bx,word ptr cs:20h bx:=20h
mi16 lea dx,byte ptr 5[bx][si] dx:=5+bx+si

LDS cíl, zdroj čtení úplného ukazatale (segment do ds)


r16, m16 lds dx,dword ptr cs:12h dx:=cs:12h, ds:=cs:14h
mi16 lds ax,dword ptr es:[di] ax:=es:[di] ds:=es:[di+2]

LES cíl, zdroj čtení úplného ukazatale (segment do es)


r16, m16 les dx,dword ptr cs:12h dx:=cs:12h, es:=cs:14h
mi16 les ax,dword ptr es:[di] ax:=es:[di] es:=es:[di+2]

PUSH op uložení hodnoty operandu do zásobníku


r16 push si

Ing. Miroslav Balík. Ph.D.


Instrukční soubor 8086 3

sr push cs
m16 push word ptr ds:30h
mi16 push word ptr es:[bx][di]

POP op přesun slova ze zásobníku do cílového operandu


r16 pop dx
sr mimo cs pop es
m16 pop word ptr ds:0
mi16 push word ptr cs:[di]

LAHF obsah dolního bytu flags do ah

SAHF obsah ah do dolního bytu flags

PUSHF flags do zásobníku

POPF přesun slova ze zásobníku do flags

IN cíl, zdroj čtení hodnoty z I/O portu


al, i8 in al,30h al:=obsah portu a adresou 30h
dx in al,dx al:=obsah portu jehož abs. adresa je v dx
ax, i8 in ax,30h
totéž, čtou se 16-i bitové hodnoty
dx in ax,dx

OUT cíl, zdroj zápis hodnoty na I/O port


i8, al out 30h,al I/O s adresou 30h:=al (byte)
ax out 30h,ax I/O s adresou 30h:=ax (slovo)
dx, al out dx,al I/O s adresou v dx:=al (byte)
ax out dx,ax I/O s adresou v dx:=ax (slovo)

1.3 Aritmetické a logické instrukce


ADD op1, op2 op1:=op1+op2 nastavuje OF,SF,ZF,AF,PF,CF
ADC op1, op2 op1:=op1+op2+CF nastavuje OF,SF,ZF,AF,PF,CF
r8, r8 (add,adc) al,ch
i8 (add,adc) bl,3
m8 (add,adc) ch,byte ptr ds:15h
mi8 (add,adc) dl,byte ptr [si]
r16, r16 (add,adc) dx,si
i16 (add,adc) di,1234h
m16 (add,adc) cx,word ptr ds:1h
mi16 (add,adc) bx,word ptr cs:[di]
m8, r8 (add,adc) byte ptr es:5,bh
i8 (add,adc) byte ptr ds:0,12
mi8, r8 (add,adc) byte ptr es:[di+6],dh

Ing. Miroslav Balík. Ph.D.


4 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

i8 (add,adc) byte ptr cs:[bx],88h


m16, r16 (add,adc) word ptr ds:15h,dx
i16 (add,adc) word ptr ss:[bp+4],1234h
mi16, r16 (add,adc) word ptr ds: [bx+si],ax
i16 (add,adc) word ptr es:[di],1234h

SUB op1, op2 op1:=op1-op2 nastavuje OF,SF,ZF,AF,PF,CF


SBB op1, op2 op1:=op1-op2-CF nastavuje OF,SF,ZF,AF,PF,CF
r8, r8 (sub,sbb) al,ch
i8 (sub,sbb) bl,3
m8 (sub,sbb) ch,byte ptr ds:15h
mi8 (sub,sbb) dl,byte ptr [si]
r16, r16 (sub,sbb) dx,si
i16 (sub,sbb) di,1234h
m16 (sub,sbb) cx,word ptr ds:1h
mi16 (sub,sbb) bx,word ptr cs:[di]
m8, r8 (sub,sbb) byte ptr es:5,bh
i8 (sub,sbb) byte ptr ds:0,12
mi8, r8 (sub,sbb) byte ptr es:[di+6],dh
i8 (sub,sbb) byte ptr cs:[bx],88h
m16, r16 (sub,sbb) word ptr ds:15h,dx
i16 (sub,sbb) word ptr ss:[bp+4],1234h
mi16, r16 (sub,sbb) word ptr ds: [bx+si],ax
i16 (sub,sbb) word ptr es:[di],1234h

INC op operand:=operand+1; nastavuje OF,SF,ZF,AF,PF


r8 inc al
r16 inc si
m8 inc byte ptr ds:12
m16 inc word ptr cs:0
mi8 inc byte ptr es:[bp]
mi16 inc word ptr ds:[si]

DEC op operand:=operand-1; nastavuje OF,SF,ZF,AF,PF


r8 dec al
r16 dec si
m8 dec byte ptr ds:12
m16 dec word ptr cs:0
mi8 dec byte ptr es:[bp]
mi16 dec word ptr ds:[si]

NEG op aritmentická negace - dvojkový doplněk


operand:=0-operand; nastavuje OF,SF,ZF,AF,PF,CF
CF=0 pokud operand=0
r8 neg al
r16 neg cx

Ing. Miroslav Balík. Ph.D.


Instrukční soubor 8086 5

m8 neg byte ptr ds:0


m16 neg word ptr ds:0
mi8 neg byte ptr es:[bx+di]
mi16 neg word ptr ss:[bx+6]

CMP op1, op2 porovnání operandů jejich odečtením (op1-op2)


nastavuje OF,SF,ZF,AF,PF,CF
r8, r8 cmp al,ch
i8 cmp bl,3
m8 cmp ch,byte ptr ds:15h
mi8 cmp dl,byte ptr [si]
r16, r16 cmp dx,si
i16 cmp di,1234h
m16 cmp cx,word ptr ds:1h
mi16 cmp bx,word ptr cs:[di]
m8, r8 cmp byte ptr es:5,bh
i8 cmp byte ptr ds:0,12
mi8, r8 cmp byte ptr es:[di+6],dh
i8 cmp byte ptr cs:[bx],88h
m16, r16 cmp word ptr ds:15h,dx
i16 cmp word ptr ss:[bp+4],1234h
mi16, r16 cmp word ptr ds: [bx+si],ax
i16 cmp word ptr es:[di],1234h

MUL op Násobení akumulátoru operandem;


Nastavuje OF,CF;
Hodnoty v SF,ZF,OF,PF nedefinovány
Pro 8-mibitový operand: ax:=al*operand
OF=CF=0 pro ax=0 jinak 1
Pro 16-mibitový operand: ax*operand
výsledek do dx (hodních 16b) a ax
OF=CF=0 pro dx=0
r8 mul ch
r16 mul cx
m8 mul byte ptr ds:0
m16 mul word ptr ds:0
mi8 mul byte ptr es:[bx+di]
mi16 mul word ptr ss:[bx+6]

IMUL op Násobení akumulátoru operandem;


Čísla se znaménky; Nastavuje OF,CF;
Hodnoty v SF,ZF,OF,PF nedefinovány
Pro 8-mibitový operand: ax:=al*operand
OF=CF=0 pro ah=sign extension al
Pro 16-mibitový operand: ax*operand
výsledek do dx (hodních 16b) a ax
OF=CF=0 pro dx=sign extension ax

Ing. Miroslav Balík. Ph.D.


6 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

r8 imul ch
r16 imul cx
m8 imul byte ptr ds:0
m16 imul word ptr ds:0
mi8 imul byte ptr es:[bx+di]
mi16 imul word ptr ss:[bx+6]

DIV op Dělení;
Hodnoty v OF,CF,SF,ZF,OF,PF nedefinovány
Pro 8-mibitový operand: ax/operand
výsledek al=podíl; ah=zbytek
Pro 16-mibitový operand:
dělenec 32 bit uložen v dx (horní b) a ax
výsledek ax=podíl; dx=zbytek
r8 div ch
r16 div cx
m8 div byte ptr ds:0
m16 div word ptr ds:0
mi8 div byte ptr es:[bx+di]
mi16 div word ptr ss:[bx+6]

IDIV op Dělení; Hodnoty se znaménky


Hodnoty v OF,CF,SF,ZF,OF,PF nedefinovány
Pro 8-mibitový operand: ax/operand
výsledek al=podíl; ah=zbytek
Pro 16-mibitový operand:
dělenec 32 bit uložen v dx (horní b) a ax
výsledek ax=podíl; dx=zbytek
r8 idiv ch
r16 idiv cx
m8 idiv byte ptr ds:0
m16 idiv word ptr ds:0
mi8 idiv byte ptr es:[bx+di]
mi16 idiv word ptr ss:[bx+6]

AAA - ASCII korekce al po sečítání BCD čísel


hodnota al je upravena na 0-9;
příp. převod jde do ah a pak AF,CF=1
SF,ZF,PF nejsou definovány

AAS - ASCII korekce po odečítání BCD čísel


hodnota al je převedena do BCD; nastavuje AF,CF
OF,SF,ZF,PF nejsou definovány

AAM - ASCII korekce po násobení BCD čísel


výsledek násobení je převeden do BCD
nastavuje PF,SF,ZF
AF,CF,OF nejsou definovány

Ing. Miroslav Balík. Ph.D.


Instrukční soubor 8086 7

AAD - ASCII korekce před dělením BCD čísel


BCD číslo v ax se převede na bin. tvar
původní BCD číslo se použije jako dělenec
nastavuje PF,SF,ZF
AF,CF,OF nejsou definovány

DAA - Desítková korekce po sečítání BCD čísel


Výsledek v al je upraven na BCD;
nastavuje AF,CF,PF,SF,ZF
OF není definován

DAS - Desítková korekce po odečítání BCD čísel


výsledek v al je převeden do BCD
nastavuje AF,CF,PF,SF,ZF
OF není definován

CBW - Převod bytu v al na slovo v ax


nejvyšší bit v al se rozšíří do celého ah

CWD - Rozšíření slova v ax na dvojslovo v dx, ax


nejvyšší bit v ax se rozšíří do dx

NOT op negace všech bitů operandu


r8 not bh
r16 not si
m8 not byte ptr cs:0
m16 not word ptr ds:8
mi8 not byte ptr es:[bx+si]
mi16 not word ptr [si]

AND op1, op2 logický součin ; op1:=op1 and op2


nastavuje OF a CF=0 podle SF,ZF,PF
AF není definován
TEST op1, op2 logický součin ; výsledek se neukládá
nuluje OF,CF; nastavuje SF,ZF,PF
AF není definován
r8, r8 (and,test) al,ch
i8 (and,test) bl,3
m8 (and,test) ch,byte ptr ds:15h
mi8 (and,test) dl,byte ptr [si]
r16, r16 (and,test) dx,si
i16 (and,test) di,1234h
m16 (and,test) cx,word ptr ds:1h
mi16 (and,test) bx,word ptr cs:[di]
m8, r8 (and,test) byte ptr es:5,bh
i8 (and,test) byte ptr ds:0,12
mi8, r8 (and,test) byte ptr es:[di+6],dh
i8 (and,test) byte ptr cs:[bx],88h

Ing. Miroslav Balík. Ph.D.


8 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

m16, r16 (and,test) word ptr ds:15h,dx


i16 (and,test) word ptr ss:[bp+4],1234h
mi16, r16 (and,test) word ptr ds: [bx+si],ax
i16 (and,test) word ptr es:[di],1234h

OR op1, op2 logický součet ; op1:=op1 or op2


nuluje OF,CF; nastavuje SF,ZF,PF
AF není definován
XOR op1, op2 NonEkvivalence ; výsledek v op1
nuluje OF,CF; nastavuje SF,ZF,PF
AF není definován
r8, r8 (or,xor) al,ch
i8 (or,xor) bl,3
m8 (or,xor) ch,byte ptr ds:15h
mi8 (or,xor) dl,byte ptr [si]
r16, r16 (or,xor) dx,si
i16 (or,xor) di,1234h
m16 (or,xor) cx,word ptr ds:1h
mi16 (or,xor) bx,word ptr cs:[di]
m8, r8 (or,xor) byte ptr es:5,bh
i8 (or,xor) byte ptr ds:0,12
mi8, r8 (or,xor) byte ptr es:[di+6],dh
i8 (or,xor) byte ptr cs:[bx],88h
m16, r16 (or,xor) word ptr ds:15h,dx
i16 (or,xor) word ptr ss:[bp+4],1234h
mi16, r16 (or,xor) word ptr ds: [bx+si],ax
i16 (or,xor) word ptr es:[di],1234h

SAL op1, op2 Aritmetický posuv vlevo buď o 1 bit nebo o počet bitů určený CL
Do CF se uloží naposledy vysunutý bit.
Operand se zprava plní nulami.
OF=1 pokud došlo ke změně nejvyššího bitu.
nastavuje OF,CF,SF,ZF,PF
AF není definován
SAR op1, op2 Aritmetický posuv vpravo buď o 1 bit nebo o počet bitů určený CL
Naposledy vysunutý bit (pův. nejnižší) do CF.
Nejvyšší bit se nemění proto OF=0.
nastavuje OF,CF,SF,ZF,PF
AF není definován
r8, 1 (sal,sar) d1,1
cl (sal,sar) ah,cl
r16, 1 (sal,sar) dx,1
cl (sal,sar) si,cl
m8, 1 (sal,sar) byte ptr cs:0,1
cl (sal,sar) byte ptr ds:8,cl
mi8, 1 (sal,sar) byte ptr [si],1

Ing. Miroslav Balík. Ph.D.


Instrukční soubor 8086 9

cl (sal,sar) byte ptr [bx+di],cl


m16, 1 (sal,sar) word ptr ds:2,1
cl (sal,sar) word ptr es:0,cl
mi16, 1 (sal,sar) word ptr [bx+6],1
cl (sal,sar) word ptr [bp+si],cl

SHL op1, op2 Logický posuv vlevo buď o 1 bit nebo o počet bitů určený obsahem
CL
Do CF se uloží naposledy vysunutý bit.
Operand se zprava plní nulami.
OF=1 pokud došlo ke změně nejvyššího bitu.
nastavuje OF,CF,SF,ZF,PF
AF není definován
SHR op1, op2 Logický posuv vpravo buď o 1 bit nebo o počet bitů určený
obsahem CL
Naposledy vysunutý bit (pův. nejnižší) do CF.
OF=1 pokud došlo ke změně nejvyššího bitu.
nastavuje OF,CF,SF,ZF,PF
AF není definován
r8, 1 (shl,shr) d1,1
cl (shl,shr) ah,cl
r16, 1 (shl,shr) dx,1
cl (shl,shr) si,cl
m8, 1 (shl,shr) byte ptr cs:0,1
cl (shl,shr) byte ptr ds:8,cl
mi8, 1 (shl,shr) byte ptr [si],1
cl (shl,shr) byte ptr [bx+di],cl
m16, 1 (shl,shr) word ptr ds:2,1
cl (shl,shr) word ptr es:0,cl
mi16, 1 (shl,shr) word ptr [bx+6],1
cl (shl,shr) word ptr [bp+si],cl

ROL op1, op2 Rotace vlevo buď o 1 bit nebo o počet bitů určený obsahem CL
Nejvyšší bit do nejnižšího a do CF
OF=1 pokud došlo ke změně nejvyššího bitu.
ROR op1, op2 Rotace vpravo buď o 1 bit nebo o počet bitů určený obsahem CL
Nejnižší bit do nejvyššího a do CF.
OF=1 pokud došlo ke změně nejvyššího bitu.
r8, 1 (rol,ror) d1,1
cl (rol,ror) ah,cl
r16, 1 (rol,ror) dx,1
cl (rol,ror) si,cl
m8, 1 (rol,ror) byte ptr cs:0,1
cl (rol,ror) byte ptr ds:8,cl
mi8, 1 (rol,ror) byte ptr [si],1

Ing. Miroslav Balík. Ph.D.


10 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

cl (rol,ror) byte ptr [bx+di],cl


m16, 1 (rol,ror) word ptr ds:2,1
cl (rol,ror) word ptr es:0,cl
mi16, 1 (rol,ror) word ptr [bx+6],1
cl (rol,ror) word ptr [bp+si],cl

RCL op1, op2 Rotace vlevo přes CF buď o 1 bit nebo o počet bitů určený obsahem
CL
CF do nejnižšího a nejvyšší bit do CF
OF=1 pokud došlo ke změně nejvyššího bitu
RCR op1, op2 Rotace vpravo přes CF buď o 1 bit nebo o počet bitů určený
obsahem CL
CF do nejvyššího a nejnižší bit do CF
OF=1 pokud došlo ke změně nejvyššího bitu
r8, 1 (rcl,rcr) d1,1
cl (rcl,rcr) ah,cl
r16, 1 (rcl,rcr) dx,1
cl (rcl,rcr) si,cl
m8, 1 (rcl,rcr) byte ptr cs:0,1
cl (rcl,rcr) byte ptr ds:8,cl
mi8, 1 (rcl,rcr) byte ptr [si],1
cl (rcl,rcr) byte ptr [bx+di],cl
m16, 1 (rcl,rcr) word ptr ds:2,1
cl (rcl,rcr) word ptr es:0,cl
mi16, 1 (rcl,rcr) word ptr [bx+6],1
cl (rcl,rcr) word ptr [bp+si],cl

1.4 Instrukce pro práci s řetězci


REP Není instrukce, ale jen předpona.
Zajistí opakování řetězové instrukce, ve spojení se kterou je použita.
Má smysl pro stos a movs.
Čítač opakování je v cx.

REPE, Opakování instrukce dokud je shoda.


REPZ Jako rep, ale pokud je ZF=0, opakování se ukončí bez ohledu na cx.
Používá se ve spojení s cmps a scas.

REPNE, Opakování instrukce dokud není shoda.


REPNEZ Jako repe, ale pokud je ZF=1 nebo se vyčerpá cx opakování se
ukončí.
Používá se ve spojení s cmps a scas.

Ing. Miroslav Balík. Ph.D.


Instrukční soubor 8086 11

MOVS - Přesun řetězce, es:[di] := ds:si


Pokud DF=0, zvýší se hodnoty indexových registrů o 1 (pro byte)
nebo o 2 (pro slovo)
Pokud DF=1, hodnoty indexových registrů se snižují.
Operandy jsou pouze kontrolovány na formální správnost a typ
(byte nebo slovo )
Kromě toho lze změnit zdrojový segment (cílový je vždy es)

MOVSB - Jako movs ale pracuje vždy s bytem


es:[di] := byte ptr ds:si, si:=si +/- 1
movsb di:=di +/- 1

MOVSW - Jako movs ale pracuje vždy se slovem (2B)


es:[di] := word ptr ds:si, si:=si +/- 2
movsw di:=di +/- 2

CMPS - Porovnání řetězců


Příznaky jsou nastaveny podle výsledku porovnání prvků řetězců a
potom jsou registry di a si upraveny podle velikosti operandu (byte,
slovo) a příznaku směru DF tak, aby ukazovaly na další prvky
řetězců.
Operandy jsou formální a slouží k určení typu (byte, slovo) a event.
změně seg. registru pro ZDROJ (pro CÍL je vždy es).
Cíl je vždy es:di, Zdroj je implicitně ds:[si]
Nastavuje AF,CF,OF,PF,ZF,SF

CMPSB - Jako cmps ale pracuje vždy s bytem


porovnává vždy byte ptr es:[di] (levý operand) s
byte ptr ds:[si] (pravý operand)
Nastavuje AF,CF,OF,PF,ZF,SF

CMPSW - Jako cmps ale pracuje vždy se slovem


Porovnává vždy word ptr es:[di] (levý operand) s
word ptr ds:[si] (pravý operand)
Nastavuje AF,CF,OF,PF,ZF,SF

LODS - Naplnění akumulátoru prvkem řetězce


Operand je pouze kontrolován na správnost typu a může být použit i
k určení seg. registru (implicitní je ds)
Adresa operandu musí být předem uložena do si.
Hodnota v si se pro DF=0 zvýší o 1 (pro byte) nebo 2 (pro slovo)
Pro DF=1 se snižuje.
lods byte ptr [si] al:=ds:[si], si:= +/- 1
lods word ptr cs:[si] ax:=cs:[si], si:= +/- 2

LODSB - Jako lods ale pracuje vždy s bytem


lodsb al:=byte ptr ds:[si], si:= +/- 1

LODSW - Jako lods ale pracuje vždy se slovem

Ing. Miroslav Balík. Ph.D.


12 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

lodsw ax:=word ptr ds:[si], si:= +/- 2

STOS - Uložení obsahu akumulátoru do řetězce


Operand je formální, ukládá se na adresu danou obsahem di.
Implicitní segment je es.
stos byte ptr [di] es:[di]:=al, di:=di +/- 1
stos word ptr cs:[di] cs:[si]:=ax, di:=di +/- 2

STOSB - Jako stos ale pracuje vždy s bytem


stosb byte ptr es:[di]:=al, di:=di +/- 1

STOSW - Jako stos ale pracuje vždy se slovem

stosw word ptr es:[di]:=ax, di:=di +/- 2

SCAS - Porovnání akumulátoru s prvkem řetězce adresovaného pomocí


es:[di]
Operand je formální určuje pouze typ podle výsledku porovnání se
nastaví příznaky a potom se upraví DI v závislosti na typu operandu
a DF tak, aby ukazoval na další prvek řetězce.

SCASB - Jako scas ale pracuje vždy s bytem


cmp al,byte ptr es:[di] a úpravu di

SCASW - Jako scas ale pracuje vždy se slovem


cmp ax,word ptr es:[di] a úpravu di

1.5 Instrukce řízení běhu programu


JMP cíl Nepodmíněný skok.Cíl je návěstí instrukce, které se má předat
řízení nebo registr, jehož obsahem je adresa, na kterou se má
předat řízení, nebo paměťové místo, jehož obsahem je adresa, na
kterou se má předat řízení
m16 Skok uvnitř jmp návěští
short m16 segmentu na jmp short návěští
speciální adresu jen o -128 až +127
r16 Skok uvnitř jmp ax
mi16 segmentu nepřímo v ax je nová hodnota ip
jmp 12[bx]
obsah 12[bx] do ip
far m16 Skok do jiného jmp far návěští
segmentu, přímo
mi16 Skok do jiného jmp dword ptr [bx][si]

Ing. Miroslav Balík. Ph.D.


Instrukční soubor 8086 13

segmentu, nepřímo
obsah slova na [bx][si]
do ip, násl.slovo do cs

Jcc cíl Podmíněný skok (pouze v rozsahu -128..+127 B), tedy pouze
sdisp.
Pokud je splněna podmínka, provede se skok.
Podmínkou se rozumí stav příznaků.
Podmínka je zakódovaná v názvu instrukce (některé mají i více
názvů).
JA, JNBE >, not(≤) (ja, jnbe) návěští CF=0 a ZF=0, unsigned
JAE, JNB, JNC ≥, not(<) (jae, jnb, jnc) návěští CF=0, unsigned
JB, JNAE, JC <, not(≥) (jb, jnae, jc) návěští CF=1, unsigned
≤, not(>) (jbe, jna) návěští CF=1 nebo ZF=1,
JBE, JNA
unsigned
JE, JZ = (je, jz) návěští ZF=1
JNE, JNZ ≠ (jne, jnz) návěští ZF=0
JG, JNLE >, not(≤) (jg, jnle) návěští OF=SF a ZF=0, signed
JGE, JNL ≥, not(<) (jge, jnl) návěští OF=SF, signed
JL, JNGE <, not(≥) (jl, jnge) návěští OF≠SF, signed
≤, not(>) (jle, jng) návěští OF≠SF nebo ZF=1,
JLE, JNG
signed
JS záporné js návěští SF=1, signed
JNS nezáporné jns návěští SF=0, signed
JPO, JNP lichá parita (jpo, jnp) návěští PF=0
JPE, JP sudá parita (jpe, jp) návěští PF=1
JNO nebyl pom. přenos jno návěští OF=0
JO byl pom. přenos jo návěští OF=1
JCXZ cx=0 jcxz návěští

LOOP cíl Cyklus s čítačem opakování v cx


Od cx se odečte 1 a pokud je nový obsah cx nenulový, provede se
skok na zadané návěští
Rozsah -128 .. +127 B

loop sdisp

LOOPE, cíl Cyklus dokud není rovno nebo není vyčerpán počet opakování.
LOOPZ Od cx se odečte 1 a pokud je nový obsah cx nenulový a ZF=1,
provede se skok na zadané návěští
Rozsah -128 .. +127 B
(loope, loopz) sdisp

LOOPNE, cíl Cyklus dokud je rovno nebo není vyčerpán počet opakování.
LOOPNZ Od cx se odečte 1 a pokud je nový obsah cx nenulový a ZF=0,
provede se skok na zadané návěští
Rozsah -128 .. +127 B
(loopne, loopne) sdisp

Ing. Miroslav Balík. Ph.D.


14 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

CALL cíl Volání podprogramu, návratová adresa (adresa instrukce


následující za CALL) je uložena do zásobníku
near m16 volání uvnitř segmentu nepřímo
r16 volání uvnitř segmentu nepřímo
mi16
far m16 volání mezi segmenty, přímo
mi16 volání mezi segmenty, nepřímo

RET op Návrat z podprogramu.


Vybere návratovou adresu ze zásobníku a naplní ji do ip a příp. i
cs (pokud bylo mezisegmentové volání).
Existují dva druhy instrukce ret - tzv. "near ret" a "far ret".
Překladač implicitně generuje near, pro návrat z far podprogramu
je nutné deklarovat podprogram jako far v direktivě proc.
Pokud je použit operand, udává, kolik bytů se má vyprázdnit ze
zásobníku po vybrání návratové adresy.
(Např. při způsobu, jakým předává parametry Pascal)
- ret
i16 ret 6

INT op Generace přerušení daného typu.(typ je 0...255).


Do zásobníku se uloží flags a návratová adresa (cs a ip) a odskočí
na adresu udanou vektorem přerušení daného typu.
Nuluje TF a IF.
i8 int 10H

INTO - Přerušení při přetečení. Instrukce generuje přerušení typu 4 pouze


v případě, že OF=1.
Nuluje TF a IF.

IRET - Návrat z přerušení. Vybere ze zásobníku návratovou adresu a


flags.

1.6 Instrukce řízení procesoru


CLC - Nulování CF

CLD - Nulování DF

STC - Nastavení CF na 1

STD - Nastavení DF na 1

CMC - Negace CF

CLI - Nulování IF (zákaz maskovatelného přerušení)

Ing. Miroslav Balík. Ph.D.


Instrukční soubor 8086 15

STI - Nastavení IF na 1 (povolení maskovatelného přerušení)

HLT - Zastavení procesoru až do přijetí NMI nebo RESET nebo


maskovatelného přerušení (je-li povoleno)

WAIT - Čekání na periferii.


Procesor přejde do čekacího stavu a setrvá v něm do aktivace
signálu TEST.

NOP - Žádná operace

LOCK - Zámek sběrnice


Neprovádí žádnou činnost, po dobu následující instrukce je
aktivní signál LOCK

ESC op1, op2 Předání instrukce jinému procesoru (koprocesoru)


op1 představuje instr. kód a op2 operand, které se předají
procesoru
i8, r16 esc 20,dx
m16 esc 6,ds:8
mi16 esc 10,[si]

Ing. Miroslav Balík. Ph.D.

You might also like