Skip navigation

Címzési módok

Memóriacímzés

A memóriában levő adatok címzésénél szükségünk van az adatok címének jelölésére. Ennek több lehetséges módja van.

Tegyük fel, hogy adott az alábbi Adatszegmens részlet.

.data
ADAT1 DW 2016
ADAT2 DB ? ; Inicializálatlan

TEXT1 DB ’Szoveg’
TOMB DD 11, 12, 13, 14, 15
21, 22, 23, 24, 25

Ekkor az adatokat az alábbi módokon érhetjük el.

Azonosító közvetlen használata

A változókat jelölő azonosítóval közvetlenül hivatkozhatunk az adatszegmensben tárolt adatra.

    MOV     AX, ADAT1
MOV ADAT2, AL

Tömb hivatkozásánál az azonosító a tömb első elemét jelöli.

    MOV     EAX, TOMB           ; Az EAX tartalma 11 lesz.

Indirekt címzés

A regiszterek tartalma maga is lehet egy adatszegmensbeli eltolás. Ilyenkor a regisztert pointer-ként használva is elérhetjük az adatokat.

    MOV     ESI, offset ADAT1  ; C++ -ban valahogy így nézne ki: "ESI = &ADAT1;"
MOV BX, [ESI] ; BX tartalma az ADAT1 váltózó értéke lesz.   ; C++-ban ilyesmi lenne: "BX = *ESI;"

Teljes címzési lehetőség

A z adatok címzésében több dolgoz használhatunk egyszerre. A teljes címzési forma:

[bázis + skála*index + eltolás]

Ami több alakban is felírható. A fentivel ekvivalens:

eltolás[bázis][skála*index]

Például:

    MOV     EBX, 20
MOV ESI, 3
MOV EAX, 8736[EBX][4*ESI]

Ez a forma nagyon jól használható többek között 2-dimenziós tömbök indexelésére. Ha feltesszük, hogy a fenti adatszegmensben a tömb a 8736. -ik byte-on kezdődik az adatszegmensben, akkor az fenti példával ugyanaz, mint az alábbi kódrészlet, és a tömb 2. sorának, 3. indexű (negyedik) elemét adja vissza.

    MOV     EBX, 20
MOV ESI, 3
MOV EAX, TOMB[EBX][4*ESI]

Magyarázat:

  • TOMB: A fordító helyettesíti majd 8736-al. A processzor a program futása közben csak az adat kezdőcímét tudja kezelni.
  • EBX: A tömb kezdetéhez képest a 2. sor eltolása. Az első sor 5 db 4 byte-os elemet tartalmaz. Vagyis + 20 byte eltolása van a tömb kezdetéhez képest.
  • 4*ESI: ESI tárolja a soron belül a kívánt indexet, 3-at. De ha ezt az elem memóriabeli eltolására vagyunk kíváncsiak, akkor ezt meg kell szorozni az elemek méretével (4 byte-os elemeknél) 4-el.