INSTRUKCIE PRE PRENOS DAT

   Ako uz sam nazov hovori, cielom tychto instrukcii je prenasat nejake udaje z jedneho miesta [zdroj, source] na miesto ine [ciel, destination]. Prenasane udaje mozu byt 8 alebo 16, niekedy dokonca az 32 bitove. Vo vseobecnosti sa az na dve male vynimky pri prenosoch udajov nemenia priznaky. Tie dve vynimky si popiseme neskor. Prenosove instrukcie mozno dalej rozdelit do takychto styroch skupin:

OBECNE PRENOSY

   V tejto podskupine su instrukcie, ktore ako jedine mozu ako zdroj alebo ciel pouzivat aj segmentove registre. Nachadzaju sa tu tri typy instrukcii:

MOV ciel,zdroj ... prenasa 8 alebo 16 bitovy udaj zo zdroja vpravo do cielu vlavo. Ci sa prenesie 8 alebo 16 bitovy udaj, zavisi od pouzitych operandov - ak je jeden z operandov 8-bitovy register, prenasat sa bude 8-bitovy udaj a potom logicky aj druhy operand musi predstavovat 8-bitovy udaj, to znamena ze to uz nemoze byt napr. 16-bitovy register. Ak ani jeden z operandov nie je register [napr. pri prenose priameho udaja do pameti], a pritom nie je zrejme kolko-bitovy udaj sa ma preniest, potom sa pocet bitov prenasaneho udaja da assembleru zadat pomocou specialnych klucovych slov 'byte ptr' alebo 'word ptr'. O tychto slovach si napiseme podrobnejsie niekedy nabuduce.

PUSH a POP ... Tieto instrukcie sluzia na ukladanie a vyberanie udajov zo zasobnika adresovaneho registrami SS:SP. Obe tieto instrukcie vyzaduju jeden operand predstavujuci 16-bitovu hodnotu - register alebo pametove miesto. Pri instrukcii POP plati jedno obmedzenie - ako operand v nej nesmie byt pouzity register CS. Jednu zaujimavu zvlastnost ma aj instrukcia PUSH. Procesor sice neumoznuje pouzit tuto instrukciu s priamym operandom, ale ak ju my pri pisani programov pouzijeme - bude bez problemov fungovat. Ako je to mozne ? Je to preto, lebo pri asemblovani takejto instrukcie ju assembler rozpise do postupnosti styroch procesoru znamych instrukcii, ktorych vysledkom bude prave ulozenie tohto priameho operandu na zasobnik.

XCHG ciel,zdroj ... vymiena obsah zdroja a ciela. Operandy musia byt podobne ako pri MOV obidva alebo 8 alebo 16 bitove. Pri tejto instrukcii nesmie byt ani jeden operand priamy udaj alebo segmentovy register. Vsimnime si, ze pomenovanie operandov jedneho ako 'zdroj' a druheho ako 'ciel' teraz celkom nema vyznam, lebo obidva su vlastne aj zdrojom a aj cielom zaroven.

PRENOSY CEZ AKUMULATOR

   Ak v lubovolnej instrukcii z podskupiny 'Obecne prenosy' pouzijeme ako operand akumulator, mohli by sme potom takuto instrukciu zaradit prave do tejto podskupiny. Mohli by sme, ale nezaradime, pretoze do tejto podskupiny zaradujeme len take instrukcie, pri ktorych nutne musi byt jeden z operandov pri prenose [zdroj alebo ciel] akumulator. Nachadzaju sa tu dva typy instrukcii:

IN akumulator,port ; OUT port,akumulator ... Tieto instrukcie sluzia na prenos dat medzi procesorom a perifernymi zariadeniami pristupnymi na tzv. portoch. Port je akasi 16-bitova adresa, podobne ako offset adresy do pameti, na ktorej je pristupny register nejakeho periferneho zariadenia. Ako akumulator moze byt pouzity cely akumulator AX [vtedy sa prenasa 16-bitovy udaj] alebo iba jeho nizsi bajt [vtedy sa prenasa 8-bitovy udaj]. V pripade ze sa ma prenasat 16-bitovoy udaj, jeho nizsi bajt sa vztahuje na adresu PORT a vyssi bajt na adresu PORT+1, podobne ako pri zapise alebo citani 16-bitoveho udaja do alebo z pameti. Ako PORT moze byt pouzity register DX alebo priamy operand sirky 8 bitov. Kedze priamy operand ma sirku iba 8 bitov, da sa vtedy pristupovat iba k portom na adresach 0 az 255.

XLAT ... Tato instrukcia sluzi na tabulkove konverzie. Vezme hodnotu registra BX, pricita k nej hodnotu z registra AL, tym dostane offset adresy do pameti (segment je standartne v DS), potom precita z tejto adresy jeden bajt a vlozi ho do registra AL. Cize matematicky zapisane AL <- [BX+AL]. Instrukcia nevyzaduje ziadne argumenty. Ako argument je mozne napisat adresu nejakej tabulky jednobajtovych hodnot alebo nejake navestie definovane ako bajt, ale tento argument nema ziadny prakticky vyznam a assembler ho pri preklade bude ignorovat.

PRENOSY PRENASAJUCE ADRESU

   Do tejto podskupiny patria nasledujuce dva typy instrukcii:

LEA ciel,zdroj ... Funguje tak isto ako MOV ciel,zdroj pricom ciel je 16-bitovy register a zdroj je lubovolnym sposbom adresovane pametove miesto, avsak namiesto slova umiestneneho v danom mieste pameti vlozi do registra iba adresu, kde sa toto slovo nachadza. Napriklad LEA AX,[BX+SI+2] teda nevlozi do AX slovo z adresy BX+SI+2, ale priamo adresu, t.j. hodnotu ktora je vysledkom vypoctu BX+SI+2.

LDS ciel,zdroj ; LES ciel,zdroj ... Tieto instrukcie vyzaduju presne take iste parametre ako LEA (t.j. ciel=16-bitovy register, zdroj=adresa v pameti) a aj robia v podstate to iste, ale okrem cieloveho registra naplnaju este aj segmentovy register hodnotou segmentu v ktorom sa nachadza dana adresa. Dalo by sa napisat, ze pokym LEA naplna 16-bitovy rgister 'near' pointerom na dane pametove miesto, LDS a LES naplnaju dvojicu registrov 'far' pointerom, pricom segmentova cast pointera sa vzdy zapise do segmentoveho registra (DS alebo ES) a offsetova cast pointra do vybraneho vseobecneho 16-bitoveho registra.

   Vidime teda, ze instrukcia LES nie je urcena na operacie nad mnozinou stromov (ci uz ihlicnatych alebo listnatych), ako by sa nam to mohlo snad na prvy pohlad zdat...

PRENOSY PRACUJUCE S PRIZNAKMI

   V procesore 86 existuje cely rad instrukcii, ktore umoznuju nastavovat a testovat jednotlive priznaky. Avsak do tejto podskupiny patria take instrukcie, ktore ako jedine narabaju s priznakmi naraz hromadne ako s normalnym registrom. S priznakmi tak este naraba instrukcia INT, ale o nej si napiseme neskorsie. Nachadzaju sa tu tieto styri instrukcie:

   Ziadna s tychto instrukcii nepotrebuje operandy, pretoze ciel i zdroj prenosu udajov su uz implicitne v nich dane.

   Vsimnime si, ze instrukcie SAHF a POPF su jedine dve instrukcie z celej funkcnej skupiny instrukcii pre prenos dat, ktore ovplyvnuju priznakovy register.

Nazad na obsah , predchadzajuca a dalsia lekcia