Minule sme mali moznost sa zoznamit so sadou registrov procesora 86. V tejto lekcii si ukazeme, ako sa adresuje pamet a na co sa pouzivaju segmentove registre.

   Zakladny adresovy priestor procesora 86 ma velkost 1 megabajt. To znamena ze sirka adresovej zbernice musi byt 20 bitov, pretoze 2^20 = 1048576 adries. Predpona mega- teraz neznamena milion, ako u ostatnych jednotiek a velicin, ale jej hodnota je odvodena od predpony kilo-, ktora pri bitoch a bajtoch znamena hodnotu 1024. Mega- tu znamena kilo krat kilo, cize 1024 krat 1024.

   Vsimnime si, ze adresa nejakeho konkretneho bajtu v pameti je 20-bitova, ale vsetky registre su iba 16-bitove a teda nemozu obsahovat 20-bitovu adresu. Ako tento problem vyriesit ?

   V procesore 86 sa tento problem riesi tak, ze kazda 20-bitova adresa sa vypocitava z dvoch 16-bitovych hodnot nasledovne:

ADRESA = 16 * HODNOTA1 + HODNOTA2

   Mozeme povedat, ze kazda adresa sa sklada z dvoch casti: hodnota1 sa nazyva segmentova cast adresy, skratene segment, a hodnota2 sa nazyva offsetova cast adresy, skratene offset. Slovo offset znamena nieco ako posunutie. Segmentova cast adresy nam urcuje oblast pameti dlhu 64kB. Tato oblast pameti sa tiez oznacuje ako segment. Segment moze zacinat iba na adrese tvoriacej celociselny nasobok 16. Prave 16 preto, lebo segmentova cast adresy je nasobena touto hodnotou a teda zmena segmentovej casti adresy o 1 znamena posunutie celeho segmentu v pameti pocitaca o 16 bajtov. Offset potom vyjadruje posunutie v ramci tohto segmentu. Toto posunutie v ramci segmentu uz moze byt o lubovolny [ale samorejme iba celociselny] pocet bajtov az do 64kB. Preto ma segment prave takuto dlzku. 16 bajtov, o ktore sa mozu posuvat segmenty, sa tiez zvykne nazyvat pojmom paragraf. Ak teda niekde bude napisane ze nieco ma dlzku napr. 20 paragrafov, v skutocnosti to znamena ze to ma dlzku 20*16 = 320 bajtov.

   Pri praci 86 existuju v pameti 4 segmenty: Prvy je tzv. code-segment. V tomto segmente sa nachadza strojovy kod prave beziaceho programu. Dalsie dva su datove segmenty: data-segement a extra-segment. V nich mozu byt ulozene polia, premenne, rozne tabulky, skratka uzivatelske data. Posledny stvrty segment je stack-segment. V nom sa nachadza zasobnik do ktoreho sa ukladaju a stale z neho vyberaju navratove nadresy pri volani podprogramov, docasne odlozene hodnoty registrov a premennych. Tiez tu mozu byt uzivatelske data. Kompilery vyssich programovacich jazykov ho pouzivaju na odkladanie lokalnych premennych.

   Ak si spominate, v minulej lekcii sme medzi registrami 86 spominali aj styri segmentove registre CS,DS,ES,SS. Privlastok "segmentove" tu vobec nie je nahodny. Prave tieto registre su urcene na ukladanie segmentovej casti adresy. Konkretne register CS (Code Segment) je urceny na pametanie segmentu adresy prave prebiehajucehu programu (offset adresy je v registri IP). DS [Data Segment] a ES (Extra Segment) su urcene na vseobecne pouzitie - obvykle obsahuju segmentove casti adries dat a register SS (Stack Segment) obsahuje segment adresy zasobnika (offset adresy je v registri SP). Na data mozu ukazovat aj registre CS a SS - ak sa tieto data nachadzaju v code-segmente alebo v stack-segmente.

   Priblizme si to na konkretnom priklade. Majme napriklad instrukciu, ktora k registru AL pripocita jednobajtovu hodnotu z premennej nazvanej napr. INKREMENT leziacej v pameti. Premenna INKREMENT nech lezi v datovom segmente na ktory ukazuje segmentovy registrer DS. Zapis instrukcie bude vyzerat takto:

ADD AL,INKREMENT

   Mnemotechnicka skratka ADD zmena "addition", pripocitanie. Procesor musi pri vykonavani tejto instrukcie spravit nasledovne cinnosti:

  1. Urcit adresu premennej INKREMENT v pameti
  2. Precitat hodnotu ulozenu na tejto adrese
  3. pripocitat tuto hodnotu k registru AL
  4. podla vysledku operacie nastavit prislusne priznaky v registri FLAGS.

Pozrime sa blizsie na schematickom nakrese, ako sa vykonava krok 1:

19181716151413 12111009080706 050403020100
Segmentovy register DS
+Offset adresy INKREMENT
Vysledna 20-bitova adresa

   Vidime, ze hodnota segmentu zo segmentoveho registra sa posunie o 4 bity, cim sa vlastne vynasobi cislom 16 a potom sa pripocita k hodnote offsetu premennej INKREMENT. Tym vznikne uplna 20-bitova adresa, ktora sa objavi na zbernici procesora pri citani pameti.

   Samotna hodnota offsetu adresy premennej INKREMENT sa nachadza ako argument instrukcie a prekladac assembleru ju vypocita pri preklade sam. Preto sa assembler tiez oznacuje pojmom 'jazyk symbolickych adries' - lebo staci sa na premenne, konstanty, adresy skokov a ine rozne udajove struktury odkazovat ich symbolickym oznacenim.

   Ako offsetova cast adresy nemusi vystupovat iba symbolicka hodnota, ale mozu tu byt aj niektore 16-bitove registre (BX,SI,DI,BP) alebo aj ich rozne kombinacie (napr. BX+SI+symbolicka_hodnota). Ale o tom az nabuduce.

Nazad na obsah , predchadzajuca a dalsia lekcia