Így gondolom, hogy először az alapokat kell tisztázni, s csak ezután lehet mélyebben belemerülni a témába . Az első valóban használható IBM PC kompatibilis gépek az XT-k voltak. Mivel egyes okos emberek úgy gondolták, hogy az IBM PC sosem fog 1 megabájtnál több memóriát használni, ezért a proci 'Szegmens:offset' alakban címezi meg a memóriát, ami egy 20bites szám. [2^20=1 mb] A könyebb érthetőség végett vegyük a könyves példát . Van mondjuk egy könyvünk . Akkor a szegmens mutatja meg, hogy melyik lapon 'állunk', az offset pedig, hogy melyik betüt nézzük.

Azt hiszem, hogy a valóságot is le kellene írni. Erre viszont csak akkor térj vissza, ha már egy kicsit többet tudsz. Szóval, addig igaz, hogy a szegmens:offset egy 20 bites szám, amit így generál a proci:

  szegmens: xxxxxxxxxxxxxxx       <- 16 bites szám
  offset:   yyyyyyyyyyyyyyy       <- 16 bites szám

A 20bites címet úgy kapjuk meg, hogy a szegmenscímet eltoljuk néggyel bittel balra, majd hozzáadjuk az így kapott értékhez az offset értékét. Azaz:
 
  szegmens: 0000000000000000
  offset:   0000000000000000
  ------------------------------
  20bites:  00000000000000000000

Tehát ha megnöveljük 1-gyel a szegmens regiszter értékét, akkor 16byte-tal arrébb fog mutatni. Akkor innentől kezdve lehet címezni a memóriát. Ha pl. kérünk 2*64kb memóriát,és mondjuk a második 64kb-ra akarunk hivatkozni, akkor csak annyit kell tennünk,hogy hozzáadunk a 128kb-os memóriarész szegmenscíméhez 1000h-t, azaz 4096-ot.(4096*16=65536)
Példa:

  mov   ax,es   add   ax,1000h   mov   es,ax
Ekkor a szegmensregiszter a második 64kb-ra fog mutatni.

Eddig ezt remélhetőleg mindenki felfogta . Akkor lépjünk egy kicsit tovább. A PC-nek, mint a többi procinak is vannak regiszterei. Ezek "beépített változók".
Vannak 8bites, 16bites és 32bites regiszterek is.

  [][][][][][][][]  ez egy 8 bites regiszter. A 8 biten   2*2*2*2*2*2*2*2   féle számot tudunk ábrázolni,                     ami 2^8-on,azaz 256 !
A 16bites regisztereken 2^16-on féle számot tudunk ábrázolni, ami 65536, míg a 32bites regisztereken 2^32 féle számot tudunk ábrázolni.

Tehát vannak ezek a regiszterek. De mégis mi a nevük, és hogyan lehet őket használni ? - teheted fel a kérdést. A regiszterek egy-egy adat átmeneti tárolására szolgáló 8 - 16 - 32 bináris helyiérték hosszúságú, gyors működésű tárolóhelyek.A 16bites regisztereknek van egy alsó és egy felső része is, de ezek a 16bites regiszterek egyben a nekik megfelelő 32bites regiszternek az alsó részei. A felső részt "h"-val jelöljük, az alsót "l"-lel. (bh,bl,ch,cl,dh,dl...)

  [][][][][][][][] [][][][][][][][] <- 16 bites regiszter    felső (high)       alsó (low)
Úgy is tudunk rájuk hivatkozni : ha például AX-et vesszük, akkor
  AX = az egész, 16 bites regiszter   AH = az AX regiszter felső 8 bites része   AL = az AX regiszter alsó  8 bites része   AX = általános, 16 bites regiszter  [accumlator]   BX = általános, 16 bites regiszter  [base]   CX = általános, 16 bites regiszter  [counter]   DX = általános, 16 bites regiszter  [data]   SI = 16 bites regiszter, [source index]   DI = 16 bites regiszter, [destination index]   BP = 16 bites regiszter, [base pointer]   IP = 16 bites regiszter, [instruction pointer]                            Itt tart a program   SP = 16 bites regiszter, [stack pointer]                            A verem offsetjét mutatja.   CS = kód  szegmens, itt van a program       [code  segment]   DS = adat szegmens, itt van az adat         [data  segment]   ES = extra szegmens                         [extra segment]   SS = verem szegmens                         [stack segment]
Na, most akkor felmerült néhány kérdés :- Mi is az a verem ?
- Hogyan kell ezeket a regisztereket használni ?
Mi is az a verem ?
Ez egy olyasvalami, mint egy verem :) . Az benne a trükk, hogy bele tudunk dobni valamit, de mindig csak a legfelsőt tudjuk kiszedni . Lássunk egy példát.
  [12] <- ez a verem teteje   [08]   [07]   [11] <- ez meg akkor az alja :)
Akkor beledobunk 98-at!
  [98] <- ez a verem teteje   [12]   [08]   [07]   [11] <- ez meg akkor az alja :)
Ha ki akarjuk szedni a 08-at, akkor a 98-at és a 12-t kell kiszedni, csak ezután lehet a 08-at !
Utasításkód:
  push mit       ; lenyom a verembe egy számot   pop  mibe      ; felvesz a veremből egy számot   A mit  lehet : regiszter,változó,szám   A mibe lehet : regiszter,változó
Ha egy számot akarsz lenyomni, akkor a szám elé "byte","word" vagy "dword" szót kell írni.
Pl:
        push    0a000h
helyett:
        push    word 0a000h
Hogyan kell ezeket a regisztereket használni ?
Az első nagyon fontos utasítás, amivel megismerkedhetünk, a "mov", ami a move angol szó rövidítése (gy.k. mozgatni), tehát ez az ADATMOZGATÓ utasítás.
Lássunk néhány példát:
  - mov         ax,13   "ax"-be 13 kerül   - mov         bx,ax   "bx"-be az "ax" regiszter értéke kerül   - mov         ax,[valtozo]   "ax"-be a "valtozo" értéke kerül   - mov         ax,valtozo   "ax"-be a valtozo eltolási címe [offset] kerül   - mov         ax,word [ds:si]   ds:si memóriacímről beolvasunk egy word-öt
A "mov ax,valtozo" részt úgy gondolom, hogy jobban ki kellene fejteni. Tegyük fel, hogy egy szöveget ki szeretnénk írni, az algoritmus pseudo-kódja pedig:
  <----------- PSEUDO ----------->   a "cim" a szoveg elejere mutat   cimke:   beolvasunk egy byteot   ha a byte=0, akkor kilépünk   kiírjuk a byteot   cim=cim+1   ugrás a cimkére   <----------- PSEUDO ----------->
Ez assemblyben:
         mov           di,kepernyo          mov           si,szoveg cimke:  mov           al,BYTE [ds:si]          cmp           al,0          je            vege          mov           BYTE [es:di],al          inc           si          jmp           cimke vege:
Ha Turbo Assembler-t használunk, akkor
         NASM                            TASM/MASM/WASM   -------------------                  ------------------   - mov   ax,[valtozo]                - mov  ax,valtozo   vagy                                         mov  ax,[valtozo]   - mov   ax,valtozo                  - lea  ax,valtozo   vagy                                         mov  ax,offset valtozo   lesz.
Tehát ha a változó tartalmát akarjuk elérni, akkor kell a szögletes zárójel, ha a változó címét, akkor nem.

A szegmens:offset címzésnél is figyelni kell, mivel a tasm szegmens:[offset] - et használ, míg a nasm [szegmens:offset] -et.
Példa:
  Tasm:         mov     ax,es:[di]

  Nasm:         mov     ax,[es:di]

Ha belegondolunk, akkor lehet látni, hogy a nasm szintaxis SOKKAL értelmesebb :

  [ es:di ]   ^  ^    ^   | cím   |   |       |   érték --+
Tehát az es:di címről olvassunk be egy ÉRTÉKET !

A továbbiakban, ha tasm stílusú rész jön [lea&co], akkor egy !!! TASM SYNTAX !!! sor jelzi ezt.

1. példa letöltése