Skip navigation

Memóriafoglalás

Adatszegmens definiálása

Az assembly nyelvben az adatok számára az adatszegmensben tartunk fenn helyet.

Az adatszegmens definíciója a .data kulcsszóval kezdődik.

Utána soronként definiálhatjuk az adatokat:

[Azonosító] Típus érték[, érték, …]    ; megjegyzés pontosvessző után

  • Az Azonosító minden esetben egy memóriaszegmensbeli eltolásértéket fog adni, ahol az adat kezdőcíme megtalálható,
  • A típus az adat mérete,
  • egyszerre több értéket is megadhatunk, ekkor egy tömb kerül lefoglalásra a memóriában egymás után fűzött adatokkal.

Például:

.data
ADAT1 DW 2016, 2018, 2020
TEXT1 DB ’Szoveg’
ADAT2 DB ? ; Inicializálatlan

Nagy tömbök definiálása

A tömbök megadásakor lehetőség van egyszerre több érték duplikálására is.

    TOMB1   DW      5 DUP (0)
    TOMB2 DW 5 DUP (?)

Ilyen esetben a fordító a DUP kulcsszó előtt számszor fogja kifejteni (Duplikálni) a DUP utáni kifejezést.

A fenti kódrészek egyenértékűek például az alábbi két sorral:

    TOMB1   DW      0, 0, 0, 0, 0
    TOMB2   DW      ?, ?, ?, ?, ?

A cimkét teljesen el is hagyhatjuk. Ekkor az adatok folytonosan lesznek lefoglalva az előzőleg definiált adat után. Ez jól használható például több sorok tömbök definálására.

    TOMB3   DW      11, 12, 13, 14, 15
DW 21, 22, 23, 24, 25
DW 31, 32, 33, 34, 35

A fenti módon definiált tömbök értékei egymás mellett kerülnek lefoglalásra. Az elemek között levő eltolás pontosan az elemek méretével egyezik meg.


Adatok szerkezete az adat szegmensben

Fontos tudnunk a fentiek mellett, hogy az adat szegmens pontosan az általunk meghatározott módon kerül létrehozásra. Vagyis az alábbi adatszegmens definíció mellett:

.data
    A       SDWORD      41
    B       DWORD       1234h

Az memóriában lefoglalásra kerül egy 4 byte-os "A" nevű változó, és követlenül utána egy másik 4 byte-os "B" nevű változó is. A sorrendiséget viszont kihasználhatjuk. Az alábbi kódrészlet az A változó értékét teszi az EAX regiszterbe:

.code
; ...
    MOV     ESI, offest B    ; B címe az ESI-be
    MOV     EAX, [ESI - 4]   ; Az EAX értéke 41 lesz.
                             ; A "B" előtt 4 byte-al található memóriarész tartalma lesz kiolvasva.