I když jsme si již popsali, jak dosadit hodnotu adresy do některého z adresových registrů, nebyly možnosti ještě vyčerpány. Nejjednodušší je použití instrukce:
Paměť je v tomto případě označena jako v instrukci MOV. Instrukce LEA BX, BYTE PTR [$FF00] a MOV BX, $FF00 jsou ekvivalentní. Protože druhá instrukce je jednodušší, neměla by instrukce LEA význam. Proto ji častěji použijeme při hledání hodnoty kombinované adresy (LEA DI, 100[BX][SI] - sečte registry s číslem 100 a dosadí výsledek do DI). Pro nás má význam i ve vkládaném assembleru. Zápis LEA BX, proměnná je jednodušší něž MOV BX, offset proměnná (i když instrukce vykonají stejnou práci).
Příklad:
var pole: array [0..9] of byte;
begin
asm
LEA
BX, pole
{do registru BX dosaď adresu pole}
MOV
BYTE
PTR
[BX],10 {na první
místo v poli napiš 10}
end;
end.
Zatím jsme ovlivňovali jen registry s offsetem. Přestože bychom byli schopni dosadit i segment, bylo by nutné použít nejméně tři instrukce (nezapomeňte, že MOV neumí dosadit hodnotu do segmentového registru přímo). Abychom pochopili úspornější instrukci, musíme si zopakovat pojem ukazatel.
Je typ proměnné, který nese celou adresu určitého místa v paměti. S pomocí těchto proměnných můžeme potom dosazovat hodnoty na místa, kam ukazují. Častěji myslíme označením ukazatel právě tyto proměnné.
Příklad:
var cislo:byte; {vyčleň v paměti slabiku,
označ jí číslo}
ukazatel:^byte; {vyčleň v paměti čtyři slabiky,
které ponesou}
{adresu na proměnnou
typu byte, označ je ukazatel}
begin
ukazatel:=@cislo; {ukazateli přiřaď adresu proměnné
číslo}
ukazatel^:=10; {na místo kam směřuje ukazatel
zapiš 10}
writeln ('Hodnota proměnné číslo:',cislo,'=',ukazatel^);
{vypiš}
end.
Kromě ukazatelů na daný typ existují i ukazatele obecně (typ pointer). Tyto typy jsou pro nás důležité. Čtyři slabiky, které jsou pro proměnnou tohoto typu vyčleněny, nesou totiž segment i offset adresy, kam ukazatel směřuje. V assembleru existují dvě instrukce, které jsou schopny adresy uložené v ukazateli dosadit do registrů segmentu i offsetu:
Příklad:
var promenna: byte; {v paměti vyčleň slabiku s
označením proměnná}
ukazatel: poiter; {v paměti vyčleň čtyři slabiky pro
ukazatel}
begin
ukazatel:=@promenna; {nasměruj ukazatele na proměnnou}
asm
LES
BX, ukazatel
{nastav ES:BX na adresu proměnné}
SEGES
MOV
BYTE
PTR
[BX],10 {zapiš na tuto adresu}
end; writeln (promenna); {vypiš obsah proměnné}
end.