Relativní adresa

Z Wikipedie, otevřené encyklopedie

Relativní adresa neboli posunutí (anglicky offset) v paměti, poli nebo jiné datové struktuře je v matematické informatice celé číslo udávající vzdálenost určitého prvku od začátku paměti, struktury nebo jiného významného místa v rámci téže struktury.[1]:s.100–103 Posunutí se často udává v bytech; pokud však datová struktura obsahuje prvky stejné velikosti, může být udáváno jako počet těchto prvků.

Pokud například A je pole znaků obsahující “abcdef“, pak čtvrtý prvek, který obsahuje znak 'd', má od začátku pole A posunutí 3.

V jazyce symbolických adres[editovat | editovat zdroj]

V počítačovém inženýrství a nízkoúrovňovém programování (např. v jazyce symbolických adres) posunutí obvykle označuje počet adresních lokací, které je třeba přičíst k bázové adrese pro získání absolutní adresy určitého prvku. V tomto (původním) významu slova posunutí se pro zadání velikosti posunutí používá pouze základní adresová jednotka, obvykle 8bitové Bajt. V toto kontext posunutí je někdy nazývaný relativní adresa.

Některé strojové instrukce architektury IBM System/360 obsahují 12bitové posunutí, které poskytuje rozsah od 0 do 4096 bytů. Například v instrukci nepodmíněného skoku (šestnáctkově X'47F0Fxxx') je xxx 12bitová hodnota udávající bytové posunutí oproti adrese obsažené v bázovém registru (zde registr číslo 15), kam se má provést skok. Protože v architektuře IBM System/360 musí být instrukce umístěny na sudé adrese, musí být součet obsahu bázového registru a posunutí sudé číslo, jinak dojde k vyvolání programové výjimky (anglicky program check).

Předchozí příklad popisuje nepřímý způsob adresování místa v paměti ve formátu segment:offset. Je třeba mít na paměti, že tímto způsobem lze libovolnou adresu získat mnoha způsoby; předpokládejme například, že se chceme odkázat na paměťovou lokaci 0xF867. Toho lze dosáhnout např. nastavením počáteční adresy segmentu na 0xF000 a použitím posunutí 0x0867, nebo adresou segmentu 0xF840 a posunutím 0x0027.

Posunutí není vždy relativní vůči bázové adrese modulu, například: Pokud máme třídu a chceme se dostat k atributu „barva“ této třídy, posunutí může být 0x0100, ale toto posunutí je třeba přičíst k posunutí samotné třídy, ne k bázové adrese. Pokud je posunutí třídy 0xFF881 a bázová adresa 0x0A100, pak pro načtení atributu „barva“ se k bázové adrese musí přičíst součet obou posunutí. 0x0A100 (báze) + 0xFF881 (třída) + 0x0100 (atribut). Výsledná adresa atributu bude 0x109A81.

Odkazy[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku Offset (computer science) na anglické Wikipedii.

  1. KERNIGHAN, Brian W.; RITCHIE, Dennis M., 1988. The C Programming Language. 2. vyd. Englewood Cliffs, New Jersey: Prentice Hall. ISBN 0-13-110362-8. OCLC 318301687 

Související články[editovat | editovat zdroj]