Professional Documents
Culture Documents
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
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
cx, al
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
Bu ii yapmak iin,
mov
mov
ax,cs
ds,ax
cs, ax
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
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
;
;
;
;
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
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]
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]
al,
al,
al,
al,
[bx][si]
[bx][di]
[bp][si]
[bp][di]
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]
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
...
...
...
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
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.
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]
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]
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]
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]
=
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]
imdi sra uygulamada. Bu uygulama ile hem adresleme modlarn hem de Turbo Debugger programnn kullanmn aklamaya alacam.
SMALL
32
VerilerByte
VerilerWord
VerilerDoubleWord
12345678h
DB
DW
DD
.CODE
ANA
PROC
MOV
MOV
AX, @DATA
DS, AX
; Data segment
; ayarlanyor.
MOV
MOV
AX, 5566h
BX, AX
; Acil adresleme.
; Kaydedici adresleme.
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.
LEA
EAX, VerilerDoubleWord ; LEA komutu (Load
Effective Address) VerilerDoubleWord dizisinin balang adresini
EAXe kopyalyor,
; 80386 kaydedici adresleme
SUB
EBX, EBX
; EBX = 0 oldu.
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.
sonra "Program has no symbol table" diye bir mesaj gelebilir. Bu mesaj penceresinde "OK" e tklayp almaya balayabilirsiniz.