Assemblyben többféle változó létezik :

   - byte                [ 1 bájt][db]    - word                [ 2 bájt][dw]    - doubleword          [ 4 bájt][dd]    - quadword            [ 8 bájt][dq]    - ten-byte-unit       [10 bájt][dt]
+ az ezeknél is nagyobbak, de ezeket még nem használjuk !Definiálásuk:
    _byte   db                  128     _word   dw                32000     _double dd                90000     _quad   dq 12345678912345678912     _ten    dt 12345678912345678916
Tehát egy változó definiálás így épül fel:név egység adat

A "név" a neve, az "egység" az, hogy byteos, wordos, dwordos, qwordos, vagy 10 bájtos, az "adat" pedig, hogy az adott változónak milyen értéket adunk.
Lehet előjeleket is használni :

    _int  dw -32000
Ez azonban elfoglal egy bit-et, így előjel használata esetén : -32768 - tól ... 32767 - ig tudunk számokat ábrázolni.
A megfelelő változóra hivatkozás:
  mov   al,byte  [_byte]   mov   ax,word  [_word]   mov  eax,dword [_double]   push qword [_quad]   push tword [_ten]
Egy számot megadhatunk decimális/bináris/hexa alakban is,
pl. 18:
          db   18           db   0x12           db   12h           db   $12           db   10010b
A nasm kezeli a lebegőpontos számokat is:
    _single dd 3.5     _double dq -3.145637263782
szöveget így definiálunk :
    duma db 'Hello world!',0
A 0-val jelezzük, hogy vége a dumának ! De akár mással is jelezhetjük, a lényeg az, hogy meg tudjuk állapítani, hol van a vége a szövegnek.
Lehet tömböket is definiálni :
    bigtomb times 32000 db 0
Ez egy 32000 elemű bájt alapú tömb, melynek minden eleme 0. Akinek nem lenne világos: 32000 darab 0, az elején egy cimke-vel !
Ha nem akarunk konkrét értéket adni a tömb elemeinek, akkor használjuk a resX parancsot, ahol
  X = b         = byte     = w         = word     = d         = dword   pl.   zso     resb    30
30 byte, de a file végéhez képest címezi, ergo nem fogja a file méretét növelni, míg a times igen...
Megj.: tasm használata esetén "bigtomb db 32000 dup (?)"-t kell írni resb helyett.

Ugyanitt kell megemlítenem a külső fileok beszúrását is. Ez az %include "filenév.kit"-sel működik. Ekkor az include sor helyére a fordító a 'filenév.kit'-ben lévő dolgokat fordítja be. Példa:

    ...   %include "rulez.inc"   ...     elite resb 256
Ekkor az 'include rulez.inc' sor helyére az 'elite resb 256' sor fog bekerülni, természetesen ha több sor van a -ben akkor az összes sor kerül be a -ba. A -ben lehetnek programrészletek is, azokat is befordítja.

Ha egy adatfile-t szeretnénk beszúrni a programba, akkor használjuk az "incbin" utasítást:

   incbin "file.dat"          ; beszúrja a filet    incbin "file.dat",1024     ; Skippeli az első 1024 byteot    incbin "file.dat",1024,512 ; Skippeli az első 1024 byteot, és                               ; azután 512 byteot beilleszt
Ez most csak egy kis bonyolítás lesz, úgyhogy csak azok olvassák el, akik már nagyjából elolvasták az egész cikket. Amikor az IBM PC-t magas szinten programozunk, akkor elkülönítünk változókat és memóriacímeket. (pl. a képernyő kezdőcíme) Igazság szerint a változók is memóriacímek, és a fordító más-más kódot fordít, ha pl. egy regiszterbe egy számot töltünk, vagy ha a regiszterbe egy memóriacímről olvasunk be értéket.
  Példa:      mov       ax,ertek                ; offset ertek...               mov       ax,[ertek]               ertek     dw 22
Ez lefordítva:
              [ cím  ]  [byteok]          [assembly kód]               ...               00000102  BE0E01            mov si,10eh               00000105  8B360E01          mov si,[10eh]               ...               0000010E  16                push ss               0000010F  00                db 0x00
!!! TASM SYNTAXIS !!!

Még egy kis kiegészítés a PASCAL(sic)-osok kedvéért. Pascalban a változókat így lehet definiálni:

   @zso: dw 12    ...    mov   ax,@zso
Ugyanez igaz a cimékre is, azaz ott is kell KUKAC :)