Vyčlenenie pamäte pre premenné v bloku asm


<= =>


Nie vždy je vhodné používať pre naše premenné pamäť hlavného programu. Možnosť vyčleniť si niekoľko slabík dáva i vložený assembler. V skutočnosti sa jedná o časť pamäti určenej pre strojový kód. My si ale do nej umiestnime hodnoty, na ktoré väčšinou nezostalo miesto v registroch. Pretože je tento blok v segmentu programu, musíme tento blok premenných programovo obísť. Mikroprocesor by totiž tieto hodnoty v pamäti považoval za inštrukcie. Vyčleniť miesto si môžeme pomocou direktív:

Za direktívu považujeme príkaz pre prekladač, nieje to teda inštrukcia. S pomocou týchto direktív hovoríme prekladaču, aby v kóde programu rezervoval určitý počet slabík pre naše účely. Za tieto direktívy hneď píšeme počiatočné hodnoty slabík, slov a dvojslov oddelené čiarkou. Pokiaľ napíšeme meno deklarovanej premennej alebo meno procedúry, jedná sa o ich adresy (za direktívou DW offsetová časť adresy, za direktívou DD celá adresa, teda ukazovateľ). Pre názornosť si uvedieme program s týmito direktívami.
unsigned char premenna;
void main () {
  asm {
    JMP dal 
    label slabiky byte
    DB 10, 200,'M','Ahoj'
    label slova word
    DW 32000,'A',premenna
    label dvojslova dword
    DD premenna
  }
  dal:
  asm {
    MOV AL, CS:[OFFSET slabiky]    // do AL presuň slabiku z adresy
                                   // slabiky, AL:=10
    MOV AL, CS:[OFFSET slabiky+1]  // do AL presuň slabiku
                                   // zo slabiky+1, AL:=200
    MOV AL, CS:[OFFSET slabiky+2]  // do AL presuň hodnotu ASCII
                                   // znaku ‚M’
    MOV AL, CS:[OFFSET slabiky+3]  // do AL presuň ASCII prvého znaku
                                   // reťazca 'Ahoj'
    MOV AL, CS:[OFFSET slabiky+4]  // do AL presuň ASCII druhého znaku
                                   // reťazce 'Ahoj'
    MOV AX, CS:[OFFSET slova]      // do AX presuň slovo z adresy
                                   // slova,AX:=32000
    MOV AX, CS:[OFFSET slova+2]    // do AX presuň hodnotu ASCII znaku
                                   // 'A', AH:=0,AL:=65
    MOV BX, CS:[OFFSET slova+4]    // do BX presuň offset premennej
                                   // premenna
    MOV BYTE PTR [BX], AL          // do tejto premennej zapíš obsah
                                   // registru AL
    LES BX, CS:[OFFSET dvojslova]  // naber obsah ukazovateľa, teda
                                   // celú adresu premennej do ES:BX
    SEGES MOV BYTE PTR [BX], AL    // na celú adresu premennej zapíš
                                   // obsah AL
  }
}

Na takto vytvorené miesta môžeme samozrejme i zapisovať. Pokiaľ nechceme používať návestie pre každú časť, stačí si len pamätať, koľko miesta zaberie slabika, slovo, alebo dvojslovo. Potom sa na hľadanú časť dostaneme pričítaním, alebo odčítaním určitých hodnôt k offsetu návestie. Zaujímavé je i využitie adries premenných. Pretože premenná za direktívou DD je celá adresa, môžeme naplniť inštrukciou LES (LDS) oba registre, teda segment i offset. Pokiaľ zapíšeme DB 4, 'Ahoj', jedná sa o klasický pascalovský reťazec z dĺžkou na začiatku.


<= =>