Učebnice Assembleru 86

Vyčlenění paměti pro proměnné v bloku asm

Ne vždy je vhodné používat pro naše proměnné paměť hlavního programu. Možnost vyčlenit si několik slabik dává i vložený assembler. Ve skutečnosti se jedná o část paměti určenou pro strojový kód. My si ale do ní umístíme hodnoty, na které většinou nezbylo místo v registrech. Protože je tento blok v segmentu programu, musíme tento blok proměnných programově obejít. Mikroprocesor by totiž tyto hodnoty v paměti považoval za instrukce. Vyčlenit místo si můžeme pomocí direktiv:

  • DB - zde vyčleň slabiky (8 bitů, hodnoty -128-255)
  • DW - zde vyčleň slova (16 bitů, hodnoty -32 768-65 535)
  • DD - zde vyčleň dvojslova (32bitů, hodnoty -2 147 483 648-4 294 967 295)

Za direktivu považujeme příkaz pro překladač, není to tedy instrukce. S pomocí těchto direktiv říkáme překladači, aby v kódu programu rezervoval určitý počet slabik pro naše účely. Za tyto direktivy rovnou píšeme počáteční hodnoty slabik, slov a dvojslov oddělené čárkou. Pokud napíšeme jméno proměnné deklarované pomocí var nebo jméno procedury, jedná se o jejich adresy (za direktivou DW offsetová část adresy, za direktivou DD celá adresa, tedy ukazatel). Pro názornost si rovnou uvedeme program s těmito direktivami.

Příklad:

var promenna:byte;
begin
 asm
  JMP @dal
 @slabiky:
  DB 10, 200,'M','Ahoj'
 @slova:
  DW 32000,'A',promenna
 @dvojslova:
  DD promenna
 @dal:
  MOV AL, CS:[OFFSET @slabiky]  {do AL přesuň slabiku z adresy}
                                {@slabiky, AL:=10}
  MOV AL, CS:[OFFSET @slabiky+1]{do AL přesuň slabiku}
                                {z @slabiky+1, AL:=200}
  MOV AL, CS:[OFFSET @slabiky+2]{do AL přesuň hodnotu ASCII}
                                {znaku 'M'}
  MOV AL, CS:[OFFSET @slabiky+3]{do AL přesuň ASCII prvního znaku}
                                {řetězce 'Ahoj'}
  MOV AL, CS:[OFFSET @slabiky+4]{do AL přesuň ASCII druhého znaku}
                                {řetězce 'Ahoj'}
  MOV AX, CS:[OFFSET @slova]    {do AX přesuň slovo z adresy}
                                {@slova, AX:=32000}
  MOV AX, CS:[OFFSET @slova+2]  {do AX přesuň hodnotu ASCII znaku}
                                {'A', AH:=0,AL:=65}
  MOV BX, CS:[OFFSET @slova+4]  {do BX přesuň offset proměnné}
                                {promenna}
  MOV BYTE PTR [BX], AL         {do této proměnné zapiš obsah}
                                {registru AL}
  LES BX,CS:[OFFSET @dvojslova] {naber obsah ukazatele, tedy}
                                {celou adresu proměnné do ES:BX}
  SEGES MOV BYTE PTR [BX], AL   {na celou adresu proměnné zapiš}
                                {obsah AL}
 end;
end.

Na takto vytvořená místa můžeme samozřejmě i zapisovat. Pokud nechceme používat návěští pro každou část, stačí si jen pamatovat, kolik místa zabere slabika, slovo, nebo dvojslovo. Potom se na hledanou část dostaneme přičítáním, nebo odčítáním určitých hodnot k offsetu návěští. Zajímavé je i využití adres proměnných. Protože proměnná za direktivou DD je celá adresa, můžeme naplnit instrukcí LES (LDS) oba registry, tedy segment i offset. Pokud zapíšeme DB 4, 'Ahoj', jedná se o klasický pascalovský řetězec z délkou na začátku.

Směr