Adattípusok
Az adat deklaráláskor nem határozzuk meg az adat pontos típusát, csak azt, hogy mekkora terület szükséges az adat tárolásához. Ennek megfelelően:
BYTE - egy byte
WORD - két byte (egy szó)
DWORD - négy byte (egy dupla szó)
QWORD - nyolc byte
Pointerek
Egy label1 cimke címét az offset label1 kifejezéssel érhetjük el. A kifejezés értékének hossza már függ a használt memóriamodelltől. A DOS-os memóriamodellben egy cím egy szegmens és egy offset értékből tevődik össze, a fenti kifejezés az offset címet adja vissza, ami 16 bit hosszú. A Windows flat memóriamodellje egyetlen 4Gbyte-os virtuális memóriaszegmenst bocsájt az alkalmazás rendelkezésére, így nincs szükség szegmensregiszterekre, az offset értéke pedig 32 bites.
Tehát mindenre lehet pointert használni, aminek helye van a memóriában. SHORT - pointer a hívás helyétől nem messzebb mint 127 byte-nyira
NEAR - pointer azonos szegmensben levő címre
FAR - pointer tetszőleges szegmensben levő címre
Ilyen módon meg lehet oldani a cím szerinti paraméterátadást is eljárások hívásánál:
label1: BYTE érték
label2: NEAR offset label1
...
push label2
call proc1
A fenti esetben nem a label1 címen található byte tartalmát kapja meg bemenő paraméterként az eljárás, hanem a címét. Ilyenkor nem lehet további kikötést tenni, tetszőlegesen írhatja és olvashatja is a byte tartalmát.
Összetett adattípusok
Tömbök
label1: BYTE n dup (x)
A fenti sor egy byte adat helyett n byte-ot hoz létre az adatszegmensben, és minden értéket x-re inicializál. Természetesen a BYTE helyett más adattípus is állhat. Ha x helyére ?-et írunk, akkor nincs inicializáló érték. Az értékek egymás után helyezkednek el a memóriában, a label1 pointer a legelső elemre mutat. Ha nem az első elemet akarjuk megkapni, akkor label1 értékéből, a keresett elem sorszámából, és az adattípus hosszából ki kell számolnunk a keresett pointert.
label1: BYTE n dup (m dup (x))
A fenti példában már egy két dimenziós tömböt láthatunk. Figyelembe kell azonban venni, hogy továbbra is kézzel kell kiszámolni a tömb egy mezőjének értékét, ami a dimenziók növekedésével egyre nehezebb lesz. A memóriában való elhelyezés szerkezete értelemszerűen leolvasható a tömb megadásának módjából. A fenti példa m byte hosszú sorokból hoz létre n darabot, ez az n darab m hosszú sor egymás után helyezkedik el a memóriában. Tehát ha sorfolytonosnak képzeljük el a tárolást, akkor egy n sorból és m oszlopból álló tömböt kapunk a fenti példában.
Tömb eleme lehet bármilyen típus, így rekord és tömb is. Indexelni csak egész számmal lehet, valójában még azzal sem, kézzel kell kiszámolni egy mező pozícióját. A fent látható módon lehetséges kezdeti értékadás a tömböknél, de ez minden mezőhöz ugyanazt az értéket rendeli. Egész tömbnek sosem adhatunk értéket, csak egy-egy mezőjének.
Rekord
pelda STRUCT
field1: BYTE 1
field2: BYTE 2
pelda ENDS
A fenti kódrészlet egy példa nevű rekord adattípust hoz létre, aminek két BYTE típusú mezője van. A STRUCT kulcsszó jelzi a rekord kezdetét, az ENDS a végét. Ha ezek után deklarálni akarunk egy példa típusú változót, akkor az alábbi módokon tehetjük:
label1: pelda {}
label2: pelda {2,3}
Az első sor létrehozza a példa rekordot az eredeti kezdőértékekkel, a második sor felüldefiniálja ezeket az alapértelmezett értékeket. Lehetőség van arra is, hogy egy rekord mezője maga is egy rekord legyen, ezt az alábbi módon tudjuk elérni:
pelda2 STRUCT
field1: BYTE 1
field2: pelda {2,3}
pelda2 ENDS
label3: pelda2 {2,{3,4}}
label3 egy példa2 típusú rekordot deklarál. A belső kapcsos zárójelen belül már a példa típusú rekord kezdőértékeit adjuk meg. Ezek után a rekordok mezőit az alábbi módon érhetjük el:
mov AL,label1.field1
mov BL,label3.field2.field1
Az első sor a label1 cimkével jelölt példa típusú rekord field1 mezőjét éri el. A második sor arra példa, hogy hogyan lehet egymásba ágyazott rekordok mezőit elérni. BL értéke a label3 által jelölt példa2 típusú rekord field2 mezőjében található példa típusú rekord field1 mezőjének értéke lesz.
Unió, halmaz
Az assembly nyelvben nincs unió és halmaz típus.