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:
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.
| <= | => |