You are on page 1of 9

x86 Adresleme Modlar ve Turbo Debugger

Bu makalede x86 adresleme modlarn anlatmaya alacam, ayrca sembolik kodlarmz, verilerimizi daha rahat grebileceimiz ve kontrol
edebileceimiz bir program olan Turbo Debugger inceleyeceleyeceiz.
Geen makalemizde x86 kaydedicilerini hafzann yapsn anlatmaya almtm. Bu makaleye kadar ounlukla x86 uyumlu sistemlerin
yaps zerinde durdum. Bundan sonra yazacam makaleler daha ok assembly programlama dilini kapsayacak.
ADRESLEME MODLARI
Bildiiniz gibi programlar oluturan kodlar ve veriler hafzaya yklendikten sonra ilemci tarafndan satr-satr icra edilirler. Ayrca CPU tm
giri k ilemlerini de hafzaya erierek yapar. Bazen hafzadan dorudan bir kod ya da veri alr, iler. Bazen hafzaya bir veri
gnderdiinizde birde bakmsnz bu bir yazcdan belge olarak km vs. te bilgisayarn donanm ve yazlm dzeyinde yapt bunca eitli
i iin CPU hafzaya deiik yollardan erime ihtiyac duyar. Sizlerde programlarnz yazarken CPUnun hafzaya nasl erieceini yazdnz
kodlarla belirtmek zorundasnz. Assembly dilinin ilk basama olan adresleme modlar da bu konular kapsyor.
Her mikroilemci reticisi bir mikro ilemci piyasaya srdnde, komut setini ve adresleme modlarnda yaynlar. Programclar da bu
belgelere gre programlarn yazarlar. Intel 8086 ilemcisini piyasaya srdnde olduka kullanl bir dizi adresleme modu salad. Intelin
u ana kadar rettii ilemcilerde bu adresleme modlarn kullanabilirsiniz. Daha sonralar bir devrim niteliinde olan 80386 ilemcisi ile ek
adresleme modlarda geldi. Bu zel adresleme modlar sadece 386 ve sonras ilemcilerde kullanlabilir. Tabi ki bu ek adresleme modlar ile
assembly programlama dili daha esnek bir yapya brnmt. Bizde bu makalemizde adresleme modlarn 386 ncesi ve sonras olarak ikiye
ayracaz.
u ana kadar yaptmz programlarda ok fazla komut rnei grmediniz ama makalelerimizi takip ettiyseniz MOV komutunu yakndan
tanmanz lazm. MOV komutu assembly programlama dilinde en ok kullanlan komutlarn banda gelir. nk bir program alrken genelde
hafzaya yazar yada okur. MOV komutu da bu i iin biilmi kaftandr ve bu kadar ok kullanldndan dolay bir ok adresleme modunu
destekler, yani bu komut ile hafzaya ok deiik yollardan eriebilirsiniz. Bu yzden bu makalede adresleme modlarn anlatrken MOV
komutunu rnek alacam.
MOV komutunun genel kullanm ekli;
MOV hedef, kaynak
8086 ADRESLEME MODLARI:
8086 Kaydedici Adresleme:
Adndan anlalaca gibi kaydediciden kaydediciye yaplan ilemlerde bu adresleme modlar kullanlr. En hzl adresleme modudur, nk
ilem hafzada deil ilemcinin iinde gerekleir.
Genel amal ve indeks kaydedicilerde kaydedici adresleme modlar:
mov
mov
mov
mov
mov
mov

ax, bx
dl, al
si, dx
sp, bp
dh, cl
ax, ax

; BX teki deeri AXe kopyalar


; AL teki deeri DLye kopyalar
; DX teki deeri SIya kopyalar
; SP deki deeri BPye kopyalar
; CL deki deeri DHa kopyalar
; Bu da doru bir kullanmdr!

Kaydedici adreslemede en ok dikkat etmeniz gereken husus hedef ve kaynan boyutlardr. rnein 16 bitlik bir kaydediciden 8 bitlik bir
kaydediciye tama yaplamaz!
mov

al, bx

;yanl kullanm, derleme annda assembler hata verir.

Kk boyuttaki kaynaktan byk boyuttaki hedefe de kopyalama yaplamaz.


mov

cx, al

; Yanl kullanm, ALile CX eit boyutta deil.

Bunlara ek olarak segment kaydedicilerinin kullanmnda dikkat edilmesi gereken noktalar vardr.
1- Segment kaydedicileri arasnda bir transfer ilemi ancak genel amal bir kaydedici vastasyla yaplabilir.
mov

ds,cs

; doru kullanlmayan segment kaydedicisi eklinde assembler hata verir!

Bu ii yapmak iin,
mov
mov

ax,cs
ds,ax

komut satrlar kullanlabilir.


2- CS ve IP kaydedicilerinin deeri kaydedici adresleme ile deitirilemez
mov

cs, ax

; kaynak genel amal kaydedici olmasna ramen bu ilem mmkn deildir!

Segment kaydedicileri programn icras aamasnda hafzann segment olarak adlandrlan blmlerinin adreslerini tuttuklarndan, bu
kaydedicileri verilerinizi saklamak veya tamak iin kullanmanz tavsiye etmem, kullanlmamaldrlar. Bunun yerine genel amal kaydedicileri
kullanmanz daha uygun olur.
8086 Hafza Adresleme Modlar
a- Acil Adresleme ( Immediate Addressing )
Herhangi bir genel amal veya indeks kaydedicisine dorudan bir deer ykleye bilirsiniz. Yklenecek olan veri kod segmentten alnacandan
bu tr kullanmlar ahsen ben pek tavsiye etmem. yi bir program organizasyonu iin, veriler hafzann ayr bir blmnde (mesela data
segmentte) deikenler veya sabitler olarak belirtilmelidir.
mov

al, 17

; ALye 11h yklenir.

b- Direkt Adresleme (Displacement Only Addressing )

Acil adreslemenin doru kullanlm eklidir. Bu adreslemede segment:ofset adresi kullanlarak hafzaya eriilir.
mov
mov
mov
mov

al, ds:12
ds:12, al
ax, ds:12
ds:12, ax

;
;
;
;

ds:000C adresinden 1 byte ALye kopyalanr.


ALnin ierii ds:000C adresine kopyalanr.
ds:000C adresinden 2 byte AXye kopyalanr.
AXnin ierii ds:000C adresinden itibaren kopyalanr (2 byte)

Aslnda kaynak kod hazrlanrken genelde bu ekilde bir kod yazm yaplmaz. Deikenler ve sabitler sembolik kelimelerle ifade edildiinden
buna gerek yoktur. Ne var ki debugger programlarnda da sembolik deiken isimlerini deil adresleri grrz. Aadaki kod parasn
inceleyin;
.data
sayi1

db 5

.code
mov ax, @data
mov ds, ax
mov
mov

al, sayi
al, ds:0000

; 5 deerini alye ykler.


; ayn ii yapar yani 5i ALye ykler.
; veriler tanmlanrken sayi1 db 5 eklinde deil de
; sadece db 5 yazlsayd, bu komutu kullanmak zorunda kalrdk.

c- Kaydedici Dolayl Adresleme ( Register Indirect Addressing )


Adnn kaydedici olduuna aldanmayn. Burada operand olarak kullanlan kaydedici keli parantez iine alnr ve bu andan itibaren bir offset
adresi oluverir.
mov

al, [bx]

mov
mov
mov
mov

al,
al,
al,
al,

; hafzadan ALye 1 byte tanr. Alnacak verinin offset adresi BXin deeridir.

[bx]
[si]
[di]
[bp]

Yukardaki 4 rnekte ALye kopyalanacak verilerin offset adresleri ilgili kaydedicinin iindeki deerdir. Segment adresleri ise ilk nn DS
sonuncusunun SSdir. BP indeks kaydedicisi yalnz bana hafza adreslemede kullanlrsa, daima stack segmentin (SS) offset adreslerin
gsterir. Fakat BP kaydedicisi de dahil olmak zere bu adresleme segment kaydedicileri de belirtilerek yaplrsa, o zaman ilgili segment:offset
adresine eriilmi olunur.
BX=0000, BP=0001, SI=0002, DI=0003 olduunu varsayalm;
mov
mov
mov
mov
mov
mov
mov
mov

al,
al,
al,
al,
al,
al,
al,
al,

cs:[bx]
[bx]
ds:[bp]
[bp]
ss:[si]
[si]
es:[di]
[di]

; ALye CS:0000dan kopyalama yaplr


; ALye DS:0000dan kopyalama yaplr
; ALye DS:0001den kopyalama yaplr
; ALye SS:0001den kopyalama yaplr
; ALye SS:0002den kopyalama yaplr
; ALye DS:0002den kopyalama yaplr
; ALye ES:0003den kopyalama yaplr
; ALye DS:0002dan kopyalama yaplr

d- ndeksli adresleme ( Indexed Addressing )


Kaydedici dolayl adreslemenin operandna sabit bir deer eklenmi halidir.
Kullanm ekli;
mov
mov
mov
mov

al,
al,
al,
al,

disp[bx]
disp[bp]
disp[si]
disp[di]

Not : disp ksaltmas ngilizcede displacement kelimesinin karldr. Buradaki anlam ise referans alnan ofset adresidir. Komut setlerinde
adresleme modlar aklanrken disp veya mem ksaltmas ile ok sk karlaacanzdan, komutlar yazarken ngilizce ifadeler kullanmak
durumunda kaldm.
Mesela BX=2000h olsun, mov dl, 20h[bx] eklinde bir komut kullanldnda, DS:2020h adresindeki 1 bytelk deer dlye kopyalanacaktr
Ayn ekilde BP=3030h olduunu varsayalm, mov dh,1020h[bp] gibi bir komut ile, SS:4050h adresindeki 1 bytelk deer dha kopyalanr.
Bu adresleme modunda da BP segment kaydedicisi daima SSin ofsetlerini gsterir. Fakat kaydedici dolayl adreslemede de olduu gibi bizzat
segment kaydedicisinide belirterek bu adresleme modunu kullanabiliriz. Bu durumda ofset adresleri komutta belirtilen segmentin ofseti olur.
mov
mov
mov
mov

al,
al,
al,
al,

ss:disp[bx]
es:disp[bp]
cs:disp[si]
ss:disp[di]

; BX normalde DSnin ofsetlerini gsterirken burada SSin ofseti olmu.


; BP normalde SSnin ofsetlerini gsterirken burada ESin ofseti olmu.
; SI normalde DSnin ofsetlerini gsterirken burada CSin ofseti olmu.
; DI normalde DSnin ofsetlerini gsterirken burada SSin ofseti olmu.

e- Taban ndeksli adresleme ( Based Indexed Addressing )


Bu adresleme modu da kaydedici dolayl adreslemeye ok benzer. Kullanm format aadaki gibidir;
mov
mov
mov
mov

al,
al,
al,
al,

[bx][si]
[bx][di]
[bp][si]
[bp][di]

BXin 0500h SInn 0360h olduunu varsayalm,


mov al,[bx][si]
gibi bir komut ilenince ALye kopyalanacak veri DS:0860 adresinden alnr.

Ayn ekilde;
BP=1598h DI=1004 ve mov ax,[bp+di] gibi bir komut ileniyorsa; AX, SS:259Ch ve SS:259Dh adreslerindeki veri ile yklenir.
SI ve DI kaydedicileri iin Intelin zel komutlar vardr, bu yzden bu kaydediciler genellikle programlamada indeks deerlerini tutar, arttrr
veya azaltrlar.
f- Taban ndeksli art direkt adresleme (Based Indexed Plus Displacement Addressing)
Bu adresleme modu taban indeksli adreslemeye 8 yada 16 bitlik sabit bir deerin eklenmi halidir.
mov
mov
mov
mov

al,
al,
al,
al,

disp[bx][si]
disp[bx+di]
[bp+si+disp]
[bp][di][disp]

BP = 1000h, BX= 2000h, SI= 0120h, DI = 5 olduunu varsayalm.


mov al,10h[bx+si]
mov ch,125h[bp+di]
mov bx,cs:2[bx][di]

; ALye DS:2130 adresindeki veri yklenir


; CHa SS:112A adresindeki veri yklenir
; CS:2007 adresinden itibaten 2 bytelk veri yklenir

TASM ve MASM n adresleme modlar iin esneklii.


TASM ve MASM assemblerlar indeksli, taban indeksli, ve taban indeksli art direkt adresleme iin deiik yazm ekillerini desteklerler;
ndeksli adresleme iin;
disp[bx] = [bx][disp] = [bx+disp] = [disp][bx] = [disp+bx]
Taban indeksli adresleme iin;
[bx][si] = [bx+si] = [si][bx] = [si+bx] ;
Taban ndeksli art direkt adresleme iin;
disp[bx][si] = disp[bx+si] = [disp+bx+si] = [disp+bx][si] = disp[si][bx] = [disp+si][bx] = [disp+si+bx] = [si+disp+bx] =
[bx+disp+si]
Yukarda yazlan bu 3 adresleme modundaki operandlar ayn ii yaparlar. MASM ve TASM "[ ]" sembollerine "+" operatr gibi davranr. ( disp
[bx][si] = disp[bx+si] rneinde olduu gibi )
8086 Adresleme Hafza Adresleme Modlarn Hatrlamak in Kolay Bir Yol:
8086 ilemcisi iin toplam 17 adet adresleme modu mevcuttur. Bunlar disp, [bx], [bp], [si], [di], disp[bx], disp[bp], disp[si], disp[di], [bx]
[si], [bx][di], [bp][si], [bp][di], disp[bx][si], disp [bx][di], disp[bp][si], and disp[bp][di] adresleme modlardr. Aadaki ekil, bu 17
adresleme modunu ezberlemeniz yerine kolayca hatrlamanza yardmc olacaktr.

ekil 1 - 8086 adresleme modlar iin yardmc ekil.


Bu ekil ile 17 adresleme modunu kolayca grebilirsiniz. Her stundaki elemanlar teker-teker seebilirsiniz veya herhangi bir stunu geip
dier iki stunun birleimi ile doru bir adresleme modu yakalayabilirsiniz.
rnekler;
Bir tek eleman sein;
disp, [bx], [bp], [si], [di]
3. stunu yok sayn ve dier elemanlarn birleimini kartn
disp[bx], disp[bp]
2. stunu yok sayn ve dier elemanlarn birleimini kartn
disp[si], disp[di]
1. stunu yok sayn ve dier elemanlarn birleimini kartn
[bx][si], [bx][di], [bp][si], [bp][di]
Son olarak tm stunlarn birleimi ile aadaki geerli adresleme modlarn kolayca kartabilirsiniz.
disp[bx][si], disp [bx][di], disp[bp][si], disp[bp][di].
Not:Hafza adresleme modlarnda ayet hesaplanan etkin adres 0FFFFh deerinden byk olursa, CPU bu hesaplama sonucu oluan tamay
gz ard eder ve FFFFhe ekleneni 0 dan itibaren ekler. rnein BX=10h olsun ve mov al,0FFFFh[bx] komutu ilensin. Bu durunda AL
kaydedicisine ds:1000Fh adresindeki veri deil ds:000Fh adresindeki veri yklenir. (FFFFh+1h=0000, FFFFh+2h=0001,..
FFFFh+16h=000Fh)

Sonu:

8086 adresleme modlarn 2 blmde inceledik, ilk olarak kaydedici adresleme modlarn anlatmaya altm. Kaydedici adresleme de segment
kaydedicilerini kendi amalar dnda kullanmanz tavsiye edilmez, bu i iin yeterince genel amal ve indeks kaydedicisi var zaten.
Kark olan ksm ise hafza adresleme modlardr. Hafza adresleme modlarnda belirtilen operand daima bir offset adresini iaret eder, buna
etkin adres hesaplama da denir. Hafza adresleme modlarn unutmamanz iin sizlere kolay bir yol gstermeye altm. Adresleme modlarnn
isimlerinden ziyade kullanm formatlar nemlidir. Her komut her adresleme modunu desteklemez. Hangi komutun hangi adresleme modunda
kullanlaca komut setlerinden faydalanlarak bulunur.
Bugne kadar gerek internetten gerekse Trke assembly kitaplarndan yaptm aratrmalarda, Trke olarak yaynlanm ayrntl bir komut
seti bulamadm bu yzden ngilizce komut setlerinden faydalanyorum.
8086 instruction set veya x86 instruction set anahtar kelimelerini internetten aratacak olursanz karnza ynla komut seti gelecektir.
Genelde komut seti klavuzlar aadaki tablo gibidirler.
MOV - Move Byte or Word
Usage: MOV dest,src

Operands

Size
Bytes

Clocks
286

386

486

2
3
5
3
2

2
2
4
2
2

1
1
1
1
1

2
2-4
2-4
3-6
2-3

2-4

...
...
...

...
...
...

...
...
...

...
...
...

reg, reg
mem, reg
reg, mem
mem, imm
reg, imm
segreg,
reg16
segreg,
mem16

...
...
...

Tablo 1 - MOV komutu iin rnek tablo


Bu tabloda birinci stun MOV komutu ile kullanlacak operandn hangi adresleme modlarn desteklediini gsteriyor. rnein mem,imm
(displacement,immediate) acil adresleme yi desteklediini gsterir. reg,reg (register,register) kaydedici adreslemenin yaplabileceini,
segreg,reg16 (segment register, register 16 bit ) bir segment kaydedicisine 16 bitlik bir kaydediciden kopyalama ileminin yaplabileceini
gsterir.
Clocks stunu bu komutlarn ilemci tarafndan ka admda ilendiini (ilemcinin tipine ve hzna gre bu zaman birimi deiebilir), size
bytes stunu ise hafzada makine kodlarnn byte olarak kaplad alan gsterir. ou zaman assembly programclar programlarnn, ilenme
srecindeki nano saniyeleri ve hafzada kaplad alann byte dzeyinde nemi yoksa bu ksmlarla ilgilenmezler. Yani 1. derecede operands
stunu nemlidir ve ilgili komutu bu stunda belirtilen formatlarn dnda kullanamazsnz.
Son olarak x86 uyumlu hibir ilemci mem,mem eklinde yani hafzadan hafzaya dorudan bir adresleme modunu desteklemez, aslnda bu
gne kadar bunu destekleyen hi bir ilemci grmedim, zaten byle bir adresleme modunun desteklenmesi durumunda o sistem iin yaplan
programlarn kme olasl ok byktr.
80386 ADRESLEME MODLARI
80386 Kaydedici Adresleme (80386 Register Addressing)
80386 den itibaren, gnmzde kullandmz Pentium ilemcilerin 32 bitlik kaydedicileri vardr. 8086 adresleme modlarna ek olarak bu
ilemcilere de kaydedici adresleme yaparken bu 32 bitlik kaydedicileri de kullanabilirsiniz. Bu kaydediciler geen makalemizde bahsettiimiz;
eax, ebx, ecx, edx, esi, edi, ebp, ve esp kaydedicileridir.
kullanm format;
mov

eax, ebx

Not: ayet programnzda 32 bitlik kaydedicileri kullanacaksanz kaynak dosyas hazrlarken .386 talimatn kullanmanz gerekir.
80386 Hafza Adresleme (80386 Memory Addressing)
a- 80386 Kaydedici Dolayl Adresleme ( Register Indirect Addressing )
16 bitlik Gerek moda (Real Mode) 80386 ve st ilemcilerde programlama yapmanz offset adreslerinin 32 bit olaca anlamna gelmez.
Segmentlerin her zaman gerek moda 64Kb. olduunu unutmamak gerekir, bu yzden offset adresleri gerek modda 0...0FFFFh arasn
gsterir. Yani 64Kb. geecek ofset adreslerini gerek moda deil ancak korumal moda (Protected mode) kullanabilirsiniz. Fakat gerek moda
32 bitlik kaydedicileri hesaplamalarda kullanmanzda bir engel yoktur. 80386 kaydedici dolayl adreslemede kullanabileceiniz tm geerli
adresleme format aadaki gibidir.
mov
mov
mov
mov
mov
mov
mov
mov

al,
al,
al,
al,
al,
al,
al,
al,

[eax]
[ebx]
[ecx]
[edx]
[esi]
[edi]
[ebp]
[esp]

; DS in ofsetleri iin
; DS in ofsetleri iin
; DS in ofsetleri iin
; DS in ofsetleri iin
; DS in ofsetleri iin
; DS in ofsetleri iin
; SS in ofsetleri iin
; SS in ofsetleri iin

b- 80386 ndeksli, Taban/ndeksli, ve Taban/ndeksli/Direkt Adresleme modlar ( 80386 Indexed, Base/Indexed, and Base/Indexed/Disp
Addressing )
80386 ndeksli adresleme modu 32 bitlik bir kaydedici ile sabit bir deerin birleiminden meydana gelir. Taban indeksli adresleme modu iki
adet 32 bitlik kaydedicinin birleiminden ve taban indeksli art direkt adresleme modu ise bir sabit deer ile iki tane 32 bitlik kaydedicinin
birleiminden meydana gelir. Hibir zaman unutmamalsnz ki bu adresleme modlar ne kadar 32 bitlik olsa da, ayet 16 bitlik gerek moda

kullanlrlarsa eriebilecekleri ofset adresleri 16 biti geemez.


80386 taban indeksli hafza adresleme modlarnda taban adres ve indeks adresi diye iki tane terim kullanlr. Taban adresini ilk operand iken
indeks adresini son operand gsterir. Bu kural kaydedici ismi ne olursa olsun geerlidir. Fakat 8086 indeksli veya taban indeksli hafza
adresleme modlarnda, taban adresini sadece BX veya sabit bir deer gsterebilirken, indeks adreslerinide SI, DI, BP ve BX gsterebiliyordu.
80386 ve sonras ilemcilerde bulunan bu esneklik phesiz ki programclarn iini kolaylatrr.
Aada 80386 indeksli hafza adresleme modlar iin birka rnek grlyor;
mov
mov
mov
mov
mov
mov
mov
mov

al,
al,
al,
al,
al,
al,
al,
al,

disp[eax]
[ebx+disp]
[ecx][disp]
disp[edx]
disp[esi]
disp[edi]
disp[ebp]
disp[esp]

;ndeksli adresleme
;modlar.

;SS in ofsetleri iin


;iin.

Aadaki rneklerde ise 80386 taban indeksli adresleme modlar iin eitli rnekler grnyor. Bu rneklerde ilk kaydedici taban adresini
gsterirken, ikinci kaydedici ise indeks adresini gsterir. Tabi ki sonuta bu iki kaydedicinin iindeki deerler toplanarak etkin olan hafza
adresini iaret edecekler. Kaydedicilerin 32 bitlik olduunu dnecek olursanz 4GBlk hafzann istediiniz bir konumuna eriebilineceini de
grebilirsiniz (tabi ki korumal modda). Burada taban adresi olarak esp ve ebp kullanldnda SSdeki bir ofset adresini gstereceini
unutmayn. Bununla birlikte indeks adreslerini gsteren kaydedicilerin tr verinin hangi segmentten alnacana etkisi olmaz.
mov
mov
mov
mov
mov
mov
mov
mov

al,
al,
al,
al,
al,
al,
al,
al,

[eax][ebx]
[ebx+ebx]
[ecx][edx]
[edx][ebp]
[esi][edi]
[edi][esi]
[ebp+ebx]
[esp][ecx]

;Taban indeksli adresleme


;modlar.
;DS deki ofsetleri gsterirler.
;SS deki ofsetleri gsterirler.
;SS deki ofsetleri gsterirler.

Yukardaki adresleme modlarna sabit bir deer eklerseniz 80386 taban indeksli art direkt adresleme yapm olursunuz.
mov
mov
mov
mov
mov
mov
mov
mov

al,
al,
al,
al,
al,
al,
al,
al,

disp[eax][ebx]
disp[ebx+ebx]
[ecx+edx+disp]
disp[edx+ebp]
[esi][edi][disp]
[edi][disp][esi]
disp[ebp+ebx]
[esp+ecx][disp]

;Taban indeksli art direkt adresleme


;modlar.
;DS deki ofsetleri gsterirler.
;SS deki ofsetleri gsterirler.
;SS deki ofsetleri gsterirler.

80386 indeksli adresleme modlarnda sadece tek bir kstlama sz konusudur; esp kaydedicisini indeks kaydedicisi olarak kullanamazsnz ama
esp nin taban kaydedicisi olarak kullanlmasnn bir kstlamas yoktur.

c- 80386 lekli ndeksli Adresleme Modu (80386 Scaled Indexed Addressing Modes)
Programclkla az ok uraan arkadalar diziler konusu bilirler. Yukarda anlattm 3 adresleme modu ile dizilerin elemanlarna rahata
eriebilirsiniz. Fakat zellikle dizi ilemler iin bir adresleme modu aryorsanz 80386 lekli indeksli adresleme modunu kullanmak daha
akllca olur. Bu adresleme modu ile indeks kaydedicisini 1, 2, 4 veya 8 ile arparak dizilerin elemanlarna erimede daha esnek bir yap
salar.
Kullanm;
disp[index*n]
[base][index*n]
veya
disp[base][index*n]
"base" ve "index" 80386nn herhangi bir genel amal kaydedicisi olabilir. "n" ise 1, 2, 4 ve 8 deerlerini alabilir.
ebx = 1000h ve esi = 4, iin aadaki rnekleri inceleyelim;
mov
mov
mov

al,8[ebx][esi*4]
al,1000h[ebx][ebx*2]
al,1000h[esi*8]

;ds:1018h daki veriyi dan ALye kopyalar.


;ds:4000h daki veriyi dan ALye kopyalar.
;ds:1020h deki veriyi dan ALye kopyalar.

80386 ndeksli, Taban/ndeksli, ve Taban/ndeksli/Direkt Adresleme modlarn da 80386 lekli ndeksli Adresleme Modunun n deerinin 1
olduu adresleme modlar olarak dnebilirsiniz
mov
mov
mov

al, 2[ebx][esi*1] =
al, [ebx][esi*1]
=
al, 2[esi*1]
=

mov al, 2[ebx][esi]


mov al, [ebx][esi]
mov al, 2[esi]

MASM ve TASM 80386nn tm bu hafza adresleme modlarnn yazmnda deiik varyasyonlar kabul eder. Aadaki tm operandlar ayn ii
yaparlar.
disp[bx][si*2], [bx+disp][si*2], [bx+si*2+disp], [si*2+bx][disp], disp[si*2][bx], [si*2+disp][bx], [disp+bx][si*2]

Sonu:
80386 adresleme modlar 8086 adresleme modlarna nazaran programcya daha ok olanak saladndan daha ok tercih edilirler. Benim
ahsi grm X86 uyumlu PCler gerek gcn 80386 ilemcisi ile birlikte gelen bu olanaklardan almlardr. Zaten CPU tarihinde 80386 bir
devrin kapanp dier bir devrin balad nokta olarak kabul edilir. Ne var ki 8086 adresleme modlar 80386 adresleme modlarna nazaran
daha hzl alrlar. Bu yzden sz konusu olan hz ise (mikro saniyelerden bahsediyoruz ki bunlar bazen birleip dakikalar oluyor) adresleme
modu seilirken ok dikkat edilmesi gerekir.

80386 taban indeksli ve taban indeksli art direkt adresleme modlar, lei 1 olan (n=1) 80386 lekli ndeksli Adresleme Modu olarak
dnlebilir ve bu hafza adresleme modlarnda gsterilen ilk kaydedici taban ikinci kaydedici indeks adresini gsterir. Taban adresini
gsteren kaydedici ebp veya esp ise bu adresleme SSdeki bir ofset adresine dier kaydediciler taban adresi olarak seildiinde DS deki bir
ofset adreslenmi olunur. lk yazlan kaydedici lekli olarak gsterilirse ("*n") bu bir taban adresi olmaktan kar bir indeks adresi olur.
Ayrca operanda segment kaydedicisini de gstererek adresleme modunu zorlayabilirsiniz.

[ebx][ebp]
[ebp][ebx]
[ebp*1][ebx]
[ebx][ebp*1]
[ebp][ebx*1]
[ebx*1][ebp]
es:[ebx][ebp*1]

;DSnin ofsetini gsterir.


;SSnin ofsetini gsterir.
;DSnin ofsetini gsterir.
;DSnin ofsetini gsterir.
;SSnin ofsetini gsterir.
;SSnin ofsetini gsterir.
;Zorlanm,ESnin ofsetini gsterir.

imdi sra uygulamada. Bu uygulama ile hem adresleme modlarn hem de Turbo Debugger programnn kullanmn aklamaya alacam.

TITLE Adresleme Modlar (admod.asm)


;########################################
;# Bu program 8086 ve 80386 adresleme modlarnn
#
;# iyi kavranmas iin yazlmtr.
#
;# Son Gncelleme: 17/04/05
#
;# Yazan --> Eren ERENER
#
;########################################
.MODEL
.STACK
.DATA

SMALL
32

VerilerByte
VerilerWord
VerilerDoubleWord
12345678h

DB
DW
DD

5h, 17h, 8Dh, 0AFh


1234h, 7h, 0C01Dh
3DF0178Ah, 11223344h,

.CODE
ANA

PROC

MOV
MOV

AX, @DATA
DS, AX

; Data segment
; ayarlanyor.

MOV
MOV

AX, 5566h
BX, AX

; Acil adresleme.
; Kaydedici adresleme.

;---------------------------------------;8086 Hafza Adresleme Modlarna rnekler


;---------------------------------------MOV

DX, DS:0000h

; Direkt adresleme.

MOV
BX, 0000h
MOV
AL, [BX]
; Kaydedici dolayl
adresleme, DS:0000h adresindeki 5h deeri ALye kopyalanr.
MOV
AL, 3[BX]
; ndeksli adresleme,
DS:0003h adresindeki AFh ALye yklenir
MOV
AL, 3[VerilerByte] ; Yukardaki ile ayn ii
yapar,
; zaten assembler VerilerByte
deiken ismini ds:0000h olarak evirecektir.
MOV
SI, 0
; SI = 0 oldu.
MOV
AL, [BX][SI]
; zaten BX=0d, u anda
ALye kopyalanacak deer DS:0000hdaki 05htr.
INC
SI
; SIy 1 arttrdk,
MOV
AL, [BX][SI]
; imdi ALye kopyalanacak
deer DS:0001hdaki 17htr.
INC
SI
; SIy,
INC
SI
; 2 arttrdk, imdi SI=3
oldu.
MOV
AL, [BX][SI]
; imdi ALye kopyalanacak
deer DS:0003hdaki AFhtr.
; Burada BX taban SI indeks
kaydedicisi oldu.
MOV
AL, [BP][SI]
; DS deil SS in offsetlerini
adresler, u anda Stack Segmentin iinde ne olduunu
bilmiyoruz!!!
;Taban indeksli art direkt adresleme
MOV
SI, 0
; SI=0 oldu.
MOV
AX, 4[bx+si]
; BXi deitirmediimizden
hala sfr ve AXe getirilecek 2 bytelk veri ds:0004h adresinden
alnacak,
; nk 4+0+0 = 4tr. Bu
adres VerilerWord deikenin adresidir ve bu adreste 1234h
vardr.
INC
SI
; SI,
SI
; 2 kere arttrlyor ve,
INC
MOV
AX, 4[bx+si]
; VerilerWord dizisinin 2.

elemanna eriiliyor.
; nk 4+0+2 = 6dr. Bu
adreste 0007h vardr.
;---------------------------------------;80386 Hafza Adresleme Modlarna rnekler
;---------------------------------------.386
; 80386 adresleme
modlarn ve 32 bitlik kaydedicileri kullanmak iin bu direktifin
yazlmas gerekir!!!
MOV
ESI, 0
ayarland.
SUB
EBX, EBX
(Subtract) yani kartma komutu,

; ndeksi 1 olarak

;
ayn ii fakat daha hzl yapar.
MOV
AX, 4[ebx][esi*2]
adresleme modu ile VerilerWord dizisinin
AXe kopyaland.
INC
ESI
MOV
AX, 4[ebx][esi*2]
adresleme modu ile VerilerWord dizisinin
AXe kopyaland.

; ebx = 0 yapld. SUB


burada "MOV ebx, 0" ile
; 80386 lekli indeksli
1. eleman (1234h)
; 80386 lekli indeksli
2. eleman (0007h)

LEA
EAX, VerilerDoubleWord ; LEA komutu (Load
Effective Address) VerilerDoubleWord dizisinin balang adresini
EAXe kopyalyor,
; 80386 kaydedici adresleme
SUB
EBX, EBX

; EBX = 0 oldu.

; 80386 taban indeksli adresleme.


MOV
ECX, [EBX][EAX]
; ve bu dizideki ilk
eleman (3DF0178Ah) ECXe kopyalanyor.
MOV
INT

AH,4CH
21H

ANA

ENDP

;DOSa
;dn

END ANA

Yukardaki program sadece 8086 ve 80386 adresleme modlarna rnek olmas iin hazrlanmtr. Hafzadaki veriler nasl eriilir sorusuna yant
arayanlarn bu program dikkatle ve satr-satr incelemesini tavsiye ederim.
Sra bu program derledikten sonra Turbo Debugger ile ap hafzada ve ilemcide hangi olaylarn olduunu incelemeye geldi. Turbo Debugger
programnn 16 ve 32 bitlik hafzay incelemek iin iki ayr versiyonu var u anda gerek modda alan programlar hazrladmzdan dolay 16
bitlik srmn kullanacaz. Program buradan indirebilirsiniz. ndireceiniz bu dosya Turbo Debugger, Turbo Assembler, Turbo Linker
paketini iermekte. Ayrca bu pakete, iinizde belki hala DOS veya Windows 95 kullanan vardr diye bir mouse program ekledim. ayet durum
byleyse nce konsola "mouse" yazdktan sonra Turbo Debugger altrn.
Turbo Debugger Microsoftun debug ile ayn ii yapar fakat daha kullanl bir kullanc ara yzne sahiptir. Turbo Debugger ile program
dosyalarnz atktan sonra bir ok ilem yapabilirsiniz.
Not: Turbo Debugger pencere modunda altrrsanz GDI (Graphics Device Interface) kaynaklarn smrrcesine kullandndan
bilgisayarnz yavalayabilir. Bu yzden tam ekran modunda balatmanz neririm. Program pencere modunda balattktan sonra konso
penceresinin ayarlarndan tam ekran yapmanzn da bir faydas olmaz. Bu yzden nce komut istemini an, sonra tam ekran yapn ve Turbo
Debuggeri altrn.
Turbo Debugger kullanmna ilikin birka ipucu:
lk olarak konsola "td" yazarak program altrn. Turbo Debuggern ekranna ulaacaksnz.

ekil 2 - Turbo Debugger ekran.


Turbo Debugger ekran 5 blmden oluuyor. ekildeki 1, 2 ve 3 nolu ksmlar hafzay incelemek iin kullanlrlar. 4. ksm mikroilemc
kaydedicilerini ve 5. ksmdada yine mikroilemci kaydedicilerinden olan flag register bitsel olarak grebilirsiniz. Genellikle 1. blge program
oluturan kodlar, 2. blgede verilerin incelenmesi iin kullanlr. 3. blgeyi yn hafzay gzlemlemek iin kullanabilirsiniz.
Turbo Debugger aldktan sonra "File" mensnden derlediiniz program dosyasn ap kodlarn inceleyebilirsiniz. Program dosyanz atktan

sonra "Program has no symbol table" diye bir mesaj gelebilir. Bu mesaj penceresinde "OK" e tklayp almaya balayabilirsiniz.

ekil 3 - Turbo Debugger ile dosya ama.


Ayrca menlerden srasyla View/Another/File seeneklerini tklayarak baka bir dosyay dier bir pencerede aabilirsiniz. (Mesela kaynak
dosyasn)

ekil 4 - Turbo Debugger ile ayn ekranda kaynak dosyanz da grebilirsiniz.


ayet bu pencerede yaz yerine hex kodlar grrseniz, pencerenin zerine sa tklayp alan menden "Display As" sein.
Program altrma seeneklerini "Run" mensnden seebilirsiniz. F8 tuu program adm adm iletmek iin kullanlr, F7 ise adm-adm
program ilenirken dngleri incelemenizi salar. Program adm-adm ilenirken mavi bir ubuk o anda hangi komutun ileneceini gsterir.
Ayn ekranda ilemcinin kaydedicilerinin nasl deitiini gzlemleyebilirsiniz. Deiiklie urayan kaydediciler beyaz grnr. Programn
tekrar altrmak iin "Run" mensnden "Program Reset" seeneini seebilirsiniz.

ekil 2 - Program adm-adm ileniyor.


Verilerinizi grmek iin 2. pencereye sa tklayp "goto" yu sein. Alan pencereye grmek istediiniz adresi yazn.

ekil 2 - Turbo Debugger ile hafza pencerelerini kullanma.


Yalnz .exe tipindeki program dosyalarnda verilerinizi grebilmek iin mov ax,@data ve mov ds,ax satrlarnn ilenmi olmas gerekir.
Programnz satr-satr ilenme srecinde, adresleme yaplan bir komutun ilenmesi annda kod penceresinin sa st kesinde hafzann hangi
blgesine eriildii grlebilir. Bu makalemizdeki program incelerken bu zellii ska kullanmanz gerekecek.

ekil 2 - Turbo Debugger ile adresleme modlarnn ilevleri rahata grlebilir.


Mesela yukardaki ekilde mov al, [BX] komutu ileniyor ve kaydedici dolayl hafza adresleme yaplyor. Burada AL kaydedicisine
kopyalanacak olan veriyi "ds:0000 = 05" eklinde grebilirsiniz.
32 bitlik kaydedicileri grmek iinse kaydedicileri gsteren ksma (4. ksm) sa tklayp "Registers 32 bit" i seebilirsiniz.
Turbo Debuggern daha bir ok zellii var ama u anda bizlere bu kadar yeter. imdi sizler Turbo Debugger ile bu makaledeki program
inceleyerek pratik yapn, ayrca bu gne kadar yazdmz programlar da Turbo Debugger ile inceleyerek program kullanmasn daha iyi
kavrayn.
Bir sonraki makalemizde veri tipleri ve x86 komutlarn inceleyeceiz. Daha sonra prosedr ve makrolarda grdkten sonra nihayet kendi
programlarnz yazabilir seviyeye geleceksiniz. Genelde sizlerden makalelerin daha sk aralklarla yaynlanmas ile ilgili mailler alyorum. Fakat
bir makale hazrlamak en az 1 haftam alyor ve niversitedeki derslerden ve ilerden dolay ok az vaktim oluyor. Bu yzden makalelerimin
yaynlanma aral birden 20 gne srayabiliyor. Hal byleyken sizlerin aray soutmamak iin baka kaynaklardan faydalanmasn tavsiye
ediyorum. Bu ekilde alan baz arkadalar internetten kaynak kod bulup, derleyip takldklar yerlerde bana mail atyorlar, bunlara cevap
vermesi daha az zamanm alyor ve sizler iinde ok faydal olacandan eminim. ayet ngilizce okuduunuzu anlyorsanz sizlere Art of
Assemblyyi tavsiye ederim. nternetten okuyabileceiniz bedava bir kitap. Mesela bu makaleyi yazarken bu kaynaktan ok yararlandm ve
sizlere de tavsiye ederim.
Evet yine geldi ayrlk vakti. Sizlere bol assemblyli gnler dileyerek huzurlarnzdan ayrlyor ve bir sonraki makalede grmek dileiyle esen
kaln diyorum. (TV program sunucusu olabilirdim aslnda :))
Yazar: Eren Erener

You might also like