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:

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