Professional Documents
Culture Documents
80x86 Assembly Version
80x86 Assembly Version
80X86 Sembolik
Makina Dili
( 80X86
Assembly Language )
Neden Sembolik Makina Dili renilmelidir?....................................................................9
Mikroilemcilerin alma Biimleri ..................................................................................9
Tipik Bir RAMin Yaps..................................................................................................10
CPU ile RAM Arasndaki Balant ...................................................................................10
Makina Komutu Kavram .................................................................................................11
Makina Komutlarnn Genel Biimi..................................................................................11
80x86 Mikroilemcisinin alma Modlar .......................................................................12
8086 lemcisinin Yazma Yaps.....................................................................................12
80386 ve Yukar Modellerin Register Yaps ....................................................................14
Makine Komutlarndaki Bellek Operandlar .....................................................................15
16 Bit almada Bellek Operandnn Oluturulmas ........................................................16
16 Bit Adresleme lemi ...................................................................................................18
32 Bit Adresleme lemi ...................................................................................................19
32 Bit Bellek Operandnn Oluturulmas .........................................................................20
16 Bit almada Flag Register ......................................................................................20
CF(Carry Flag) .............................................................................................................20
PF(Parity Flag) .............................................................................................................21
AF(Auxilary Carry Flag) ..............................................................................................21
ZF(Zero Flag)...............................................................................................................21
Kaynaklar:
Peter Abel 80x86 Assembly Language
The Art of Assembly Language
Microsoft Macro Assembler 5.0 ve 6.0
Dierleri
Assembler'da program yazabilmek iin en azndan bir Assembler derleyicisi ve bir de
linker program gereklidir. Borland firmasnn assembler derleyicisi TASM.EXE dosyas,
linker program ise TLINK.EXE programdr. Microsoft assembler derleyicisi ise
MASM.EXE, linker program ise LINK.EXE programdr. Ayrca bir assembler programnn
incelenmesi amacyla "debugger" programlar kullanlr. Borland firmasnn TD.EXE
Microsoft firmasnn CV.EXE programlar vardr.
Assembler (Sembolik Makine Dili) tanabilir genel bir dil deildir. Tamamen
Mikroilemciye bal olarak deiir.
Neden Sembolik Makina Dili renilmelidir?
1) Zaman ve kapasite problemi olan kritik kodlarn makine dili seviyesinde yazlmas
gerekebilir.C bu tr kodlar iin yksek seviyeli kalmaktadr.
2) Aa seviyeli programlama bilgisi bilin dzeyini artrr. Bylece problemlerin nedenleri
daha iyi anlalr.
Mikroilemcilerin alma Biimleri
Mikroilemci, bellekle 3 grup u yoluyla baldr.
C
P
U
..........
..........
.........
R
A
M
10
Genel olarak CPU'nun adres ular RAM'in adres ularyla, data ular da RAM'in data
ularyla balantldr. Benzer biimde CPU'nun kontrol ular RAM'in eitli kontrol
ularyla balantldr.
Bir CPU'nun adresleyebildii maksimum fiziksel RAM kapasitesi vardr. Bu kapasite
CPU'nun adres ularnn saysyla dorudan ilgilidir. rnein Z-80 ve 8080 ilemcilerinin 16
adres ucu vardr. Bu ilemciler ancak 64 KB bellek kullanabilirler. Intel 286 ilemcisinin 24
adres ucu, 386 ve 486 ilemcilerinin 32 adres ucu vardr. lemcinin RAM'den bir seferde
transfer edecei bilgi veri data ularnn saysna baldr. Z80 ve 8080 ilemcileri 8, 8086 ve
80286 ilemcileri 16, 386 ve 486 ilemcileri 32 data ucuna sahiptir.
CPU ierisindeki elektronik devrelerle balantl olan RAM'den ekilen bilginin geici
sre saklanmasnda kullanlan CPU ierisindeki kk bellek blgelerine register denir. Bir
mikro ilemcinin ka bitlik mikro ilemci olduu register uzunluu ile belirlenir. rnein
80386 ilemcisi 32 bitlik bir ilemcidir, nk 32 bit register'lara sahiptir. Bir mikro
ilemcinin register uzunluu ilemcinin bir hamlede ka bitlik bilgi zerinde ilem
yapabildiini anlatr. rnein 8086 16 bitlik bir mikro ilemcidir. 32 bit iki say toplanacak
olsa bu toplama ilemi tek ilemde deil ancak iki ilemde yaplabilir(C'de int tr derleyiciyi
yazanlar tarafndan genellikle ilemcinin register uzunluu kadar alnr).
Makina Komutu Kavram
Mikroilemci her ilemi bir makina komutuyla yapar. Makina komutu ilemciye hangi
ilemin yaplacan anlatan byte topluluudur. Intel ilemcilerinde makina komutlarnn byte
uzunluklar farkl olabilmektedir. Her mikroilemcinin bir komut kmesi vardr. Btn
program bu komutlarla ifade edilmek zorundadr. Makina komutlarnn says CISC ailersi
mikroilemcilerde, RISC ailesi mikroilemcilerine gre daha fazla ve eitlidir.
Makina Komutlarnn Genel Biimi
Her makina komutu gerekte ikilik sistemde bir byte topluluudur. Ancak sembolik
makina dilinde saylar yerine sembolik ifadeler kullanlarak gsterilirler. Zaten sembolik
makina dili derleyicilerinin yapt ey genelde sembolik olarak yazlm olan bu komutlar
saylara dntrmektir. Bir makina komutu hangi ilemin yaplacan anlatan bir ilem
bilgisi ve operandlardan oluur. Makina komutlar tek operandl ya da iki operandl olabilirler.
Makina komutlarnn genel biimi yledir:
Komut operand
Komut operand1, operand2
rnein:
INC AX
ADD AX, BX
Intel ilemcilerinde tek operandl komutlarda operand register'a ya da bellee ilikin
olabilir. ki operandl komutlarda her iki operand da bellee ilikin olamaz. Operandlardan
herhangi birisi bellee dieri register'a ilikin olabilir. Operandlardan her ikisi de register'a
ilikin olabilir. Baz makina komutlarnn operand yoktur. Bu komutlardan bazlar default bir
takm register'lar operand olarak kullanrlar. zetle makina komutlar :
11
Ya operandsz olur,
Ya tek operandl olur,
Ya da iki operandl olur.
ki operandl komutlarda her iki operand da bellee ilikin olamaz.
Genel olarak bir operand register'a, bellee ya da sabite ilikin olabilir. ki operandl
komutlarda bir operand bellee ilikinken, dier operand bir sabite ilikin olabilir. Sonu
olarak Intel ilemcilerinde komutlarn rastlanabilen biimleri unlardr:
Komut
Komut sabit
Komut reg
Komut mem
Komut reg, mem
Komut reg sabit
Komut reg, reg
Komut mem, reg
Komut mem, sabit
80x86 Mikroilemcisinin alma Modlar
80x86 mikroilemcisinin alma modu vardr.
1. Gerek Mod (Real Mode)
2. Sanal86 Mod (Virtual 86 Mode)
3. Korumal Mod (Protected Mode)
80x86 ilemcileri reset edildiinde alma gerek modda balar. Korumal moda gerek
moddan yazlm yolu ile geilmektedir. 8086, 8088, 80186 ilemcileri sadece gerek moda
alabiliyordu. 80286 ilemcisii gerek mod ve korumal modlarda alabilmektedir. 80386
ve sonras bu modu destekelemektedir. 80X86 ilemciler gerek modda ok kk
farkllklar dna hzl bir 8086 gibi almakatadr. DOS iletim sistemi gerek modda
alabilecek biimde tasalanmtr. 8086 ilemcisi 1 MB bellek kullanabilen 16 bit bir
mikroilecidir. Bu nedenle gerek modda ancak 1 MB bellek kullanlabilir. Korumal mod
koruma mekanizmasnn, sanal bellek kullanmnn, ok ilemli almann, mmkn olduu
en ileri alma modudur. UNIX ve Windows sistemleri korumal modda almaktadr. Sanal
86 Modu 8086 gibi almann saland ancak korumal modun eitli zelliklerinin
kullanlabildii bir ara moddur. Windows iletim sisteminde komut satr Sanal 86 Modunda
almaktadr nki Windows iletim sisteminde kullanlan taskswitch mekanizmasnda
Gerek Mod kullanlamamaktadr. Windows iletim sisteminde DOS penceresi aldnda
yada herhangi bir DOS program altrldnda ilemci Sanal 86 moduna gemektedir.
Ancak iletim sisteminin alnda F8 tuuna baslarak Sadece Komut stemi seenei
seildiinde Gerek Modda alma szkonusu olur.
8086 lemcisinin Yazma Yaps
8086 mikroilemcisi toplam 14 yazmaca sahiptir.
4 adet genel amal yazma vardr
12
AX(Accumlator Register),
BX(Base Register)
CX(Count Register)
DX(Data Register)
Bu yazmalar btn olarak 16 bit biiminde kullanlabilir yada dk ve yksek anlaml
ksmlar bamsz 8 bitlik yazmalar gibi de kullanlabilir. Yani 12 adet yazma ifadesi
yazlabilir. 8 bitlik paralar btn oluturur. Yani rnein AH ve AL yazmalarna ykleme
yapldnda AX yazmac oluturulmutur.
2 adet index yazmac vardr.
SI(Source Index Register)
DI(Destination Index Register)
Bu iki yazma 8 bitlik paralara blnmemitir. Data blgesini indekslemek amacyla
kullanlr.
3 Adet Gsterici Yazmac Vardr (Pointer Register)
IP(Instruction Pointer Register)
SP(Stack Pointer Register)
BP(Base Pointer Register)
4 Adet Segment Yazmac Vardr
CS(Code Segment Register)
DS(Data Segment Register)
SS(Stack Segment Register)
ES(Extra Segment Register)
1 Adet Bayrak Yazmac Vardr
F
Btn yazmalar 16 bit uzunluundadr ancak sadece genel amal yazmalar ayrca paralara
ayrlmlardr.
Her komut her yazma ile altrlamayabilir. Aritmetik ilemler, karlatrma ilemleri yada
bit ilemleri iin Genel Amal Yazmalarn hepsi kullanlabilir. SI ve DI yazmalar
indeksleme amacyla tasarlanm olmalarna karn Genel Amal Yazmalarla ayn ilemlere
kullanlabilirler.
Aritmetik, karlatrma ve bit ilemleri 16 bit ise AX, BX, CX, DX, SI, DI yazmalaryla
yaplabilir. Ayn ilemler 8 bit yaplacak ise AH, AL, BH, BL, CH, CL, DH, DL yazmalar
kullanlabilir.
Kural 2 operandl bir makina komutunun sonular her zaman soldaki operand bozularak onun
ierisine yazlr. Tek operandl makina komutunun sonular operand ierisindeki deer
bozularak yazlmaktadr. rnein:
ADD AX, BX
ileminde sonu AX yazmacna yazlacaktr. Yada rnein:
13
ADD MEM, AX
ileminde MEM ile belirtilen bellek blgesindeki bilgi ile AX yazmac ierisindeki bilgi
toplanr sonu MEM ile belirtilen bellek blgesine yazlr. Yada rnein
INC AX
Sonu operand zerine yazlr.
80386 ve Yukar Modellerin Register Yaps
80386dan itibaren gemie uyum korunarak registerlar 32 bite ykseltilmitir. 80386
ve sonraki modellerin pek ok register vardr. Ancak bu registerlarn ou korumal mod ile
ilgilidir. Bu modellerde asl ilevsel olan registerlar 8086 ilemcisindekilerin geniletilmi
biimleridir.
-
Bu durumda rnein EAX register btn olarak EAX biiminde, 16 bit AX biiminde
ya da 8er bitlik AL ve AH biiminde kullanlabilir. Bu registerlarn yksek anlaml 16
bitleri bamsz olarak kullanlamamaktadr.
-
14
Segment registerlar 16 bit olarak kalmtr, FS ve GS isimli iki segment register daha
eklenmitir.
Bir makine komutunda sabit saylar dorudan bellek operandlar ise keli parantez
ierisinde gsterilirler. rnein:
MOV AX, 100
100 bir sabittir. Bu komut 100 saysnn AX registerna atanacan belirtir. Oysa
MOV AX, [100]
100 numaral bellek blgesindeki bilginin AX registerna atanacan belirtir. Mikroilemci
register bellek ilemlerinde bellekten ne kadar bilginin transfer edileceini register operandna
bakarak anlar. rnein:
15
biiminde verilseydi, register operand 1 byte olduu iin yalnzca 100 numaral bellek
blgesindeki bilginin AL registerna atanaca anlamna gelir.
Intel ilemcileri Little Endian notasyonunu kullanr. Yani saysnn dk anlaml
byte deeri dk anlaml adreste bulunur. rnein:
MOV AX, [100]
1.
2.
3.
4.
5.
6.
7.
[disp16]
[BX], [BP], [SI], [DI]
[BX + disp8], [BP +disp8], [SI+ disp8], [DI +disp8]
[BX + disp16], [BP +disp16], [SI+ disp16], [DI +disp16]
[BX + SI], [BX + DI], [BP + SI], [BP + DI]
[BX + SI + disp8], [BX + DI + disp8], [BP + SI + disp8], [BP + DI + disp8]
[BX + SI + disp16], [BX + DI + disp16], [BP + SI + disp16], [BP + DI + disp16]
16
4.
5.
6.
7.
[disp8]
[disp16]
[AX + BX]
[BP + SI]
[SI + DI + disp16]
[BX]
[BX + DX]
[BX + SI + disp16]
Geersiz
Geerli
Geersiz
Geerli
Geersiz
Geerli
Geersiz
Geerli
Cde
Assembler karl
int a;
int *p;
p = &a;
*p = 100;
MOV p, &a
MOV BX, p
MOV [BX], 100
Her bellek operandnn default bir segment register vardr. BX, DI, ve SI
registerlarnn default segment register DS, BP registernn SSdir. ki register toplamnda
eer toplamda BP register bulunuyorsa BPnin default register olan SS toplam bellek
operandnn segment register olur. zetle:
1. BX, SI, DI tek balarna ya da disp8, disp16 toplamlaryla bulunduunda default segment
register DSdir.
2. BP tek bana ya da disp8, disp16 toplamlaryla bulunduunda default segment register
SSdir.
3. Base, index ve disp8, disp16 toplamlarnda eer toplamlardan bir BP register ise default
segment register SSdir. Yoksa DSdir.
4. [disp16] operandnn segment register DSdir.
rnein:
lem
[BX]
[BP + SI]
[SI + disp16]
[disp16]
[SI + BX]
17
ilemi sonucu AX registerna 1234 * 16 + 1000 = 13340 fiziksel adresindeki veri yerletirilir.
Grld gibi istenilen bir fiziksel adrese eriebilmek iin yalnzca keli parantez
18
ierisindeki offseti ayarlamak yetmez. lgili segment registern ierisinde de uygun deerin
olmas gerekir. rnein:
SS = 138F
BP = 1000 ise
MOV AX, [BP + 10]
stenilen fiziksel adrese erimek iin ters bir ilem yapmak gerekir. Yani:
1. Fiziksel adres segment-offset iftine ayrtrlr. Bir fiziksel adres iin pek ok segmentoffset ifti yazlabilir.
2. Segment deeri bir segment registerna yazlr. Offset deeri keli parantez ierisinde
bellek operand biiminde oluturulur.
32 Bit Adresleme lemi
80386 ve sonras 32 bit ilemcilerdir. Bu ilemcilerde 32 bit registerlar vardr ve
bellek operandlar yani keli parantez ierisindeki deer 32 bit olabilir. 32 bit registerlar bu
ilemcilerde yalnzca korumal modda deil, gerek modda ve sanal 86 modda da
kullanlabilmektedir. Tabii 32 bit registerlarn kullanld bir DOS program 8086
ilemcisinin bulunduu bir makinede almaz. Yani bir DOS programnda 32 bit
hesaplamalar yapabilmek iin EAX, EBX gibi registerlar kullanlabilir. Ancak program yine
bir DOS programdr. rnein yine 1 MB bellek kstlamas vardr. 80386 ve sonraki
modellerde ve korumal modu kullanan bir iletim sistemiyle allyorsa tam ve rahat bir 32
bit almay gerekletirebiliriz.
32 bit bellek adreslemesinde keli parantez ierisindeki deer 32 bit olabilir. Tabii
DOS sistemi iin yani gerek mod ya da sanal 86 modu iin bu ilemin bir faydas yoktur.
Tabii korumal modda bu eit bir adresleme kullanlmaktadr.
19
Geerli
Geersiz
Geerli
Geersiz
Geerli
Geersiz
Geerli
Geerli
16 Bit almada Flag Register
14
-
13
-
12
-
11
OF
10
DF
9
IF
8
TF
7
SF
6
ZF
5
-
4
AF
3
-
2
PF
1
-
0
CF
CF(Carry Flag)
Bu flag aritmetik, bit ve mantksal ilemlerde saynn btnne ilikin bir elde
olutuunda 1 yaplr. rnein:
AL: 13
20
BL: F2
ADD AL, BL
Burada bir toplama yaplmtr. Ancak sonu 1 byte amtr. Bu durumda ilemci CF bitini
set eder.
PF(Parity Flag)
Bir ilem sonrasnda dk anlaml byte ierisindeki 1lerin says ift ise bu bit set
edilir, tek ise reset edilir(Bu ynteme odd parity yntemi denir).
AF(Auxilary Carry Flag)
Drdnc bitten beinci bite doru oluan elde durumunda set edilir. Elde yoksa
reset edilir. zellikle BCD(binary coded decimal) ilemleri iin dnlmtr. HEX
sistemde dnldnden dk anlaml hex digitteki eldeyi belirtir. rnein:
AL:18
BL: 1C
ADD AL, BL
ileminde CF 0, AF 1 olur.
ZF(Zero Flag)
lemin toplam sonucu 0 ise bu flag set edilir, deilse reset edilir. rnein:
SUB AX, BX
ileminde iki registern deerleri eitse sonu 0 olaca iin ZF set edilir.
SF(Sign Flag)
lem sonucunda elde edilen saynn en solundaki biti bu flage yanstlr. rnein:
ADD AX, BX
ilemi sonucunda SF 1 ise s AX ierisinde negatif bir say vardr. SF 0 ise pozitif bir say
vardr.
TF(Trap Flag)
lemci her komutu altrdktan sonra bu flagin durumuna bakar. Eer bu flag set
edilmi ise 1 numaral isel kesmeyi arr. Bu kesmeye tek adm kesmesi(single step
interrupt) denilmektedir.
IF(Interrupt Flag)
lemcinin INT ucu uyarldnda ilemci kesme durumuna gemeden nce bu flage
bakar. Eer bu flag 1 ise(normal olarak 1dir) kesme kabul edilir. Bylece ilemci ACK
ucunu aktive ederek bunu bildirir. Eer bu flag 0 ise ilemci kesmeyi grmezlikten gelir,
21
kesme koduna dallanmaz, ilemine devam eder. ok ilemli bir iletim sisteminde bu flagin 0
yaplmas tm sistemi kertebilir. nk donanm kesmeleri devre d brakldnda
processler aras gei ilemi de durur. Adeta sistem tek ilemli olarak devam eder. Korumal
modda sradan bir programcnn bu flagi 0 yapmas eitli biimlerde engellenmitir.
DF(Direction Flag)
Bu flag string komutlar iin ilemci tarafndan kullanlmaktadr. Bu komutlarda
transferin ynn anlamak iin bu flage bakar.
OF(Overflow Flag)
aretli say zerinde meydana gelen tama durumunu tespit etmek amacyla kullanlr.
Yani ilem sonucunda iaret biti deimise bu flag set edilir. rnein:
AX: 7FFF
INC AX
OF biti pozitif blgeden negatif blgeye geite ya da tersinde set edilebilir.
Turbo Debugger
22
Segment register
Register
Register veya memory
Sabit bir say
MOV Komutu
Bu komut register ve memory arasnda transfer ileminde kullanlr. Biimleri
unlardr:
1. reg reg/mem
2. reg/mem sabit
3. sreg reg/mem
Not: Bir ilem yaplacaksa ilk tercih edilecek register AL ya da AX olmaldr. nk ilemci
eer operand AL ya da AX ise baz komutlar daha etkin altrr.
Grld gibi dorudan segment registera sabit atanamamaktadr. rnein:
MOV SS, 1234
yerine
MOV AX, 1234
MOV SS, AX
yaplabilir. MOV makin komutu hibir flag registern etkilemez. Bellekte istenilen bir
blgeyi grtlemek iin bellek penceresine gelinir, mouseun sa tuuna baslr, goto seilir.
Orada unlar geerlidir:
-
Yalnzca offset
sreg:offset
segment:offset
Not: Hex sitemde alfabetik karakterlerle balayan saylar deiken isimleriyle karabilecei
iin bana 0 eklenerek girilmelidir. rnein: FC10 biiminde deil 0FC10 biiminde.
ADD Komutu
Biimleri:
1. reg reg/mem
2. reg/mem sabit
rnekler:
MOV AX, BX
23
rnein: DOS altnda Cde iki long sayy topladmzda ilemler aadaki gibi yaplacaktr.
long a=0x12345678, b = 0x87654321;
c = a + b;
DS:200
DS:204
12345678
87654321
78
56
34
12
21
43
65
87
200
201
202
203
204
205
206
207
208
209
20A
20B
Bellein istediimiz bir blgesine bir deer girmek iin mouse bellek blgesine getirilip,
istenilen blgede click yaplr ve istenilen saylar klavyeyle girilir.
Komutlarn Operand Uyumu
stisnalar olmasna karn genel olarak iki operand alan makine komutlarnda sol
taraftaki hedef operand ile sa taraftaki kaynak operandn uzunluklarnn ayn olmas
gerekmektedir. rnein aadakiler geersizdir.
24
MOV AX, BL
MOV EBX, CX
Eer operandlardan biri register dieri bellek ise bellek operandnn uzunluu registera
baldr. rnein:
MOV AL, [SI]
MOV [SI], AX
1 byte
2 byte
Ancak sol taraftaki operand bellek, sa taraftaki operand bir sabit olduunda debugger
program ya da sembolik makine dili derleyicileri sabit olan operandn 1 byte m yoksa 2 byte
m olduunu anlayamazlar. rnein:
MOV [SI], 1C
burada 001C says m sz konusudur, yoksa yalnzca 1C says m sz konusudur? Bu
ilemde belirsizlik byte ptr, word ptr, dword ptr belirleyicileriyle salanr. Bu belirleyiciler bellek
operandlarnn nne yerletirilir. rnein:
MOV word ptr [SI], 1C
burada iki bytelk ilem sz konudur. Yani aslnda 001C says belirtilmitir. Bu belirleyiciler
register bellek ilemlerinde de kullanlabilirler ama bir ilevi yoktur. rnein:
MOV AX, word ptr [SI]
Register bellek ilemlerinde 32 bitlik registerlar kullanlabilir. Bu durumda bellek
operand 16 bit ya da 32 bit offset ierebilir. rnein aadaki iki komut da geerlidir:
MOV EAX, [SI]
MOV EAX, [ESI]
Yani zetle 32 bit register kullanldnda bellek operandna ilikin offset(yani keli parantez
ierisindeki deer) 2 byte ya da 4 byte olabilir. DOS altnda alyorsak 4 byte register 2 byte
offset yapsn serbest bir biimde kullanabiliriz. Ancak 4 byte register 4 byte offset yapsn
DOSta deil, korumal modda kullanmalyz. rnein 2 long sayy 32 bit registerlar
kullanarak aadaki gibi toplayabiliriz:
MOV EAX, [200]
ADD EAX, [204]
MOV [208], EAX
lem genilii
Offset genilii
lem genilii ka byte bilgi zerinde ilem yapld anlamna gelir. Offset genilii ise
bellek operandnn ka byte offset ierdiini anlatr.
25
zetle register bellek ve bellek sabit ilemlerinde ilem genilii ve offset geniliine ilikin
btn kombinasyonlar geerlidir. Ancak DOS altnda 4 byte offset geniliini
kullanmamalyz. Oysa korumal modda btn kombinasyonlar rahatlkla kullanabiliriz.
lem genilii Offset genilii
4
4
4
2
2
4
2
2
1
2
1
4
rnek komut
Tabii offset geniliinden bahsedebilmek iin operandlardan birinin bellek olmas gerekir.
rnein:
- MOV AX, [ECX] komutun ilem genilii 2 byte, offset genilii 4 bytetr. lem geerlidir.
DOSta tavsiye edilmez.
- MOV EAX, [CX] komutun ilem genilii 4 bytetr. Ancak bellek operand yanl
dzenlenmitir.
- MOV EAX, [EBX] komutun ilem 4 byte, offset genilii 4 bytetr. lem geerlidir. DOSta
tavsiye edilmez.
- MOV dword ptr [ECX], 10 ilem genilii 4 byte, offset genilii de 4 bytetr. Komut
geerlidir, DOSta tavsiye edilmez.
- MOV dword ptr [SI], 10 ilem genilii 4 byte, offset genilii 4 bytetr. Geerlidir ama
DOSta tavsiye edilmez.
Not: lem genilii ve offset genilii srasyla 66 ve 67 n ekleriyle makine kodunda
belirtilir.
SUB Komutu
Biimleri:
1. reg reg/mem
2. reg/mem sabit
Etkiledii bayraklar: AF, CF, OF, PF, SF, ZF
Aslnda pek ok mikroilemcide ayr bir karma devresi yoktur. kinci operandn ikiye
tmleyeni alnr. Toplama devresine sokulur. rnein
MOV AL, 1C
MOV BL, 2F
SUB AL, BL
0001 1100
0010 1111
1101 0001
26
1C
-2F
ED
0001 1100
1101 0001
1110 1101
kartma ileminde elde edilen sonu pozitif ya da negatif olabilir. Yani bir kartma ilemi
sonucunda CF bayrana bakarak soldaki operandn sadaki operanddan iaretsiz sistemde
byk olup olmadn anlayabiliriz. Saylarn iaretsiz sistemde olduu varsaymyla birinci
operand ikinci operanddan bykse CF 0, kkse CF 1 olur.
Not: kinci operandn 2ye tmleyeni alnp toplandnda aslnda birinci operand ikinci
operanddan bykse CF 1, kkse CF 0 olmaktadr. Ancak ilemci bu toplama ileminden
sonra CF bayrann tersini almaktadr. Sonu olarak kartma ilemi sonucunda CF
bayrana bakarak operandlarn iaretsiz sistemde byklk-kklk ilikisini kurabiliriz.
Tabii 2ye tmleyen aritmetiinde iaretli ve iaretsiz toplama ve kartma kavramlar yoktur.
Zaten normal bir toplama ve kartma ilemi hem iaretli hem iaretsiz sistemde anlamldr.
Yani registerlar ierisine yerletirilmi olan saylar iaretli kabul edilirse sonuta iaretli
yorumlanmaldr, iaretsiz kabul edilmise sonuta iaretsiz yorumlanmaldr. rnein:
MOV AL, FE
MOV BL, 01
ADD AL, BL
AlFE
BL01
ALFF
aretsiz254
aretsiz1
aretli255
aretli-2
aretli1
aretsiz-1
_aha_bura_
CMP Komutu
CMP komutu kullanm bakmndan tamamen SUB komutu gibidir. Ancak operandlar
kartma ileminden etkilenmezler. Yalnzca ilemden baraklar etkilenir. rnein:
CMP AX, BX
AX BX ilemi yaplr ama sonu AX registerna atanmaz. CMP komutu yalnzca bayraklar
etkiler. Genellikle CMP komutunu dallanma komutlar izler. SUB ve CMP komutlar
bayraklar yle etkiler ki bayraklara bakarak her trl karlatrma sonucu karlabilir.
SBB Komutu (Subtract with Barrow)
Bu komut SUB komutunun Carry'li versiyonudur. SBB x, y ileminde x - y - c ilemi
yaplr. Bu komut 16 bit almada iki 32 bit saynn kartlmas ileminde kullanlmaktadr.
MOV AX, [1FC0]
SUB AX, [1FC4]
MOV [1FC8], AX
MOV AX, [1FC2]
SBB AX, [1FC0]
MOV [1FCA], AX
MOV EAX, [1FC0]
27
Kalp:
16 bit ilem genilii ile 32 bitlik iki tamsaynn toplanmas nce saylarn dk anlaml word
deerlerinin ADD ile yksek anlaml word deerlerinin ADC ile toplanmas ile salanr.
kartma ileminde ise dk anlaml word deerleri iin SUB yksek anlaml word deerleri
iin SBB kullanlr. Tabii 32 bit toplama ve kartma ilemleri 32 bit yazmalar ile tek hamlede
yaplabilir.
MUL Komutu
Komutun biimleri
- MUL reg/mem (8 bit)
-MUL reg/mem (16 bit)
-MUL reg/mem (32 bit)
arpma ileminin tek operand vardr. Dier operand ilemci tarafndan default olarak eer 8
bit arpma yaplyorsa AL, 16 bit arpma yaplyorsa AX biiminde alnr. 32 bit iinse EAX
default olarak alnr. Etkiledii bayraklar CF ve OF(AF, PF, SF ve ZF belirsiz)
rnek
MOV AL, 3
MOV BL, 3
MUL BL
arpma sonucu eer 8 bit arpma sz konusu ise AX yazmacnda 16 bit arpma sz konusu
ise DX:AX biiminde yani yksek anlaml word DX dk anlaml word AXte olacak
biimde, eer 32 bit arpma sz konusu ise EDX:EAX biiminde olacaktr.
Komutun ilem genilii operanda baklarak anlalr. Operand yazma ise problem
yoktur. Operand bellek ise operand ise genilii byte ptr, word ptr yada dword ptr ile belirtilir.
rnein:
MUL BX
MUL CL
MUL EBX
MUL [offset]
MUL word ptr[offset]
16 bit
8 bit
32 bit
8 bit
16 bit
Geerli
Geerli
Geerli
Hata
Geerli
Sonu DX:AX
Sonu AX
Sonu EDX:EBX
Sonu DX:AX
rnein DOS altnda bir arpma ilemi iin yle bir makine komutu retilir.
MOV AX, a
MUL word ptr b
MOV c, AX
int trnn 32 bit olduu sistemlerde byle bir ilem dorudan 32 bit yazmalarla yaplabilir.
16 bit sistemlerde bir grup arpma ilemi yle yaplr.
28
DIV Komutu
Komutun biimleri
1. DIV reg/mem 8 bit
2. DIV reg/mem 16 bit
3. DIV reg/mem 32 bit
DIV komutu da tek operand alr. Blnen operand 8 bitlik blmede AX, 16 bit blmede
DX:AX ve 32 bitlik blmede EDX:EAX ierisinde olmaldr. Blme ilemi sonucunda
tamsay bir blm sonucu ve yine bir tamsay bir kalan sonucu elde edilir.
8 bitlik blmede AL blm AH kalan
16 bitlik blmede AX blm DX kalan
32 bitlik blmede EAX blm EDX kalan biimindedir.
rnein C dilinde iki tamsayy bldmzde ilem bu makine komutu ile yaplr.
Programlama dillerindeki mod operatrleri yine bu komutu kullanrlar.
16 bit blmelerde DX yazmacnn ierisinde uygun saynn bulunduu garanti altna
alnmaldr. rnein C dilindeki
unsigned int x,y,z
z = x / y;
MUL ve DIV komutlar iaretsiz arpma ve blme ilemleri yaparlar. Yani rnein:
29
MUL BX
gibi bir ilemde ilemci AX ve BX ierisindeki saylarn iaretsiz saylar olduunu
dnecektir. aretli arpma ve blme ilemleri iin IMUL ve IDIV komutlar kullanlr. Bu
komutlarn btn kullanl biimleri iaretsiz versiyonlarda olduu gibidir. Yalnzca
operandlar ve sonu iaretli sistemde ele alnr.
Bit Dzeyinde lem Yapan Komutlar
Bu komutlar iki operandldr. Saylarn karlkl bitleri zerinde ilemler yaparlar.
AND Komutu
Biimleri:
1. AND regreg/mem
2. AND reg/memsabit
rnein:
AND AX, BX
AND AL, [SI]
AND [SI], BL
AND word ptr [SI], 7F
Komutun etkiledii bayraklar PF, SF, ZFdir. CF ve OF her zaman sfrlanr. AF belirsizdir.
TEST Komutu
TEST komutu tamamen AND komutuyla ayn ilemi yapar. Ancak operandlar
etkilenmez, yalnzca bayraklar etkilenir.
Kalp:
Bir saynn sfr olup olmadn anlamak birka biimde yaplabilir. Ancak derleyicilerin tercih
ettii en etkin yntem saynn kendisiyle AND ya da OR ilemine sokulmasdr. Bu ilemden
sonra ZF bayrana baklr ve karar verilir. rnein:
AND AX, AX
Kalp:
Bir tamsaynn tek ya da ift olup olmad en dk anlaml bitinin 0 ya da 1 olmasyla
belirlenebilir. Bunu anlamann en iyi yntemi sayy 1 ile AND ilemine sokup ZF bayrana
bakmaktr. rnein:
TEST AX, 1
Ayn teknik etkin bir kod retimi iin Cde de uygulanabilir. rnein aadaki kod
if (x % 2 == 0) {
30
Kalp:
Bir saynn negatif ya da pozitif olduunu anlayabilmek iin yine kendisiyle AND ekip SF
bayrana bakmak gerekir. rnein:
MOV AX, mem
TEST AX, AX
OR Komutu
Biimleri:
1. OR reg reg/mem
2. OR reg/mem sabit
Karlkl bitleri OR ilemine sokar.
XOR Komutu
XOR ilemi iki operand ayn ise 0, farklysa 1 deerini veren bir ilemdir.
a
0
1
0
1
b
0
0
1
1
a XOR b
0
1
1
0
Sabit ieren ifadeler makine komutunu uzatt iin elenmelidir. O halde SUB AX, AX ya da
XOR AX, AX tercih edilmelidir. Geleneksel olarak XOR komutu tercih edilmelidir
31
XOR ve OR komutlarnn etkiledii bayraklar PF, SF, ZFdir. CF ve OF her zaman sfrlanr.
AF belirsizdir.
SHL ve SHR Komutlar
Biimleri:
1. SHL; SHR reg/mem, 1
2. SHL; SHR reg/mem, CL
3. 80186dan sonras iin: SHL; SHR reg/mem, sabit
Komutun etkiledii bayraklar AF ve CFdir. OF, PF, SF ve ZF belirsizdir. teleme
sonrasnda kaybedilen bit CF bayranda saklanr. Birden fazla teleme yapldnda son
telemede kaybedilen bit CFde saklanacaktr.
80186ya kadar teleme ilemleri iin iki makine komutu vard: Bir kez telemekte
kullanlan makine komutu ve CL register ierisindeki deer kadar telemekte kullanlan
makine komutu. Bu yzden birden fazla teleme yaplacaksa teleme says CL registerna
yerletirilmek zorundayd. 1 ya da CL deerleri komut yazlrken belirtilmek zorundadr.
Ancak bu bilgiler makine koduna yansmaz(Yani aslnda makine komutlar 1 kez tele ve
CL kadar tele biimindedir). Ancak 80186dan sonra hi CL registerna yerletirme
yapmadan sabit bir say kadar teleme yapmaya yarayan bir komut eklenmitir.
SAR ve SAL Komutlar
Aritmetik teleme komutlardr. Aslnda sola aritmetik teleme biiminde bir komut
yoktur. SAL ile SHL komutlar aslnda ayn komutlardr.(Debuggerlar ve derleyiciler sanki
SAL gibi bir komut varm gibi bu komutu kabul ederler.)
Saa aritmetik telemede butun bitler bir saa kaydrlr ancak en soldan iaret biti 0
ise 0 ile , 1 ise 1 ile besleme yaplr.
Dndrme Komutlar
C de dndrme ilemi yapan bir bit operatr yoktur. Ancak makine dilinde genellikle
dndrme komutlar vardr. Sola ve saa dndrme ilemleri teleme ilemleri gibidir ancak
kaybolan bit besleme ilemi iin kullanlr.
rnek:
1000 0101
1100 0010 (dndrmeden sonra)
Komutlarn etkiledii bayraklar :CF ve OF
Dndrme ileminde dnen bit ayn zamanda CF bayranda saklanmaktadr.
Kalp:
Bir byte bilginin niblelarn (4 bit) yer deitirmek iin bilgi saa yada sola 4 kez dndrlr.
rnein AH iinde yer deitirme yapacak olalm:
MOV CL,4
ROR AH,CL
32
Normal dndrme ilemine ilikin ROR ve ROL isimli iki komut vardr. Bunlara ek olarak bu
iki komutun bir de eldeli versiyonlar vardr. Bu komutlar: RCL ve RCR
CF=1
AH: 1110 1010
RCR AH,1
Komut reg/mem ,1
Komut reg/mem,CL
Komut reg/mem,sabit
ROL AX,5
ROR word ptr [SI][BX], CL
SAR byte ptr [SI+10],1
Stack Kullanm
Stack ilemcinin bilgileri geici sure iin depolamakta kulland RAM blgesidir.
Stack LIFO kuyruk yaps biiminde kullanlr.
Stack bir blge olmasna karn stackin tepesi biiminde isimlendirilen aktif bir yeri
vardr. Stack in tepesi SS:SP reg. ifti ile belirlenir. SP segment register isel olarak SS
biiminde belirlenmitir ve deitirilemez. Stack ile ilgili 2 ilem tanmldr.
1. STACK e bilgi konulmas (PUSH)
2. STACK ten bilgi alnmas (POP)
PUSH ve POP komutlarnn biimleri unlardr:
1.
PUSH (POP) reg/mem
2.
PUSH(POP) sreg
PUSH ve POP ilemleri gerek modda ve sanal 86 modda (yani DOS modunda) 16
bit, korumal modda 32 bit bilgi zerinde ilem yapar. Geri DOS modunda 32 bitlik stack
ilemi yaplabilir ancak tavsiye etmiyoruz. Genel olarak mikroilemcilerde PUSH ve POP
33
komutlar ilemcinin bir register uzunluu kadar bilgi zerinde ilem yapacak ekilde
tasarlanmaktadr. rnein DOS altnda aadaki ilemler geerlidir.
PUSH AX
PUSH BX
PUSH word ptr [SI]
PUSH CS
PUSH BP
aadakiler geersizdir.
PUSH AL
PUSH byte ptr [SI]
Korumal modda stack blgesinin tepesi SS:ESP register ile belirtilen blgedir.
PUSH EAX
POP EBP
PUSH ileminde nce SP DOS modunda 2 byte korumal modda 4 byte azaltlr. Bilgi
azaltlm deerden itibaren yerletirilir.
Tipik bir programn almasnda stack iin n byte yer ayrlmtr ve SP reg i bu
blgenin en altna ekilir. Tipik bir .exe program aadaki gibi 3 blgeden olumaktadr.
Program bellee yklendiinde SP reg. stack blgesinin en altna konumlandrlr.
Kod
Data
Stack
34
Bazen birden fazla register geici sre saklanacak olabilir. Bu durumda onlar ters
srada POP ile almak gerekir. rnein:
PUSH CX
PUSH AX
....
POP AX
POP CX
Bir bellek blgesi ierisindeki bilginin stacke atlmas da sz konusu alabilir. rnein
PUSH word ptr [SI]
35
36
char x = -1;
int y;
y = x;
Dallanma Komutlar
Intel ilemcilerinde programlama dillerinde karlatmz if komutlarn
karlayabilmek iin bir grup dallanma komutlar vardr. Intel sisteminde dallanma komutlar
iki gruba ayrlr:
1. Koulsuz dallanma komutlar
2. Koullu dallanma komutlar
Koulsuz dallanma komutlar tpk goto deyimi gibidir. Oysa koullu dallanma komutlarnda
nce CMP komutuyla bir karlatrma yaplr, sonra bu karlatrmaya gre dallanma
salanr. Aslnda dallanma ileminde yaplan tek ey IP ya da EIP registerlarna deer
atamaktr. JMP komutlar genellikle operand olarak bir say alr. Bu say akn aktarlaca
yani IP ya da EIP registernn alaca deeri belirtmektedir. JMP komutlar ikilik sistemde
nce JMP komutunun varln belirten 1 ya da 2 byte sonra bir yer deitirme(displacement)
deeri alr.
Yer Deitirme(displacement) Kavram
Sembolik makine dilinde JMP komutlarnn operandlar bir say deil, bir etikettir. Bu
etiket deerlerinin sayya dntrlmesi derleyicinin grevidir. Debuggerlarda durum byle
deildir. rnein:
37
JMP EXIT
....
....
EXIT:
burada ilemci DS:SI blgesinden 2 byte eker ve bunu dorudan IP registerna yerletirerek
dallanr. Bu komutta yer deitirme miktar deil, offset sz konusudur. Cde fonksiyon
38
gstericileri bu eit bir dallanma ilemini akla getirir. Tabii burada JMP komutu yerine
CALL komut bulunacaktr. rnein:
void (*p) (void);
p = func;
p();
Makine reset edildiinde CS:FFFF, IP:0000 adresini alr. Yani makiney reset etmek iinb
yeterlidir.
5. Segmentler aras dolayl JMP(indirect intersegment JMP)
Bu ilem segment ii dolayl JMP ileminin segmentler aras versiondr. Yani operand
olarak bir bellek blgesini alr. Atlanacak segment ve offset deerlerini oradan eker.
Komutu anlatan byte FFtir. Komut sembolik makine dilinde ve debuggerlarda aadaki
gibi kullanlr:
JMP far [SI]
Burada JMP anahtar szcnden sonra far anahtar szcnn getirilmesi gerekir. Yoksa
ilemin segment ii mi yoksa segmentler aras m olduu anlalamaz. Bellek
operandyla belirtilen blgeden ekilen ilk word deer IP registerna, sonraki word deer
ise CS registerna yerletirilir.
Koullu Dallanma Komutlar
Bu komutlar tamamen programlama dillerindeki if komutlarnn karldr. Koullu
JMP ilemi srasnda ilemci yalnzca bayraklarn durumuna bakar. Yani koullu JMP
komutlar bayraklarn durumuna baklarak yaplan JMP komutlardr. Teorik olarak SUB ya
da CMP ileminden sonra bayraklar btn iaretli ve iaretsiz karlatrmalar yapacak
biimde etkilenir. Koullu JMP komutlarnn ou SUB ya da CMP komutlarndan sonra
anlaml olacak biimde tasarlanmtr. Bu komutlar SUB ya da CMP komutu olmadan da
kullanlabilir. Ancak ou kez anlamsz olur.
39
MOV AX, x
CMP AX, y
JZ @1
fade2
JMP NEXT
@1:
ifade1
@2:
Bazen karlatrma ilemlerinde ek bir takm makine komutlar sz konusu olabilir. rnein:
if (x + y == a * b)
ifade1;
else
ifade2;
MOV BX, x
ADD BX, y
MOV AX, a
MUL word ptr b
CMP AX, BX
JZ @1
fade2
JMP @2
40
@1:
ifade1
@2:
MOV AX, x
CMP AX, y
JAE @1
ifade2
JMP @2
@1:
ifade1
@2:
MOV AX, x
CMP AX,y
JGE @1
ifade2
JMP @2
@1:
ifade1
@2:
41
Fonksiyondan geriye dnmek iin sembolik olarak POP IP ileminin yaplmas gerekir.
Tabii POP IP biiminde bir makine komutu yoktur. Bu makine komutunun ismi RET
komutudur. Yani aslnda Cde fonksiyonun ana blou bittiinde derleyici bizim
grmediimiz bir RET komutu yerletirmektedir.
42
43
Bu makine komutu 3 byte uzunluundadr. Komut anlatan byte C2dir. Komut iki bytelk
bir say operand almaktadr. Sembolik makine dilinde RET n biiminde gsterilir.
rnein:
RET 4
Komut nce POP IP ilemini yapar, daha sonra SP registern parametresinde belirtilen
miktarda byte artrr. rnein:
clear CF
set CF
clear IF
set IF
clear DF
44
STD
CMC
set DF
complement CF
Sembolik Makine Dili Nedir?
MZ format
NE format
PE format
Exe dosyann balk ksmnda programn yklenmesine ilikin eitli bilgiler bulunur.
Bir exe dosya altrlaca zaman blok olarak RAMe yklenir. Ykleme srasnda MZ
ksmnda balk ksm atlmaktadr. PE formatnda balk ksmyla birlikte ykleme yaplr.
Program iletim sisteminin ykleyici(loader) program tarafndan yklenir. Program bellee
yklendiinde artk almakta olan bir program haline gelir. almakta olan programlara
process denir. Programn btn makine komutlar exe dosyann code blmndedir.
45
Program bellee yklendikten sonra nasl alr hale getirilecektir? Programn alr
hale getirilmesi aslnda CS:IP registerlarna program koduna ilikin ilk deerlerinin verilip
kontroln braklmasndan baka bir ey deildir. Exe dosya ierisinde her ey ikilik sistemde
mikroilemcinin anlayaca biimdedir. rnein bir C programnda yzlerce fonksiyon
olabilir. Ancak C programlar main fonksiyonundan almaya balar. Peki ykleyici main
fonksiyonun balang segment ve offset deerlerini nereden bilecektir? te programn
balang kod adresi yani CS:IP registerlarna verilecek ilk deer exe dosyann balk
ksmna linker tarafndan yazlr. Ykleyici stack oluumu iin SS ve SP registerlarna da ilk
deer verir. SP program yklendiinde stack blgesinin en sonunu gsterecek biimdedir.
Ancak ykleyici DS registerna programn data blgesinin balang adresini otomatik olarak
vermez. DS register programc tarafndan uygun bir biimde yklenmek zorundadr. Bu
durumda tipik bir exe dosya yklendiinde register durumlar aadaki gibi olacaktr.
46
registerlarnn ayn deerde olduunu varsayarak kod retirler. Bu durumda tipik bir small
model program yklendiinde nemli registerlarn durumlar aadaki gibi olacaktr:
Bu deerin sembolik ismi @data biimindedir. Bu durumda tipik bir sembolik makine dili
program bu iki satrla balamaldr. Tabii program data blgesini kullanmak zorunda deildir.
Bu durumda DS registernn da o blgeyi gstermesine gerek kalmaz. Bu komutla birlikte
artk ekildeki register durumu elde edilmitir.
Code, Data ve Stack Blmlerinin Belirlenmesi
Yalnlatrlm segment sistemiyle programn code, data ve stack ksmlar srasyla
.CODE .DATA ve .STACK bildirimleri ile oluturulur. Bu blmler herhangi bir srada
yazlabilir ancak exe dosya ierisindeki yerleim code, data ve stack biiminde olacaktr.
Normal olarak stack blmnn yalnzca uzunluu belirtilir. Eer uzunluk belirtilmezse 1024
byte alnacaktr. rnein:
.STACK 512
.STACK 100h
Semboller
Bir code ya da dataya ilikin offset adresi belirten alfabetik isimlere sembol denir.
Yani semboller Cdeki deikenler gibidir. Sembollere sembolik makine dilinde variable ya
da label da denilmektedir. Semboller code ve data sembolleri olmak zere ikiye ayrlr. Bir
data sembol kullanldnda aslnda [] ierisinde o semboln offset deeri bulunan bir ifade
kullanlyormu gibi ilem grr. rnein: sample sembolnn offset deeri 100 olsun:
MOV AX, sample
47
Bu durumda sembolik makine dili derleyicisi semboln belirttii offset ile ilgili bir toplama
yapldn dnr. Yukardaki kod
MOV AX, [102]
DB(define byte)
DW(define word)
DD(define double word)
DQ(define quad word)
DT(define ten byte)
Deer
rnein:
X1 db 100
X2 dw 250
X3 dd 500
Sembol tanmlama tamamen Cdeki deiken tanmlamas gibidir. Sembol isminden sonra
getirilen anahtar szckler nesnenin uzunluunu belirtir. Deer tahsis edilen alann ierisine
yerletirilecek saydr. Sembol deeri yerine ? kullanlrsa ilk deer verilmedii yani rasgele
bir deer alnaca anlatlr. Bir sembol birden fazla nesneden oluabilir. Yani tpk Cdeki
diziler gibi olabilir. rnein:
X4 db 100 dup (?)
X5 db 10 dup (5)
bu ifade ile belirtilen uzunlukta n tane tahsisat yaplr. Her elemana () ierisindeki deer
verilir. Bir sembolden balayarak birden fazla nesne oluturulabilir. Bu durumda tanmlama
ileminde her bir deer arasna , konur. rnein:
X6 dw 100, 200, 300, 400, 500
48
zetle sembol yalnzca balang yeri belirtmektedir. ster dup ifadesiyle olsun, isterse
aralarna , yerletirilmi olsun bir sembole ilikin deerler ardk bir biimde yerletirilir.
Bir sembol derleyici tarafndan obj modle linker tarafndan da exe dosyann data
blmne yerletirilir. Derleyici data blmnn ilk sembolnn offset deeri 0 olacak
biimde btn sembollerin offset deerlerini belirler. rnein
.DATA
X1 db 100, 200, 300, 138, 163
X2 dw 200
deerine dntrlr. Yani AL registerna 138 yklenir. Tabii derleyici yalnzca sembole
uygun offset deerlerini retir. Normal olarak DS registernn data blgesinin balangcn
gstermesi gerekir. Bunun iin daha sembol kullanmadan nce
MOV AX, @data
MOV DS, AX
end komutunun aasna yazlan ifadelerle derleyici ilgilenmez. end komutunun yanna
bir code sembol yazlr. Bu sembol programn balang offset deerini belirtir. Bu
durumda programn balang IP deeri end komutuyla programc tarafndan tespit edilir.
Derleyici tarafndan obj modle, linker tarafndan da exe dosyann balk ksmna yazlr.
SS ve SP registerlarnn deerleri ykleyici tarafndan SS stack blgesinin segment
adresi, SP stack blgesinin en altnn offset deeri olacak biimde yklenir.
DS register ykleyici tarafndan otomatik olarak yklenmez, programcnn yklemesi
gerekir.
ES register DOS uygulamalarnda ykleyici tarafndan PSP(program segment prefix)
blgesini gsterecek biimde yklenir.
AX, BX, CX, DX registerlar ykleyici tarafndan 0lanr.
49
Programn Sonlandrlmas
DOS gibi tek ilemli bir sistemde ykleyici program ykler ve registerlara ilk
deerlerini verir. Sonra kontrol programa brakr. Programda bir bozukluk olursa iletim
sistemine geri dn mmkn olmaz. letim sistemine geri dnmek kabaca CS ve IP
deerlerinin iletim sisteminin kodlarn gsterecek duruma getirilmesidir. DOSta kontrol
sisteme brakmak iin Cde exit fonksiyonunu arrz. Aslnda exit fonksiyonu 21H
kesmesinin 4CH numaral fonksiyonu armaktadr. Bu fonksiyon arlmadan nce AL
registerna exit fonksiyonunun ierisine yazdmz deer olan program exit codeu
girilebilir. zetle DOSta yazdmz bir sembolik makine dili programnn sonlandrlmas
yle yaplabilir:
MOV AX, 4C00h
INT 21h
Code Sembolleri
Bir sembol programn code blgesinde de bir offset belirtebilir. Byle sembollere code
sembolleri denir. data ve code sembolleri ileride ayrntlaryla ele alnacaktr. Bir code
sembol temel olarak 3 biimde oluturulur:
1. JMP etiketleri biiminde
rnein:
....
....
EXIT:
....
....
rnein:
main proc near
.....
.....
main endp
Bir proc bildirimi endp bildirimiyle sonlandrlr. Sembolik makine dili programna
gzel bir grnm vermek amacyla kullanlr. proc bildirimiyle belirtilen semboln offset
deeri bildirimin yapld yerdir. proc anahtar szcnden sonra near ya da far anahtar
szc getirilmemise default durum bellek modeline gre deimektedir.
50
/*----------ilkprog.asm----------*/
Sabitler
Sabitler makine komutlarnda ya da data sembollerine ilk deer vermekte
kullanlabilirler.
Sabitlerin eitli Tabanlarda Gsterimleri
Sabitler dorudan yazldnda 10luk sistemle yazld kabul edilir. rnein:
name db 100
Sabitler default olarak 10luk sistemde anlalrlar, ancak saynn sonuna d getirerek de bu
belirlemeyi yapabiliriz. rnein:
name db 100d
51
Sabitler 16lk sistemde saynn sonuna h getirilerek ayrt edilirler. 16lk sistemdeki sabitler
saysal karakterlerle balyorsa bana 0 getirmek gerekir.
Alfabetik Sabitler(stringler)
db uzunluklu data sembollerine ilk deer string ifadesiyle verilebilir. ile arasnda
bir fark yoktur. Bir data sembolne string ifadesiyle ilk deer verildiinde derleyici bellee
string ierisindeki karakterlerin ASCII karlklarn yerletirir. rnein:
name db Kaan Aslan
Stringlerin sonuna Cde olduu gibi NULL karakter eklenmez. NULL karakter eklenecekse
aadaki gibi yaplabilir:
name db Kaan Aslan, 0
Not: Komut operand oluturulurken + n gibi bir ifade [n] biiminde de belirtilebilir. rnein:
name + 2
Bu durumda derleyici noktal sayy IEEE 754 standardna gre dntrerek bellee yazar.
db ve dw uzunluklu data sembollerine noktal saylarla ilk deer verilemez.
BCD Trden Sabitler
dt uzunluklu bir data sembolne noktal saylarla deil de tam saylarla ilk deer
verilirse saylar derleyici tarafndan BCD olarak bellee yerletirilir. rnein:
n dt 1012345
52
EXIT:
MOV AX, BX
53
SI registerna atanmasna yol aar. [] ierisindeki ifadeler bellekte bir yer belirttiine gre bu
komut bir nesnenin adresinin alnmasnda kullanlabilir.
Sembolik Makine Dilinde For Dnglerinin Oluturulmas
Programlama dillerinde for dngleri n kez yinelenmeyi salayan deyimlerdir. For
dngleri sembolik makine dilinde iki biimde kurulabilir. Bu iki biim arasnda ciddi bir
farkllk yoktur. Bu biimler kalp renilebilir. Dngnn yenilenme miktar bellekte
tutulabilecei gibi, bir registerda da tutulabilir. Bu durumlarda herhangi bir register
kullanlabilir. Geleneksel olarak CX register tercih edilir.
Kalp:
MOV CX, 0
JMP @1
@2:
....
....
....
INC CX
@1:
CMP CX, n
JB @2
Kalp:
MOV CX, 0
@2:
CMP CX, n
JAE @1
....
...
....
INC CX
JMP @2
@1:
Bu dng kalplar tipik bir C for dngsnn almlardr. Burada n defa dnmek iin
azaltml yntemler de kullanlabilir.
Kalp:
MOV CX, n
@1:
....
....
....
DEC CX
JNZ @1
do {
....
....
....
--n;
} while(n)
54
/**********dongu.asm**********/
Kod Sembolleri
Programn kod blmnde offset belirten sembollere denir. Kod sembolleri iki
biimde oluturulur:
1. Etiket bildirimiyle
2. proc bildirimiyle
Etiket bildirimiyle oluturulan kod sembollerine ancak ayn segment ierisinde JMP ve CALL
komutlar uygulanabilir. Bunlar tamamen near proc bildirimiyle edeerdir. Eer kod sembol
proc bildirimiyle oluturulmusa bu sembol JMP ve CALL komutlaryla kullanldnda
default olarak proc bildirimi near ise segment ii, far ise segmentler aras CALL komutu
anlalr.
Alt Programlarla alma
near proc bildiriminin etiket bildirimiyle oluturulmu kod sembolnden hibir fark
yoktur. proc bildirimini bitiren syntax ifadesi yalnzca okunabilirlii arttrmak iin adeta bir
alt program grnts vermek iin kullanlr. Yani rnein bir proc bildirimi CALL yaplm
55
olsun; programn ak endp bildirimine geldiinde eer RET komutu kullanlmadysa bir geri
dn olumaz. Yani proc bildirimi RET komutunu iermemektedir.
Bu durumda bir sembolik makine dili program tpk bir C program gibi tasarlanabilir.
Yani eitli alt programlar proc bildirimi ile yazlabilir, program da bu alt programlardan bir
tanesiyle balayabilir. proc bildirimlerinin sonuna RET makine komutu konulmaldr. RET
makine komutu proc bildirimi iin deil, CALL makine komutu iin kullanlmaktadr. Tipik
bir sembolik makine dili program tek para halinde deil, Cde olduu gibi alt programlar ve
makrolar biiminde yazlmaldr. zellikle makro kullanm ok yaygndr. makro konusu
ileride ele alnacaktr. phesiz bir proc bildirimine JMP komutuyla da dallanlabilir. Bu
durumda RET makine komutuyla rasgele bir yere geri dnlebilir. Kod sembollerine JMP ya
da CALL makine komutuyla dallanrken ilemin segment ii mi yoksa segmentler aras m
olduu yle tespit edilir:
1. Kod sembol etiket bildirimiyle oluturulmusa her zaman segment iidir.
2. Kod sembol proc bildirimiyle oluturulmusa proc bildiriminin near ya da far olmasna
bal olarak durum deiir. Ancak okunabilirlii arttrmak iin kod sembolnden nce
durumu vurgulamak amacyla near ptr ve far ptr anahtar szckleri kullanlabilir. rnein:
JMP near ptr func
CALL near ptr func
CALL far ptr sample
56
biiminde olmaldr. Bu iki makine komutundan sonraki stack durumu aadaki gibi
olacaktr:
57
[BP + 4]
[BP + 6]
[BP + 8]
58
makine komutlar kullanlabilir. Bu durumda void func(int a, int b); gibi bir fonksiyonu bir
C derleyicisi DOSta:
PUSH b
PUSH a
CALL func
ADD SP, 4
eklinde olacaktr.
Biz burada aran kiinin C derleyicisi olduu fikriyle standart kurallar akladk.
Eer programn tamamn sembolik makine dilinde yazyorsak bir takm registerlarda
bilgi saklamayacaksak, rnein BP registernn PUSH edilmesine gerek kalmayabilir.
Ancak aktarm ana hatlaryla yine byle olacaktr.
2. pascal Yntemi
pascal yntemi kullanlarak parametre aktarmna pascal tarz fonksiyon arm
denilir. Pascal derleyicileri fonksiyonlar bu biimde armaktadr. Cde pascal tarz
fonksiyon arabilmek iin fonksiyonun geri dn deerinin sana pascal, _pascal
veya __pascal yazlr. Bu aktarm biiminde cdecl aktarm biimine gre iki farkllk
vardr:
1. Parametreler sadan sola deil, soldan saa stacke aktarlr.
2. Stackin dengelenmesi aran fonksiyon tarafndan deil, arlan fonksiyon
tarafndan RET n makine komutuyla yaplmaktadr.
59
rnein:
void func(int a, int b);
komutlar gerekebilir. Ancak [BP + 4]te ilk parametre deil, son parametre
bulunacaktr. Fonksiyondan k
POP BP
RET n
eklinde olacaktr.
3. stdcall Yntemi
Bu yntem Win32 API fonksiyonlarnn arlmasnda kullanlan yntemdir. Ayrca
C++ta snfn ye fonksiyonlar da default olarak bu biimde arlmaktadr. Bu
arma biimi DOS ve UNIX sistemlerinde desteklenmemektedir. Win32
sistemlerinde bu arma biiminin kullanlabilmesi iin fonksiyonun geri dn
deerinin sana stdcall, _stdcall ya da __stdcall yazlr. Ayrca Win32 sistemlerinde
WINAPI ve CALLBACK makrolar da __stdcall anlamna gelmektedir.
Bu arma biimi cdecl ile pascal arma biimlerinin bir karmdr. Yani
parametreler sadan sola stacke atlr ama stackin dengelenmesi arlan fonksiyon
tarafndan RET n komutuyla yaplr.
60
Parametrelerin sadan sola aktarlmas printf, scanf gibi deiken sayda parametre alan
fonksiyonlarn tasarmn mmkn hale getirmektedir. Stackin arlan fonksiyon
tarafndan RET n komutuyla dengelenmesi dier ynteme gre daha hzldr. Bu yzden
stdcall arma biimi en iyi biimdir.
Fonksiyonlarn Geri Dn Deerlerinin Oluturulmas
arma biimi ne olursa olsun fonksiyonlarn geri dn deerleri fonksiyon
arldktan sonra registerlardan alnr. Fonksiyonu yazann geri dn deerini uygun
registerlarda brakarak kmas gerekir. Kurallar yledir:
1. DOS altnda almada
a. Geri dn deerleri 2 byte olan tm fonksiyonlarn geri dn deerleri AX
registernda braklmaldr.
b. Geri dn deerleri 4 byte olan fonksiyonlarn geri dn deerleri DX:AX
registerlarnda braklmaldr.
2. Win32/UNIX altnda almada
a. Geri dn deerleri 2 byte olan fonksiyonlarn geri dn deerleri EAX registernn
AX ksmnda bulunmaldr.
b. Geri dn deerleri 4 byte olan fonksiyonlarn geri dn deerleri A;EAX
registernn ierisinde braklmaldr.
Her iki sistemde de geri dn deeri 1 byte olan fonksiyonlar AL registern
kullanmaktadr. Ayrca geri dn deeri float, double ya da long double olan fonksiyonlarn
da geri dn deerleri matematik ilemcinin stack registerlarnda tutulmaktadr.
Fonksiyon armalarna likin eitli rnekler
1. Aadaki C fonksiyonun sembolik makine dili karln yaznz.
int Add(int a, int b);
Win32/UNIX iin
_add proc near
PUSH EBP
MOV EBP, ESP
MOV EAX, [EBP + 8]
ADD EAX, [EBP + 12]
POP EBP
RET
_add endp
61
Win32/UNIX iin
total proc near
PUSH EBP
MOV EBP, ESP
MOV EBX, [EBP + 8]
XOR EAX, EAX
XOR ECX, ECX
JMP @1
@2:
ADD EAX, [EBX]
ADD EBX, 2
INC ECX
@1:
CMP ECX, [EBP + 12]
JL @2
POP EBP
RET
total endp
62
ax, [bp + 4]
ax, [bp + 6]
pop bp
ret
_add endp
_multiply proc near
push bp
mov bp, sp
mov
mul
ax, [bp + 4]
word ptr [bp + 6]
pop bp
ret
_multiply endp
public _add
public _multiply
63
end
/*****dosutil.asm*****/
/*****dostest.c*****/
#include <stdio.h>
int multiply(int a, int b);
int add(int a, int b);
void main(void)
{
printf("%d\n", add(10, 20));
printf("%d\n", multiply(10, 20));
}
/*****dostest.c*****/
e Dngler
ie dngler iin .data blgesinde semboller tanmlayarak dng deikeni
problemi zlebilir. Ya da stack kullanlarak dng deikenlerinin karmas engellenebilir.
rnein n defa dnen i ie iki dng stack yntemiyle yle tasarlanabilir: Burada her iki
dng deikeni de CX olarak dnlmtr.
XOR CX, CX
JMP @1
@2:
PUSH CX
XOR CX, CX
JMP @3
@4:
.....
.....
.....
INC CX
@3:
CMP CX, n
JL @4
POP CX
INC CX
CMP CX, n
JL @2
Kalp:
Bellekteki iki elemann yerlerinin deitirilmesi:
MOV AX, M1
MOV BX, M2
MOV M2, AX
MOV M1, BX
64
Kalp:
Bellekteki iki elemann yerlerinin deitirilmesi:
MOV AX, M1
XCHG AX, M2
MOV M1, AX
Kalp:
Bellekteki iki elemann yerlerinin deitirilmesi:
PUSH M1
PUSH M2
POP M1
POP M2
Win32 ve UNIX Sistemlerinde Sembolik Makine Dilinde program Yazarken Dikkat Edilmesi
Gereken Hususlar
Win32 ve UNIX sistemlerinin doal alma modu 32 bit data ve 32 offset kullanlan
moddur. Hem DOSta hem de Win32/UNIX sistemlerinde 8 bitlik, 16 bitlik, 32 bitlik
register ilemleri yaplabilir. Ancak 66H ve 67H prefixlerinden dolay DOS sisteminde 32 bit
registerlarn UNIX ve Win32 sistemlerinde 16 bit registerlarn kullanlmasnda makine
komutlarnn uzamasndan kaynaklanan bir maliyet sz konusudur. Yani Win32 ve UNIX
sistemlerinde 16 bit registerlarn kullanlmasn alkanlk haline getirmemeliyiz. DOSta 32
bit registerlarn kullanlmasnn zarardan ok faydas vardr.
Win32 sistemlerinde programn almas srasnda segment deeri 0dr. Btn
bellee 32 bit offset bilgisiyle eriilebilir. Bu sistemlerde segment registerlarn
kullanlmasnn normal kullanm bakmndan bir nemi yoktur.
32 bit programlamada offset oluturmak iin btn registerlarn [] ierisinde
kullanlabildii unutmamak gerekir.
Ayrca 32 bit programlamada [] ierisinde bir register 1, 2, 4 ya da 8 ile arplabilir.
Bu zellik sayesinde dizi elemanlarna eriim olduka kolaylatrlmtr.
Win32 sistemlerinde kullanlan obj modl formatna COFF(common object file
format) denir. Dolaysyla obj dosyalarn bu formatta olmas gerekir. Ancak Win32 linker
programlar eski OMF(object module format) formatndan COFF formatna dnm
yapmaktadr. rnein Win32 sistemleri iin
int sum(const int *pArray, int size);
/*****sum.asm*****/
.386
.model flat
.code
65
/*****sum.asm*****/
olabilir.
void square(int x, int *pResult);
eklinde yazlabilir.
66
/*****util16.asm*****/
/*****test16.c*****/
#include <stdio.h>
size_t asm_strlen(const char *str);
void main(void)
{
char s[80];
gets(s);
printf("%d\n", asm_strlen(s));
}
/*****test16.c*****/
67
2. ki int trnden deikenin adresini alarak onlar yer deitiren swap fonksiyonunun
yazm(void swap(int *, int *);).
/*****util16.asm*****/
.model small
.code
_swap proc near
push
bp
mov
bp, sp
push
si
mov
bx, [bp + 4]
mov
si, [bp + 6]
mov
ax, [bx]
xchg
ax, [si]
mov
[bx], ax
pop
si
pop
bp
ret
_swap end
public _swap
end
/*****util16.asm*****/
/*****test16.c*****/
#include <stdio.h>
/*Prototypes*/
void swap(int *p1, int *p2);
/*Main*/
void main(void)
{
int a = 10, b = 20;
swap(&a, &b);
printf("%d %d\n", a, b);
}
/*****test16.c*****/
68
MOV BP, SP
PUSH SI
eklinde olacaktr.
3. n faktoriyeli alan fonksiyonu yaznz(long factorial(int n);).
/*****util16.asm*****/
.model small
.code
_factorial proc near
push
bp
mov
bp, sp
xor
dx, dx
mov
cx, 1
mov
ax, 1
jmp
@3@1
@3@2:
mul
cx
inc
cx
@3@1:
cmp
cx, [bp + 4]
jle
@3@2
pop
bp
ret
_factorial endp
public _factorial
end
/*****util16.asm*****/
/*****test16.c*****/
#include <stdio.h>
long factorial(int n);
void main(void)
{
printf("%ld\n",
factorial(12));
}
/*****test16.c*****/
69
.data
x
y
str1
str2
dw
dw
db
db
?
?
"%d\n", 0
"%d %d\n", 0
.code
_main proc near
push
push bp
mov
bp, sp
mov
ax, 20
push
ax
mov
ax, 10
push
ax
call
_add
add
sp, 4
push
ax
lea
ax, str1
push
ax
call
_printf
add
sp, 4
mov
word ptr x, 50
mov
word ptr y, 100
call
_disp
pop bp
ret
_main endp
_disp proc near
push
word ptr y
push
word ptr x
lea
ax, str2
push
ax
call
_printf
add
sp, 6
ret
_disp endp
_add proc near
push
bp
mov
bp, sp
mov
ax, [bp + 4]
add
ax, [bp + 6]
pop bp
ret
_add endp
end
70
Benzer biimde SEG operatr de semboln iinde bulunduu segmentin deerini sabit
olarak elde eder. rnein:
MOV AX, SEG name
NOT: OFFSET ve SEG gibi operatrler okunabilirlik asndan byk harfle
yazlmaldr.
EXE Dosya Format
Exe dosya ierik bakmndan eitli formatlarla belirtilir. DOSta kullanlan exe dosya
formatna MZ format denir. Windows 3.1in exe formatna NE, Win32 exe formatna PE
dosya formatlar denir. Format ne olursa olsun tipik bir exe dosya iki ksmdan oluur:
1. Balk
2. erik
Balk exe dosyann hemen bandan balar ve deiken uzunlukta olabilir. erik ksmnda
programmzn kod, data ve stack ksmn oluturan gerek makine komutlar bulunmaktadr.
DOS exe dosyas balk ksm atlarak bellee yklenir. Halbuki NE ve PE formatlar balk
ksmyla bellee yklenmektedir.
71
Uzunluk
word
word
word
word
word
word
word
word
word
word
word
word
word
word
varies
varies
varies
varies
varies
Magic number
Aklama
Magic number(4D5A)
Son sektrde kalan byte uzunluu
Balk dahil dosya sektr uzunluu
Relocation elemanlarnn says
Balk ksmnn paragraf uzunluu
Ykleme iin gerekli minimum paragraf says
Ykleme iin gerekli maksimum paragraf says
SS deeri
SP deeri
Checksum
Programn balang IP deeri
Programn balang CS deeri
Relocation tablosunun yeri
Overlay says
2 numaral offsette bulunan bilgi balk + ierik toplamnn 512ye blmnden elde edilen
kalan verir. 4 numaral offsette ise balk + ierik toplamnn ka tane 512lik sayfaya
saca bilgisi vardr. zetle ykleyici balk + ierik uzunluunu aadaki gibi hesaplar:
Balk + ierik = 4 numaral offset * 512 + (512 - 2 numaral offset deeri) % 512;
Buradan hesaplanan uzunluk exe dosyann gerek uzunluu deil, dosya ierisindeki makine
kodlarnn uzunluudur(balk + ierik). Ykleyici burada belirtilen uzunluktan balk
ksmnn uzunluunu kartr, yklenecek ksm tespit eder. Yani biz exe dosyann sonuna bir
eyler eklesek ykleyici eklenen bilgileri yklemez. nk ykleyici orada yazlan deer
zerinden hareket eder.
Debugger gibi programlar debug altnda okunabilirlii arttrmak iin sembol tablosu
denilen bir tablo kullanrlar. Sembol tablosu linker tarafndan exe dosyann sonuna eklenir.
Ykleyici eklenen bu bilgiyi yklemez. Yani exe dosyann sonuna bir eyler eklesek
programn yklenmesi srasnda problem kmayacaktr.
72
Relocation elemanlarnn
says
Balk ksmnn paragraf
uzunluu
SS deeri
SP deeri
Checksum
CS ve IP deerleri
Relocation
tablosunun
yeri
Overlay says
DOSun ykleyicisi bir exe ya da com dosyay yklerken nce 256 byte uzunluunda
ismine PSP denilen bir alan oluturur. Dosyay hemen bu alann altna ykler. Yani RAMde
yklenmi olan bir programn hemen yukarsnda 256 bytelk bir PSP blou vardr. PSPnin
73
ierisinde programn sonlanmasna ilikin ve eitli olaylara ilikin bilgiler vardr. PSP iki
tane 128 bytelk blgeden olumaktadr. Birinci 128 bytelk blge ykleme bilgilerini ierir.
Buradaki bilgilerin bazlar ileride ele alnacaktr(Zaten bu blmdeki baz bilgiler eskiden
undocumented biimindeydi). PSPnin ikinci 128 bytelk blmnde programn komut satr
argmanlar bulunmaktadr. DOSun ykleyicisi bir program altrldnda nce PSPyi
yaratr. Sonra program PSPnin altna ykler. Programn komut satr argmanlarn da
PSPnin ikinci 128 bytelk blmne yerletirir. Bu blmde komut satr argmanlarndan
sonra bulunan ksmlarda rasgele deerler bulunur. Yani biz saf bir sembolik makine dili
program yazacaksak komut satr argmanlarn PSPden almak zorundayz. Cde
derleyicinin balang kodu(startup code) komut satr argmanlarn PSPden alr, bunu
.DATA blmne eker ve ayrk stringlerin balang adreslerini yine .DATA blmndeki
bir alana yerletirir. Sonra argv ve argc deerlerini PUSH ederek main fonksiyonunu arr.
main ierisinde kullandmz argv dizisi aslnda .DATA blmndedir. Komut satr
argmanlarnn PSPdeki grnts aadaki gibidir:
Yani nce bir byte uzunluk, sonra komut satr argmanlarna ilikin yaznn tamam, sonra
0x0D numaral ENTER karakteri, en son da rasgele karakterler.
Peki biz PSPnin balang adresini nasl renebiliriz? te ykleyici exe dosyay
ykledikten sonra DS ve ES registerlar ykleyici tarafndan PSPnin segment adresini
ierecek biime getirilir. Yani bir program bylece bellekte 16nn katlarna yklenmek
zorundadr. PSPnin adresine 256 toplarsak programn ykleme adresini buluruz. Bu adres
exe dosyann balk ksm atldnda yklenecek ierik ksmnn balang adresidir. Saf
sembolik makine dili program yazarken ieride PSP adresine gereksinim duyabiliriz. Bunun
iin kodun hemen banda PSP segment adresini DS ya da ES segment registerndan alarak
.DATA blgesinde bir yerde saklamak uygun olabilir. DOS altnda alan C derleyicilerinde
dos.h header dosyasnda bulunan _psp isimli deiken PSPnin segment adresini vermektedir.
Bu durumda biz bir C program ierisinde de _psp deikeninden faydalanarak programn
ykleme adresini elde edebiliriz.
Ykleme Sonrasnda Registerlarn lk Konumlar
-
Her programlama dilinde programn almaya balad bir nokta vardr. rnein
Cde programn balang noktas main fonksiyonudur. Ancak gerekte processin almaya
balad nokta yani exe dosyann ierisinde belirtilen nokta main fonksiyonu deildir.
Gerekte program derleyicinin balang kodu denilen bir giri kodundan balar, main
fonksiyonu oradan arlr. Derleyicinin balang kodunda iletim sisteminden iletim
74
sistemine deiebilecek eitli kritik ilemler yaplmaktadr. rnein DOSta komut satr
argmanlar PSP ierisinden alnarak main fonksiyonuna bu kod tarafndan geirilmektedir.
main fonksiyonu balang kodundan arldna gre main bittikten sonra ak tekrar
balang koduna dner
bittikten sonra DOS altnda klasik olarak 21h kesmesinin 4Ch
fonksiyonu arlmaktadr. DOSta zaten exit fonksiyonunun yapt ey bu kesmenin
arlmasndan ibarettir. DOSta tipik bir balang kodu:
balang kodu
....
....
....
CALL _main
MOV AH, 4Ch
INT 21h
75
76
komutuna gemeden INT ucunun elektriksel olarak aktive edilip edilmediine bakar. Intel
ilemcileri INT ucu aktive edildiinde IF bayrann durumuna gre kesme koduna dallanr ya
da kesmeyi grmezlikten gelir. IF bayrann set ve reset eden STI ve CLI makine komutlar
vardr. Mikroilemci IF bayra 1 ise kesmeyi kabul eder, 0 ise grmezlikten gelir. zetle
programc donanm kesmelerini devre d brakmak iin CLI makine komutunu, tekrar
devreye sokmak iin STI komutunu kullanabilir. zellikle kritik ilemler ncesinde donanm
kesmelerinin devre d braklmas ilem bittikten sonra tekrar almasna sklkla rastlanr.
Mikroilemcinin bir de ACK ucu vardr. kesmeyi kabul ederse ilemci bu ucu kendisi aktive
etmektedir.
Yani INT ucu bir giri ucu, ACK ucu ise k ucudur. Bu durumda tipik bir Intel ilemcisinin
donanm kesme protokol yledir:
1. lemci her komutun sonunda INT ucuna bakar.
2. INT ucu aktive edilmise IF bayrann durumuna bakar. IF 0 ise kesmeyi grmezlikten
gelir. IF 1 ise kesmeyi kabul eder ve ACK ucunu aktive eder.
sel kesmeler mikroilemcinin bir problemle karlatnda kendisinin ard
kesmelerdir. rnein DIV makine komutunda blen deer 0 ise ilemci blme ileminin
geersizliini anlatabilmek iin isel kesme oluturmaktadr.
INT Makine Komutu ve Kesmelere Dallanlmas
Intel ilemcilerinde toplam 256 kesme vardr. Her kesme bir numarayla belirtilir.
Genellikle numaralar hex sistemde belirtilir. INT makine komutunun ilem kodu CChtr. Bu
komuttan sonra kesme numarasn anlatan 1 bytelk bir say gelmektedir. Sembolik makine
dilinde komut yle yazlr:
INT <kesme numaras>
Intel ilemcileri iin RAMin tepesindeki ilk 1024 byte kesme vektr olarak
kullanlmaktadr. Yani kesme vektrnn yeri 0x00000-0x003FF blgesidir. Kesme vektr
her kesme numaras iin 4 bytelk kaytla biimindedir. bu 4 byten ilk 2 byte kesme
olutuunda IP registernn alaca deeri, dier 2 byte CS registernn alaca deeri
belirlemekte kullanlr. Kesme vektr tipik olarak aadaki gibidir.:
Adres
0-3
4-7
8-B
C-F
Kesme vektr
IP0
CS0
IP1
CS1
IP2
CS2
IP3
CS3
Kesme No
0
1
2
3
77
...
...
...
...
Bu durumda n numaral bir kesmeye ulamak iin ilemci n saysn 4 ile arpar. Oradaki ilk
iki byte IP registerna, sonraki 2 byte CS registerna yerletirir ve dallanmay
gerekletirir. Bu durumda biz n numaral kesme olutuunda istediimiz bir kodun
altrlmasn salayabiliriz. Kesme vektrnn yeri 80386 ilemcisiyle birlikte
deitirilebilecek biime getirilmitir. Ancak nceki ilemcilerde bu yer sabittir ve bellein
tepesindedir. Ayrca kesme vektrnn bu yaps yalnzca mikroilemcinin gerek modda ve
sanal 86 modda almas durumunda geerlidir. Windows ve UNIX gibi korumal modda
alan iletim sistemlerinde kesme vektr yerine kesme betimleyici tablosu(interrupt
descriptor table) denilen bir tablo kullanlmaktadr. Bu tablonun yaps biraz daha karmaktr.
INT makine komutunda srasyla unlar yaplmaktadr:
1. lemci geri dn iin srasyla bayrak registern, CS registern ve IP registern
stacke atar(CALL makine komutundan farkl olarak bayrak register da stacke
atlmaktadr).
2. lemci IF ve TF bayraklarn sfrlar.
3. Kesme numarasn 4 ile arpar, kesme vektrndeki segment ve offset deerlerini CS ve
IP registerlarna ykler.
Kesmeden geri dnmek iin kullanlan IRET makine komutu da srasyla IP, CS ve bayrak
registerlarn stackten eker. Bylece orijinal koda geri dner.
IRET makine komutu
RETF
POPF
78
PUSHF
CLI
CALL old_cs:old_ip
komutlaryla yaplabilir. Burada IF bayrann reset edilmesi genel olarak nemli deildir.
rnein vektrdeki eski deer cs_old ve ip_old biiminde olsun. Biz de cs_new, ip_new
biiminde deitirmi olalm.
....
cs_ new: ip_new
....
....
....
PUSHF
CLI
CALL cs_old:ip_old
....
....
....
IRET
....
....
....
....
IRET
cs_old:ip_old
Hook etme ilemi bittikten sonra istenirse vektr eski haline getirilebilir. Orijinal kesme
kodundan dndkten sonra bir ey yapmayacaksak hook eden kodu bitirebiliriz. Bu durumda
kesmenin olumas nedeniyle gerekleen stack durumu orijinal kodda uygulanm IRET
tarafndan geri alnabilir:
....
....
....
....
PUSH cs_old:ip_old
Kesme
kodu
79
dw
dd
.code
JMP
CALL
word ptr
dword ptr
1234h
12345678h
adr1
adr2
gibi bir komutla bunu deitirebiliriz. Buradaki deitirme ilemi bir komutluk
gereklemektedir. zellikle ES zerinden ykleme yaplmasna ok rastlanr. nk ES
register bu tr amalar iin dnlmtr. rnein kesme vektrne eriecek olsak bir
segment registerdan faydalanmamz gerekir. Bu tr durumlarda ilk akla gelecek register ES
register olmaldr.
C iin sembolik makine dilinde fonksiyon yazarken AX, BX, CX, DX registerlarnn
yan sra ES registernn da bozulmasnda bir saknca yoktur. rnein intrno numaral kesme
iin vektr 1234:5678 biiminde deitirmek isteyelim. Bu ilem aadaki gibi yaplabilir:
MOV BX, intrno
MOV CL, 2
SHL BX, CL
XOR AX, AX
MOV ES, AX
MOV word ptr ES:[BX], 5678h
MOV word ptr ES:[BX + 2], 1234h
80
Ancak bu ileme de gerek yoktur. Zaten kesme vektrne deer yerletiren ve o deeri alan
setvect ve getvect isimli fonksiyonlar vardr. Bir kesme kodu Cde interrupt anahtar
szcnden faydalanlarak da yazlabilir. Bu anahtar szck fonksiyonun geri dn
deeriyle ismi arasna yerletirilir. Bu tr fonksiyonlara parametre aktarm ama bakmndan
uygun deildir, yani tr fonksiyonlar parametresiz olmaldr. Bu tr fonksiyonlar derlerken
derleyici fonksiyon giriinde btn registerlar stacke PUSH eder, kta stackten POP
eder ve fonksiyonu IRET makine komutuyla sonlandrr. Bu tr fonksiyonlarn
adresleri(isimleri) segment ve offset ieren adres belirtir ve adresleri dorudan kesme
vektrne yerletirilebilir.
Kesmelerin Fonksiyonlar ve Alt Fonksiyonlar
Kesmelerin ana girii 256 tane olmasna ramen kesme koduna dallanld zaman
eitli registerlarn durumlarna baklarak ieride switch-case ilemiyle farkl yollara
saplabilir. Kesme kodundan saplan yollara kesmenin fonksiyonlar, kesmenin
fonksiyonlarndan saplan yollara kesmenin alt fonksiyonlar denir. Genellikle kesme
fonksiyonlarna sapmak iin Ah, alt fonksiyonlara sapmak iinse AL register kullanlr. bir
kesmenin fonksiyon ve alt fonksiyon numaralar kesme arlmadan nce AH ve Al
registerlarna yazlmaldr.
Kesmenin Parametreleri ve Geri Dn Deerleri
Kesme kodlar da parametre isteyebilirler. Parametreler kesme arlmadan nce
belirlenmi baz registerlara yerletirilirler. Kesme kodu altktan sonra bir deer iletecek
olabilir. Kesme kodu IRET ile sonlanmadan nce iletecei deerleri belirlenmi baz
registerlara yazar. kesmeyi aran kii o registerlardan geri dn deerini alr.
DOS ve BIOS Kesmeleri
Baz kesmelere ilikin kodlar EPROMa yerletirilmitir. Makine alr almaz bile
kodlar EPROMda hazr olarak bulunmaktadr. 1 Mb bellek alannn son 64 Kb EPROM
blgesidir. EPROM ierisindeki kesme kodlarnn bulunduu blme BIOS(basic inputoutput system) denir. adres alannn son 64 Kblk ksm(F0000-FFFFF) ksm ana kart
zerinde normal SIMlerden farkl bir yerdedir. Aslnda SIM ierisinde bu blgede vardr ama
donanmsal olarak buraya yaplan eriimler EPROMa ynlendirilmektedir. Yani biz son 64
Kba erimek istesek SIMe deil, EPROMa erimi oluruz. Ancak CMOS seenekleriyle
bilgisayar aldnda EPROMdaki al kodu EPROM ierisindeki BIOS kodlarn SIMe
tayabilir. Bylece SIMe eriim EPROMa eriimden daha hzl olduu iin hz kazanlm
olur. BIOS ierisindeki kesme kodlar iletim sistemi bile olmadan yaplacak en temel
ilemleri gerekletirebilecek kodlardr. nemli BIOS kesmeleri unlardr:
INT 13h
INT 10h
INT 16h
INT 14h
rnein iletim sisteminin yklenmesi iin 13h kesmesi kullanlmak zorundadr. Ya da bir
boot ynetici program klavyeden bilgiyi 16h kesmesiyle almak zorundadr.
81
DOS kesmeleri DOS iletim sistemi yklendikten sonra hayat kazanan kesmeleridir.
En nemli DOS kesmesi 21h kesmesidir. Denilebilir ki 21h kesmesinin fonksiyonlar zaten
DOSun kendisidir. DOS iletim sisteminin btn sistem fonksiyonlar 21h kesme kodu
biiminde organize edilmitir. Halbuki Windows ve UNIX sistemlerinde durum byle
deildir. rnein dosya ama-kapama, dosyadan okuma-yazma gibi ilemlerin hepsi 21h
kesmesinin fonksiyonlaryla yaplr. DOSun sistem fonksiyonlar yani 21h kesmesinin
fonksiyonlar eninde sonunda BIOS kesmelerini ararak aa seviye ilemlerini yapar.
rnein absread fonksiyonu 25h DOS kesmesinden baka bir ey deildir. Bu kesme ilemini
13h ararak yapmaktadr. Win32 ve UNIX sistemlerinde aa seviyeli ilemler genel
olarak BIOS kesmeleriyle yaplmaz. nk BIOS kesmeleri korumal modda alacak
biimde tasarlanmamtr. Bu iletim sistemleri BIOS kesmeleri ne yapyorsa onlar korumal
modda yapan kodlara sahiptir. Fakat yine de DOS ile ilikinin tam olarak kesilemedii Win9x
ve ME sistemlerinde vwin32.vxd device driverndan armalar yaparak ilemcinin modunun
deitirilmesi suretiyle BIOS ve DOS kesmeleri kullanlabilmektedir.
10h Video Kesmesi
10h BIOS kesmesi video kartyla ilgili btn nemli ilemleri yapmaktadr. rnein
video modun deitirilmesi, cursorn konumlandrlmas, ekrana btn video modlarna
uygun yazlarn yazlmas vs.
INT 10h, F:0Ah(write char)
Bu fonksiyon tm video modlarda cursorn bulunduu yere bir karakteri yazdrmak
iin kullanlmaktadr. Parametreler:
AH
AL
BH
BL
CX
0Ah
Karakter
Sayfa no
Renk bilgisi
Yazlacak karakter says
ax, 4c00h
82
int 21h
main endp
end main
.STACK 100h
/*****10hf0ah.asm*****/
INT 10h, F:0Eh(write char)
Bu fonksiyon da karakter yazmakta kullanlr. Karakter yazan DOS kesmesi dorudan
bu fonksiyonu armaktadr. Aslnda programlama dillerinde ekrana yaz yazan tm
fonksiyonlar sonunda bu fonksiyonu arrlar. Parametreler:
AH
AL
BH
BL
0Eh
Karakter
sayfa no
ekil rengi(grafik modda geerli)
83
push
ax
call
putchar
add
sp, 2
inc
si
@2:
cmp
byte ptr xname + si, 0
jnz
@1
mov
ax, 4c00h
int
21h
main endp
end main
.stack
/*****10hf0eh.asm*****/
0Eh fonksiyonunun 0Ah fonksiyonundan birka fark vardr. bu farklar 0Eh fonksiyonunun
tercih edilmesine sebep olur. Bunlar:
- 0Ah cursor ilerletmez, fakat 0Eh ilerletir.
- 0Eh fonksiyonu satr sonuna gelindiinde scroll yapabilmektedir.
- zel kontrol karakterleri iin(7, 9, 10, 13 ASCII numaral karakterler gibi) 0Ah
fonksiyonu ASCII tablosunda belirtilen grntleri kartr. Halbuki 0Eh fonksiyonu
bunlar iin bilinen ilevleri yerine getirir.
Bir data semboln indexlemek iin 3 yntem kullanlabilir. Data sembolnn ismi xname
olsun:
1.
84
mov [si], al
@3:
inc si
@1:
cmp byte ptr [si], 0
jnz @2
mov ax, 4c00h
int 21h
main endp
.stack 100h
end main
/*****upper.asm*****/
21h Kesmesi
21h kesmesi neredeyse DOS iletim sisteminin kendisidir. DOSun btn sistem
fonksiyonlar bu kesmenin fonksiyonlar biimindedir. 21h kesmesine DOS srmleriyle
birlikte yeni fonksiyonlar eklenmitir. 21h fonksiyonlar eninde sonunda 10h BIOS kesmesini
armaktadr. Yani seviye olarak BIOS fonksiyonlarnn yukarsndadr.
INT 21h F:01h
Parametreleri:
AH
01
Geri dn deeri:
AL
Okunan karakter
/*****getchee.asm*****/
Bu fonksiyon Ctrl-C ilemi ile 23h DOS kesmesini armaktadr. 23h DOS kesmesine
control break handler denir. DOS iletim sistemi 21h kesmesi ile 4Ch fonksiyonunu
ararak program sonlandrr. 23h kesmesi hook edilerek Ctrl-C ilemine kar zel eyler
yaptrlabilir. Ayrca bu fonksiyonun nemli bir zellii de udur: eer zel bir tua baslrsa
85
fonksiyon 0 deeriyle geri dner. Bu durumda ayn fonksiyon bir daha arlrsa karakterin
extended scan codeu alnr. Bu durumda Cde getch ya da getche fonksiyonlar
kullanlarak(bu fonksiyonlar zaten bu kesmeyi armaktadr) aadaki gibi scan code elde
edilebilir.
ch = getch();
if (ch == 0) {
ch = getch();
/*zel tu ilemleri*/
}
else {
/*normal tu ilemleri*/
}
2
Grntlenecek karakter
0Ah
Buffer
Bu fonksiyon arlmadan nce buffer ile tahsis edilen blgenin ilk bytenda en fazla ne
kadar karakter girileceine ilikin bir say bulunmaldr. Giri enter tuuna basldnda
sonlandrlr. Kesme girilen karakter saysn buffer alannn ikinci bytena yazar. Girilen
karakterler nc bytetan itibaren yerletirilmektedir. Girilen yaznn sonunda enter
karakteri bulunmaktadr. Ancak bu karakter buffern ikinci bytena yerletirilen sayya dahil
deildir(Buffern birinci elemanna yazdmz say enter dahil olmak zere girilerin
saysdr. Yani buradaki say 10 ise en fazla 9 karakter girebiliriz).
86
/*****21hfah.asm*****/
.model small
.data
xname db 10, 11 dup(?)
.code
main proc near
mov ax, @data
mov ds, ax
mov ah, 0ah
mov dx, offset xname
int 21h
mov ax, 4c00h
int 21h
main endp
.stack 100h
end main
/*****21hfah.asm*****/
25h
Kesme numaras
Yerletirilecek vektr adresi
35h
Kesme numaras
Geri dn deeri:
ES
BX
Segment adresi
Offset adresi
39h
Yaratlacak dizinin isminin bulunduu yaznn balang adresi
87
Geri dn deeri:
Fonksiyonun geri dn deeri ilemin baarsn anlatr. CF bayrana baklmaldr. CF
bayra set edilmi ise hata vardr, deilse ilem baarldr.
INT 21h F:9h
Bu kesme belirtilen bir adresten $ karakteri grlene kadar cursorn bulunduu
yerden itibaren yazar. 10h ya da 21h kesmelerinin NULL karakter grene kadar ekrana yaz
yazan bir fonksiyonu yoktur. Ekrana bir yaz basmak iin sembolik makine dilinde
kullanlacak en pratik yntem bu kesmedir. Parametreler:
AH
DS:DX
9h
Yaznn adresi
/*****21hf39h.asm*****/
.model small
.data
pathname db 80, 81 dup(?)
text1
db "Ltfen bir path giriniz:$"
text2
db "Dizin oluturulamad...$"
text3
db "Dizin oluturuldu...$"
.code
main proc near
mov ax, @data
mov ds, ax
mov ah, 9
mov dx, offset text1
int 21h
mov ah, 0ah
mov dx, offset pathname
int 21h
xor bx, bx
mov bl, pathname + 1
mov byte ptr pathname[bx + 2], 0
mov ah, 39h
mov dx, offset pathname + 2
int 21h
jnc @1
mov ah, 9
mov dx, offset text2
int 21h
jmp @2
@1:
mov ah, 9
mov dx, offset text3
int 21h
@2:
mov ax, 4c00h
int 21h
main endp
.stack 100h
88
end main
/*****21hf39h.asm*****/
Makro Kullanm
Makro bir kod yerine genellikle daha geni olan bir kodun yerletirilmesi ilemine
denir. makro sembolik makine dilinde nemli bir kullanma sahiptir. Sembolik makine dilinde
birka komut uzunluunda olan ve birok kez tekrarlanan kodlar sz konusudur. rnein ne
zaman ekrana bir yaz basacak olsak aadaki kalb kullanmamz gerekir:
MOV AH, 9
MOV DX, OFFSET sembol
INT 21h
Bu kadar kk bir kodun bir proc bildirimiyle yazlmas etkin bir yaklam deildir. nk
zaten bir alt programa parametrelerin aktarlmas ve onun arlmas bile komuttan daha
uzun srmektedir. te bu durumda bu kod kalbnn defalarca yinelenmesi kanlmaz olur.
Ancak bu durum kodun grnmn karmak hale getirmektedir. Bu karmak grnt
makro armalar biimine dntrlerek alglama kolaylatrlr. Bir makro arldnda
sembolik makine dili derleyicisi CALL makine komutu deil, makroyu oluturan kodun
tamamn koda dahil etmektedir. Makro tanmlamalarnn kendisi koda dntrlmez. Makro
tanmlamalar ya programn banda dzenli olarak yazlr, ya da Cde olduu gibi ayr bir
dosya biiminde yazlarak include edilir.
Makro Tanmlamann Genel Biimi:
<makro ismi> MACRO [parametreler]
ENDM
Parametreler aralarna boluk, TAB ya da virgl konularak yazlabilirler. Parametreler tpk
Cnin makrolar gibi makro kodlarnda yer deitirilmektedir. Bir makro yle arlr:
<makro ismi> [parametreler]
Parametreler arasna virgl, TAB ya da boluk yerletirilebilir. arma srasnda makro
parametreleri bir sembol, bir register ya da sabit olabilir.
/*****makro00.asm*****/
putstr MACRO str
mov ah, 9
mov dx, offset str
int 21h
ENDM
.model small
.data
city db "Eskiehir$"
.code
main proc near
mov ax, @data
mov ds, ax
89
putstr city
mov ax, 4c00h
int 21h
main endp
.stack 100h
end main
/*****makro00.asm*****/
Snf almas: Klavyeden INT 21h F:0Ah ile bir string alan makroyu yaznz. Bu makroyu
ararak klavyeden stringi alnz. Yaznn sonundaki CR(0xD) karakterini $ yaparak putstr
makrosuyla ekrana yazdrnz. Yazlacak makronun ismi getstr olup, buffer adresini parametre
olarak almaldr.
/*****makro00.asm*****/
;--------------------------------------------putstr MACRO str
mov ah, 9
mov dx, offset str
int 21h
ENDM
getstr MACRO str
mov ah, 0ah
mov dx, offset str
int 21h
xor bx, bx
mov bl, str + 1
mov byte ptr str[bx + 2], '$'
ENDM
;--------------------------------------------.model small
.data
city db "Eskiehir$"
strBuf db 80, 81 dup(?)
.code
main proc near
mov ax, @data
mov ds, ax
putstr city
getstr strBuf
putstr strBuf[2]
mov ax, 4c00h
int 21h
main endp
.stack 100h
end main
/*****makro00.asm*****/
Include lemi
Tpk Cde olduu gibi sembolik makine dilinde de bir baka dosya include edilebilir.
Sembolik makine dilinin bir n ilemcisi yoktur. Dosyann almas ilemi de derleyicinin
kendisi tarafndan yaplmaktadr. Dosya include etmenin genel biimi:
90
/*****util.inc*****/
91
/*****test.asm*****/
include util.inc
.model small
.data
.code
main proc near
initprg
getche
putch al
exitprg 0
main endp
.stack 100h
end main
/*****test.asm*****/
LOCAL Komutu
Sembolik makine dilinde tm kod ve data sembollerinden program boyunca tek bir
tane olmak zorundadr. Bu durum makro yazmlarnda probleme yol aabilir. nk
ierisinde kod sembol kullanlan bir makro iki kez arldnda ayn sembol kod ierisinde
iki kez grnecektir ve bu da error oluturacaktr. rnein:
putstr
MACRO str
LEA
BX, str
JMP
@1
@2:
MOV
MOV
INT
INC
AH, 2
DL, [BX]
21h
BX
CMP
JNZ
@1:
endm
makrosu
.DATA
xname
yname
db
db
ali sere, 0
necati, 0
.CODE
....
....
putstr
putstr
....
xname
yname
Bu komut makro her aldnda sembol deiik bir isimle oluturur. rnein Microsoft
derleyicileri LOCAL komutu ile belirlenmi olan sembolleri ??nnnn biiminde amaktadr.
Burada nnnn hex sistemde srekli arttrlan saylar ifade etmektedir. LOCAL komutu makro
ierisinde kullanlmaldr. Makro kodu;
putstr
MACRO str
LOCAL @1, @2
LEA
BX, str
JMP
@1
@2:
MOV
MOV
INT
INC
AH, 2
DL, [BX]
21h
BX
CMP
JNZ
@1:
endm
93
94
1.
2.
3.
4.
95
30
23 22
aret
stel ksm(8bit)
1100100.01
6(0110)
1.10010001 10010001
0
Kesir ksm
stel ksm
Say
C kodu kullanlabilir.
rnek uygulama: 0.125 saysn float say formatna dntrnz.
kilik dzende
stel ksm
Kesir ksm
aret biti
0.001
-3
1.0 0
0
96
Kesir ksm
stel ksm
Say
11110100001001000000
19
1.11101000010010000001110100001001000000
0
Kesir ksm
stel ksm
Say
stel ksm BIAS deeriyle topladmzda iki noktal sayy yksek anlaml
bytelarndan balayarak byte-byte karlatrma olanan elde ederiz. rnein iki pozitif
float saynn byklk kklk ilikisini aratracak olalm. Bu iki saynn en yksek anlaml
bytelarn karlatrrz. aretsiz olarak hangisi hangisinden bykse o say dierinden
byktr.
Float Snrlar erisinde En Byk Pozitif ve En Kk Pozitif Saylar Nelerdir?
En byk say: stel ksm 1111 1110(254) kesir ksm 00000000000000000000000.
En kk say: stel ksm 0000 0001(1) kesir ksm 00000000000000000000000.
En byk pozitif say
En kk pozitif say
Noktal say format yalnzca belirli saylar deil, +sonsuz, -sonsuz gibi teorik saylar
da desteklemektedir. Ayrca bu say formatnda normal bir say olarak yorumlanamayacak
kombinasyonlar da sz konusudur. zel deerler unlardr:
1. Sfr says. ki tane sfr says vardr. Kesir ksm 0, stel ksm 0, iaret biti 1 ya da 0 ise
bu say sfr olarak yorumlanr.
2. Saynn iaret biti ne olursa olsun stel ksm 0, ancak kesir ksm 0dan farklysa bu tr
saylara denormal saylar denir. Denormal saylar stel ksm sayy ifade edemeyecek
kadar kk saylardr ve geerli say olarak ele alnmazlar.
3. Saynn stel ksm 0000 0001 ile 1111 1110 arasnda ise kesir ksm ne olursa olsun bu
geerli bir saydr. Normal saylar bu biimde olmaldr.
4. stel ksmn btn bitleri 1 ise say kesir ksmna baklarak ya +sonsuz ya -sonsuz ya da
tanmsz bir say olur. stel ksmn hepsi 1, kesir ksm 0 ve iaret biti 0 ise +
sonsuz(01111111100000000000000000000000); stel ksmn hepsi 1, kesir ksm 0, iaret
biti 1 ise sonsuzdur(11111111100000000000000000000000). stel ksmn hepsi 1, kesir
ksm 0 d ise, iaret biti ne olursa olsun say tanmszdr.
97
63
62
aret biti
BIAS 1023
Long Double(extended real) Format
64 63
79
78
aret biti
BIAS 16384
Matematik lemcide Noktal Saylarla lemler
Btn matematik ilemci komutlar DE biiminde olan bir n ek ile balar. Normal
ilemci bu n eki grd zaman makine komutunu matematik ilemciye verir. Sembolik
makine dilinde noktal saylar zerinde ilem yapan komutlar F harfi ile balar. Matematik
ilemci komutlar operandsz olabilir, tek operandl olabilir, ya da ift operanda sahip olabilir.
Matematik ilemcinin stack sistemiyle alan 8 stack register vardr.
98
2. Baz komutlar stack gstericisinin gsterdii bilgiyi almakta kullanlr. Bu komutlarn bir
blm bilgiyi stack gstericisinin bulunduu yerden alr, fakat stack gstericisini
arttrmaz. Bir blm ise bilgiyi alr ve arttrr.
3. Transfer komutlarnn dnda ilem yapan komutlar vardr. Bu komutlar operandsz, tek
operandl ya da ift operandl olabilir. Operandsz komutlar stack gstericisinin gsterdii
ilk iki register zerinde ilem yapar. Tek operandl komutlar stack gstericisinin
gsterdii yerdeki bilgi ile bellek arasnda ilem yaparlar. ki operandl komutlar herhangi
iki data register arasnda ilem yaparlar.
FLD Komutu
Bu komut PUSH ilemini gerekletirir. Yani stack gstericisini 1 azaltr. Bilgiyi stack
gstericisinin gsterdii yere yazar. Balca biimleri unlardr:
1. FLD dword ptr mem Bellekteki float bilgiyi PUSH eder.
2. FLD qword ptr mem Bellekteki double bilgiyi PUSH eder.
3. FLD tbyte ptr mem Bellekteki long double bilgiyi PUSH eder.
4. FLD1
Bu komut operandszdr. 1 saysn PUSH eder.
5. FLDZ
Sfr saysn PUSH eder.
6. FLDPI
Pi saysn PUSH eder.
7. FLD2E
Logaritma 2 tabanna gre e saysn(log2e) PUSH eder.
8. FLD2T
Logaritma 2 tabanna gre 10 saysn(log210) PUSH eder.
9. FLDG2
Logaritma 10 tabanna gre 2 saysn(log102) PUSH eder.
10. FLDLN2 Logaritma e tabanna gre 2 saysn(loge2) PUSH eder.
FST ve FSTP Komutlar
FST stack gstericisinin gsterdii yerdeki bilgiyi almakta kullanlr. Ancak stack
gstericisini arttrmaz. FSTP gerek bir POP ilemidir. Stack gstericisinin bulunduu yerden
bilgiyi alr ve stack gstericisini arttrr. u biimleri vardr:
1.
2.
3.
4.
FILD komutu tam say formatndaki bir sayy matematik ilemcinin stack registerna
PUSH eder. ki temel biimi vardr:
1. FILD word ptr mem
2. FILD dword ptr mem
Burada belirtilen say her zaman iaretli olarak yorumlanr. Bu durumda Cdeki u
dntrme
double a;
int b;
a = b;
99
gibi bir makine kodu retir. Grld gibi Cde tam saylarla gerek saylar arasndaki
dntrmeler matematik ilemci komutlaryla yaplmaktadr.
FADD, FADDP Komutlar
Bu komutlar iki gerek sayy toplamakta kullanlr. FADD toplama ileminden sonra
sonucu stacke PUSH eder. FADDP toplama ilemi sonrasnda POP ilemi yapar.
1. FADD/FADDP dword ptr mem
2. FADD/FADDP qword ptr mem
Toplama rnekleri:
FLD m1
FADD m2
FSTP result
Bu ilem tipik olarak result = m1 + m2 ilemidir. Burada nce m1 stacke PUSH edilir. Sonra
stack gstericisinin gsterdii yerdeki bilgiyle m2 toplanr ve sonu POP edilerek resulta
alnr.
NOT: Sembolik makine dilinde eer bellek ya da bellek sabit ilemlerinde bellek olarak bir data sembol kullanlyorsa word
ptr, dword ptr gibi belirleme yapmaya gerek yoktur. Eer operand data sembol olarak deil de dorudan [ ] ierisinde
register biimiyle belirtilirse bu belirlemeler yaplmak zorundadr. Yani data sembolleri zaten uzunluk bilgisini iermektedir.
100
Stackin grnm:
101
/*****fadd00.asm*****/
FMUL ve FMULP Komutlar
Bu komutlar arpma ilemi yapar. temel biimi vardr:
1. FMUL/FMULP dword ptr mem
2. FMUL/FMULP qword ptr mem
3. FMUL/FMULP
FDIV ve FDIVP Komutlar
Bu komutlar blme ilemi yapar. temel biimi vardr:
1. FDIV/FDIVP dword ptr mem
2. FDIV/FDIVP qword ptr mem
3. FDIV/FDIVP
FSIN, FCOS, FTAN, FSQRT Komutlar
Bu komutlar trigonometrik ilemler yapar. Komutlarn tek biimi vardr. stack
gstericisinin gsterdii yerdeki bilgiyi ileme sokup yine ayn yere yazarlar.
Snf almas: Karekk alan mysqrt isimli fonksiyonu matematik ilemci kullanarak yaznz.
/*****fsqrt00.asm*****/
.model small
.code
_mysqrt proc near
PUSH BP
MOV BP, SP
FLD QWORD PTR [BP + 4]
FSQRT
POP BP
RET
_mysqrt endp
public _mysqrt
102
end
/*****fsqrt00.asm*****/
BORLAND derleyicilerin Matematik lemci Seenekleri
BORLAND derleyicilerinde Options Compiler Advanced Code Generation
Floating Point mnsnde 4 seenek vardr:
None
dd
dd
100
100.2
103
lk deer olarak verilen saynn sonuna "r" getirilebilir. "r" getirme ilemi say "." iermedii
zaman daha anlamldr. rnein iki gerek saynn toplanmas yle yaplr:
.DATA
x
dd
y
dd
z
dd
.CODE
fld
fadd
fstp
100.2
500.3
?
x
y
z
Normal ilemci, matematik ilemci komutunu matematik ilemciye verdikten sonra sonraki
komutla almasna devam eder. Oysa sonraki komut matematik ilemci komutndan sonra
altrlmak zorundadr. Yukardaki rnekte normal ilemcinin matematik ilemci
komutundan sonra matematik ilemcinin komutu tamamlanarak bekletilmesi gerekir. Bu
104
bekletme ilemi "wait / fwait" komutuyla yaplr (wait ve fwait komutlar ayn
komutlardr.). Bu komut, normal ilemci tarafndan ilenen bir komuttur. Bu komutu
normal ilemci aldnda matematik ilemci ilemini tamamlayana kadar bekler. Aslnda
wait komutu her matematik ilemci komutundan sonra yerletirilmek zorundadr. Wait
komutunun gerekip gerekmedii sonraki komuta baldr. Ancak sembolik makine dilinde
ne olursa olun matematik ilemci komutlarnda sonra "wait"komutunu yerletirmek pratik
bir zmdr. Pepee matematik ilemci komutlar geliyorsa tm komutlardan sonra bir
kez wait yerletirmek yeterlidir.
2. Dier bir senkronizasyon problemi yalnzca 80x86 ilemcisinde sz konusu olmaktadr.
nk bu senkronizasyon problemi 80x88, 80286, 80386 ve Pentium modellerinde
ilemci tarafndan otomatik bir biimde zlmtr. Yani bu senkronizasyon problemi
bugn tamamen problem olmaktan karlmtr. Bu durumda bir normal ilemci
komutundan sonra bir matematik ilemci komutu geliyorsa 80x86 ilemcisinin pipeline
mekanizmasnn tasarmndan dolay problemli bir durumm ortaya kabilmektedir.
Normal ilemci komutu ilerken sonraki komutun matematik ilemci komutu olduunu
grdnde daha o komutu bitirmeden sonraki komutu matematik ilemciye iletir. Bu
durumda ayn senkronizasyon problemi ortaya kmaktadr. zm normal ilemci
komutundan sonra matematik ilemci komutundan nce wait komutunu yerletirmekle
zlebilir.rnek:
mov
wait--->
fld
[SI],ax
dword ptr [SI]
Bu problem yalnzca 80x86 iin sz konusudur. Dier ilemciler zaten otomatik olarak eer
normal ilemci komutundan sonra matematiki ilemci komutu geliyorsa zaten pipeline
ilemini yapmayp beklemektedir. MASM ve TASM derleyicilerinde default durum 80x86 ve
80x87 ilemcilerine gre kod retimidir (Bu durum deitirilebilir, ileride ele alnacaktr ). Bu
durumda MASM ve TASM default olarak normal ilemci komutlarndan sonra matematik
ilemci komutu geliyorsa kendisi wait komutunu yerletirir. Wait komutlar genel olarak
performans zerinde ciddi bir etkiye yol amaz. Sembbolik makine dili derleyicisinin bu
durmda wait koumtunu otomatik eklemesinin nedeni bu komutun dier ilemcilerde
gerekmeyebilecei iindir.
Konunun zeti: Biz matematik ielemci komutlarnda sonra normal ilemci komutu
geliyorsa wait komutunu yerletirmeliyiz. Ancak normal ilemci komutunda sonra matematik
ilemci komutu geliyorsa wait komutunu yerletirmemeliyiz.
Wait komutunun alma biimi:
Normal ilemcinin "test", matematik ilemcinin "busy" ular vardr.
TEST .<--- .BUSY
CPU
MATH Proc
Wait komutu aslnda ilemcinin "test" ucunu rnekler. Test ucu logic 0'da olduu srece
ilemciyi durdurur. Matematik ilemci her komutun almasn bitirdiinde busy ucunu ksa
105
bir sre logic 1 durumuna eker. Sonra yeniden bu ucu logic0 durumuna drr. Bylece
normal ilemciyi wait komutundan aslnda matematik ilemci sayesinde kmaktadr.
Gerek Saylarn Karlatrlmas :
Normal olarak iki noktal saynn tam eitliinin karlatrlmas anlaml bir durum deildir.
Bemzer biimde byklk-kklk karlatrlmas da anlaml olmayabilir. nk
karlatrma ilemleri yuvarlama hatalarn dikkate almadan kesin deerler zerinde
yaplmaktadr. rnein ;
2/3 + 4/7 = 4/7 + 2/3 saysna eit olmayabilir. Yani iki say noktadan sonra ayn olabilir.
Ancak matematik ilemci komutuyla karlatrrsak mantksal anlamda ok kk bir sapma
yznden ayn kmayacaktr.
Status Register(status word)
Bu register, tpk normal ilemcinin bayrak register gibi grev yapar. eitli bitlere
sahiptir. 16 bit uzunluundadr. u durumlara yant veren bayraklar vardr:
-
FSTSW reg
14
C3
13
12
SP
11
10
C2
9
C1
8
C0
7
IR
IE(invalid operation)
DE(denormalized operand)
ZE(zero divide)
OE(overflow)
UE(underflow)
PE(precision)
IR(interrupt request)
SP(stack pointer)
C0, C1, C2, C3(condition code)
B(busy)
106
6
?
5
PE
4
UE
3
OE
2
ZE
1
DE
0
IE
ki noktal sayy karlatrmak iin FCOM komutu kullanlr. Bu komut status registern C0,
C2, C3 bayraklarn etkiler. Sonu bu bayraklara baklarak belirlenir. FCOM komutunun
biimleri unlardr:
1. FCOM
2. FCOM ST(n)
3. FCOM mem
Bu komutun FCOMP isimli POPlu versiyonlar da vardr. Tipik bir karlatrma ilemi
yle yaplr:
rnein a ile b karlatrlacak olsun
FLD a
FCOMP b
ile yaplabilir.
Normal lemcilerde Bayrak Register zerinde lemler
Bayrak registerndaki bayraklar zerinde ilemler yapmann 3 yolu vardr:
1. CF, DF ve IF bayraklarn set ve reset eden zel komutlar kullanmak. Bu komutlar: CLC,
STC, CMC, CLI, STI, CLD, STD.
2. PUSHF komutuyla bayrak registern stacke atp burada dzeltme yaptktan sonra POPF
ile geri ekmek.
PUSHF
MOV BP, SP
MOV AX, [BP]
....
MOV [BP], AX
POPF
107
15
14
C3
13
12
11
10
C2
9
C1
8
C0
7
TF
6
ZF
4
AF
2
PF
0
CF
Assembler karl
FLD a
FCOMP b
FSTSW AX
WAIT
SAHF
JZ @1
fade2
JMP @2
@1:
ifade1
@2:
108
C kodu
Assembler karl
FLD a
double a, b;
if (a <= b)
ifade1;
else
ifade2;
FCOMP b
FSTSW AX
WAIT
SAHF
JBE @1
fade2
JMP @2
@1:
ifade1
@2:
komutlarndan sonra toplam yerel deikenlerin miktar kadar SP register geriye ekilir. n
yerel deikenlerin toplam byte says olmak zere, bu ilem
SUB SP, n
ile gerekletirilebilir. Yerel deiken kullanan tipik bir fonksiyonun giri kodu yledir:
PUSH BP
MOV BP, SP
SUB SP, n
Bu durumda yakn modellerde yerel deikenler iin aadaki gibi taral bir blge
oluturulmu olur.
Burada artk SP PUSH ilemlerinde normal olarak kullanlabilir. Yani PUSH ve POP
ilemleri taral blgeyi bozmaz. Taral blgeye BP k gibi bir ifadeyle eriilebilir.
Derleyiciler yerel deikenleri srasyla taral blgede olutururlar. rnein func fonksiyonu
aadaki gibi olsun:
void func(int a, int b)
{
int x, y, z,m ;
.....
}
yerleim yaplmaktadr. Yukarda belirtilen func fonksiyonu iin giri kodu aadaki gibi
olacaktr:
PUSH BP
MOV BP, SP
SUB SP, 8
110
eitli rnekler
Aada yerel deiken kullanan fonksiyonlarn sembolik makine dili karlklar
verilmitir. Yerel deikenlerin yerleim biimi olarak Borland C 3.1 + Microsoft C sistemi
kullanlmtr.
C kodu
Assembler karl
result = a + b;
return result;
}
/*****yerel001.c*****/
/*****yerel001.asm*****/
C Kodu
Assembler karl
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void main(void)
{
int x = 10, y = 20;
swap(&x, &y);
}
/*****yerel002.c*****/
/*****yerel002.asm*****/
111
Borland derleyicisinin rettii asm dosyasndan ? ile balayan debug satrlarn temizleyen
program:
/*****trimasm.c*****/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define LINELEN
#define MAXPATH
1024
80
112
/*****trimasm.c*****/
Bir dizi sz konusuysa, Cnin kurallar gerei, hangi derleyici sz konusu olursa olsun,
dizinin ilk eleman dk adreste olmak zorundadr.
C kodu
Assembler karl
void main(void)
{
char s[4];
s[0] = a;
s[1] = l;
s[2] = i;
s[3] = \0;
puts(s);
}
/*****yerel003.c*****/
/*****yerel003.asm*****/
C kodu
Assembler karl
void main(void)
{
int a = 10;
int *p;
/*****yerel004.c*****/
/*****yerel004.asm*****/
p = &a;
*p = a;
113
C kodu
Assembler karl
void main(void)
{
char *p;
.data
s@
p = Ankara;
puts(p);
}
/*****yerel005.c*****/
db
Ankara, 0
/*****yerel005.asm*****/
Derleyiciler genellikle bir diziye kme parantezleriyle ilk deer verildiinde verilen ilk
deerleri .data alannda statik olarak saklarlar. Daha sonra memcpy gibi bir kopyalama
fonksiyonu kullanarak diziye kopyalarlar. Byle bir ilem derleyici bakmndan daha pratiktir.
Cde kme parantezleri ierisinde verilen ilk deerlerin sabit ifadesi olma zorunluluu da
buradan gelmektedir. Eer derleyici ilk deerleri .data blgesine yazp kopyalama
yapmasayd dizi ok uzun olduunda elemanlara tek tek atama yapmak iin ok fazla mov
komutu gerekirdi. Burada zaman deil, bir kod optimizasyonu dnlmektedir.
C kodu
Assembler karl
void func(void)
{
int a[] = {1, 2, 3, 4, 5};
}
.data
a@
/*****yerel006.c*****/
/*****yerel006.asm*****/
dw
1, 2, 3 ,4, 5
Nokta(.) operatryle bir yap elemanna eriilmek istendiinde derleyici dorudan eriilecek
elemann offsetini bularak eriimi gerekletirebilir. rnein:
114
C Kodu
Assembler karl
struct SAMPLE {
int a;
long b;
char c;
};
.data
s@ db %d %lf %c, 10, 0
.code
_main proc near
push bp
mov bp, sp
sub sp, 7
mov word ptr [bp - 7], 10
mov word ptr [bp - 5], 20
mov word ptr [bp - 3], 0
mov word ptr [bp 1], 97
mov al, [bp 1]
cbw
push ax
push word ptr [bp 3]
push word ptr [bp 5]
push word ptr [bp 7]
mov ax, offset s@
push ax
call _printf
add sp, 10
mov sp, bp
pop bp
ret
_main endp
void main(void)
{
struct SAMPLE x;
x.a = 10;
x.b = 20;
x.c = a;
printf(%d %lf %c\n, x.a, x.b, x.c);
}
/*****yerel007.c*****/
/*****yerel007.asm*****/
aretli tamsay trn daha uzun iaretli tamsay trne dntren makine komutlar:
1. CBW
ALAX
2. CWD
AXDX:AX
3. CWDE
AXEAX
4. CDA
EAXEDX:EAX
115
Hizalama(Alignment)
16 bit 8086 ve 8088 ilemcileri 2 byte zerinde ilem yaparken ift bellek adreslerine
tek bellek adreslerinden daha hzl eriim yapar. Benzer biimde 80386 ve sonras ilemciler 4
byte bellek operand zerinde alrlarken adres 4n katlarnda ise daha hzl eriim
gerekletirirler. Bunun nedeni CPU ile bellek arasndaki bellek biimindendir.
Tipik bir 32 bit Intel ilemcisi bellek ile 30 adres ucu, 32 veri ucu kullanlarak
balanmtr. lemci bellekten ancak 4n katlarndan 4 byte ekebilmektedir. rnein
ilemci bir hamlede 28inci bytetan balayarak 4 byte ekebilir. Peki 30uncu bytetan
balanarak 4 byte ekilmek istense ne yapacaktr? lemci her adrese ilikin komutu kabul
eder. Ancak bunu tek hamlede deil, kendi ierisinde iki hamlede gerekletirir. lemci nce
28inci bytetan 4 byte eker, bunun yksek anlaml iki byten saklar. Sonra 32inci bytetan
4 byte eker ve bunun da dk anlaml iki byten saklayarak, ancak iki seferde bellee
erierek ilemini tamamlar. Yani komut altrlmaktadr ama iki aamada ilem yapld
iin daha yava almaktadr. Eer btn nesneler 4n katlar olsayd, ilemci bunu kendi
ierisinde tek hamlede yapacak ve daha hzl alacaktr. Hizalama derleyicinin 16 bit
ilemcilerde nesnelerin ikinin katlar olan adreslerde, 32 bit ilemcilerde 4n kat olan
adreslerde tutmaya gayret etmesidir. Bir bytelk bir nesnenin herhangi bir adreste
tutulmasnn bir zarar yoktur. Hizalama bir bytetan uzun olan nesneler iin sz konusudur.
rnein 16 bit ilemcide hizalama uygulanmak istensin, aadaki fonksiyondaki yerel
deikenlerin tahsisat nasl olacaktr?
void func(void)
{
char c;
int a;
}
Derleyici a deikeni ift adrese gelecek biimde c ile a arasnda boluk brakarak yerleim
uygular.
Word Hizalamas(word alignment)
16 bitlik derleyiciler word hizalamas seeneine getirildiklerinde aadaki gibi
davranrlar:
1. Fonksiyon blok girilerinde SP her zaman ift adreste olur.
2. char tr dndaki tm trler ift adresten balayarak yerletirilir.
3. Yap deikenlerinin kendisi ift adresten balar. Yapnn char d elemanlarnn hepsi
ift adreste bulunmak zorundadr. rnein:
struct SAMPLE {
char a;
int b;
};
sizeof(struct SAMPLE)
116
alignment
117
x.maxcolor = ?
Bu kod word hizalama seeneinde derlenip altrlrsa yap elemanlaryla dosyadaki
deerler akamayacaktr. Problemi zmek iin derlemenin byte hizalamasnda
yaplmas gerekir. Tabii dosya formatn tasarlayan byle bir problem ksn istemiyorsa
btn elemanlar ift uzunlukta tanmlayarak hizalama problemini daha tasarm
aamasnda ortadan kaldrabilir.
2. Bazen farkl bir hizalama biimi kullanlarak eitli fonksiyonlar derlenerek ktphaneye
yerletirilmi olabilir. Bu fonksiyonlar zellikle bir yap deikeninin adresini parametre
olarak alyorsa hizalama problemi ortaya kabilir. rnein ktphaneye yerletirilmi
olan fonksiyon word hizalamas kullanlarak derlenmi olabilir. Biz o fonksiyonu byte
hizalamas kullanlan bir koddan armaya alrsak problem ortaya kar. Bu durumda
tasarmc olarak bir yap kullanan fonksiyonu ktphaneye yerletireceksek yapnn
elemanlarn char yerine int trnden ifade etmeliyiz. nk int tr mikroilemcinin bir
register uzunluu kadar seilir ve hizalama problemi oluturmaz.
ANSI C standartlarnda hizalama konusunda belirleyici bir ifade kullanlmamtr.
Yalnzca yaplarn ele alnd blmde hizalama yznden yap elemanlar arasnda
boluklarn olabileceinden bahsedilmitir. Hizalama kurallar tamamen derleyiciyi yazanlara
braklmtr. Bu yzden farkl derleyicilerin farkl hizalama kurallar olabilir.
Bu durumda bir derleyicide yazlm ve derlenmi modln byte hizalamas dnda
bir hizalama kullanlmsa probleme yol aabilecei unutulmamaldr.
Yap gstericisi kullanarak yap elemanlarna ok operatryle ulamak aadaki gibi
olmaktadr.
C kodu
struct SAMPLE {
int a;
long b;
char c;
};
/*****yerel008.asm*****/
118
/*****yerel008.c*****/
Fonksiyon gstericileri dolayl call komutuyla ifade edilir.
C kodu
Assembler karl
void func(void)
{
}
void main(void)
{
void (*p)(void);
p = func;
p();
}
NOT:Kod
119
gizlice geirilir. Yani 16 bit yakn modellerde [bp + 4]te, uzak modellerde ise [bp + 6]dadr.
Derleyiciler genellikle this gstericisini bir indeks registera ekip, snfn veri elemanlarna
normal bir yap gibi eriirler. Bir ye fonksiyon ierisinde baka bir ye fonksiyonun
arlmas durumunda da fonksiyon ald this adresini, tekrar stacke push ederek dier ye
fonksiyonu armaktadr.
C++ kodu
Assembler karl
class Date {
public:
void Disp(void) const;
void Verify(void) const;
void Set(int d, int m, int y);
private:
int day, month, year;
};
.data
s@ db %d/%d/%d, 10, 0
.code
@Date@Set proc near
push bp
mov bp,sp
push si
mov si,word ptr [bp+4]
mov ax,word ptr [bp+6]
mov word ptr [si],ax
mov ax,word ptr [bp+8]
mov word ptr [si+2],ax
mov ax,word ptr [bp+10]
mov word ptr [si+4],ax
push si
call @Date@Verify
pop cx
pop si
pop bp
ret
@Date@Set endp
@Date@Disp proc near
push bp
mov bp,sp
push si
mov si,word ptr [bp+4]
push word ptr [si+4]
push word ptr [si+2]
push word ptr [si]
mov ax,offset s@
push ax
call near ptr _printf
add sp,8
pop si
pop bp
ret
@Date@Disp endp
@Date@Verify proc near
ret
@Date@Disp endp
_main proc near
push bp
mov bp,sp
sub sp,6
mov ax,2001
push ax
mov ax,1
push ax
120
mov ax,18
push ax
lea ax,word ptr [bp-6]
push ax
call @Date@Set
add sp,8
lea ax,word ptr [bp-6]
push ax
call @Date@Disp
pop cx
mov sp,bp
pop bp
ret
_main endp
/*****yerel010.cpp*****/
/*****yerel010.asm*****/
Cde Deiken Sayda Parametre Alan Fonksiyonlarn Sembolik Makine Dilinde Yazm
Cde printf, scanf gibi bir grup fonksiyon istenildii kadar ok sayda parametre
alabilmektedir. Deiken sayda parametre alan fonksiyonlarn prototipleri ...(ellipsis)
iermektedir. rnein:
func(int x, ...);
Deiken sayda parametre alan fonksiyonlar iin derleyici yalnzca zorunlu parametreleri
kontrol eder. Dier parametreleri kontrol etmez. Ancak fonksiyon arlrken ifade ierisinde
yazlm olan btn parametreler sadan sola dier fonksiyonlarda olduu stacke push edilir.
Ancak prototipte belirtilmeyen parametreler iin aktarm srasnda int trne ykseltme ve
double trne ykseltme kurallar uygulanr. rnein char int biiminde, float parametre ise
double tr biiminde stacke push edilecektir.
rnein aadaki gibi arlm olsun:
int a, b;
...
printf(a = %d, b = %d\n, a, b);
Programn ak printf fonksiyonuna girip stack frame dzenlendikten sonra stack blgesinin
grnts yle olacaktr:
SP
121
BP
BP
IP
Yaz adresi
A
B
printf fonksiyonunu tasarlayan kii yalnzca zorunlu parametre olan yaz adresinin [bp + 4]te
olduundan emin durumdadr. Ancak fonksiyon arldnda ka parametrenin stackte
olduunu bilemez. printf birinci parametredeki yazy yorumlayarak fonksiyonun ka
parametreyle arldn anlar. Yapaca ey % ile balayan format karakterlerini saymaktr.
Tabii printf fonksiyonu ayn zamanda stacke push edilmi olan parametrelerin uzunluklarn
da bilmek zorundadr. Bunu format karakterine bakarak anlar. rnein ilk parametre %ld ise
long bir say yazdracaktr. Bu sayy [bp + 6]dan balayarak 4 byte ekecektir. Sonraki
parametre %d ise [bp + 10]dan 2 byte ekecektir. Bylece bir format karakteri uygunsuz
girildiinde dier parametrelerin de yanl display edilme olasl vardr.
Deiken sayda parametre alan saylarda fonksiyona yazan kii fonksiyonun o anda ka
parametreyle arlm olduunu bilmek zorundadr. Bunun iin birinci parametreyi inceler ve
duruma gre stack'ten gerekli sayda parametreleri eker. rnein prototipi aadaki gibi
olan bie fonksiyon tasarlayalm:
Fonksiyonun birinci parametresi ka say girildiini gstersin, fonksiyon dier parametrelerin
toplamna geri dnsn.
Bu fonksiyonun makine dilinde yazlm yle olabilir:
.model small
.CODE
_sum proc near
push bp
mov bp,sp
push si
xor
ax,ax
mov cx,[bp+4]
mov si,6
jmp @1
@2:
add ax,[bp+si]
add si,2
@1:
dec
cx
jnz
@2
pop si
pop bp
ret
_sum endp
122
123
Burada kullanlan "size" baka bir makrodur. Birinci parammetrenin tr char ise, bir sonraki
parametrenin tr 1 deil 2 byte sonra olmaldr. va-start makrosu arldktan sonra
makronun birinci parametresinde stack'teki ilk parametreden sonraki parametrenin adresi
vardr.
Bu makro ilk parametreden sonraki parametrenin adresini makronun birinci pararnetresiyle
belirtildii gstericiye atar. Bu makro aadaki gibidir:
#define size(x)
3) va_arg makrosu birinci parametresinde va_list trnden bir deiken, ikinci parametresinde
tr belirten bir szckle arlr.
rnein:
x = va_arg(ap, int);
Bu makro birinci parametreden sonraki parametrenin belirtilen trde olduunu varsayarak onu
elde eder ve makoronun birinci parametresiyle belirtilmi olan nesneyi sonraki parametre iin
gnceller.
#define va_arg(ap,type)
size(type)))
lem bitirildikten sonra va_end makrosu va_list trnden deikenle arlr. Bu armaya
Intel sisteminde gerek yoktur. Dolaysyla bu makro yerine boluk atanarak silinir. Ancak
baka ilemlerde bu makro gerekebilir.
#define va_end(ap)
((void)0)
va_arg iin not: ap nce artrlr ve artrlm adres deeri ap'ye atand.imdi normalde
gsterilmesi istediimiz parametrenin 1 tesinde (parametrenin kendi boyu kadar ) Ama
geriye nceki adres deerindeki bilgiyle dner. ama poinet'a atama yaplmaz. (Virgln sa
taraf) Bylece gncelleme ilemi yaplm olur.
int sum(int n,....)
{
int total = 0, i;
va_list ap;
va_start(ap, n);
for(int i = 0; i < n; ++i)
total += va_arg(ap, int);
va_end(ap);
return total;
}
Btn bu makrolar stdarg.h iindedir.
124
125
es:[si],...
lds, les, lfs, lys Makine Komutlar:
Kullanm Biimleri:
lds
les
lfs
reg,mem
reg,mem
reg,mem
126
lgs
reg,mem
near
bp
bp,sp
sp,4
si
word ptr [bp-4],0
word ptr [bp-2],0xB800h
si,dword ptr [bp-4]
byte ptr es:[si],61h
si
sp,bp
bp
127
3) 8254 yoluyla IRQ olutuunda iletin sistemi kontrol ele alr. O anda almakta olan
prosesin register bilgilerini "Process Database" iinde bir blgeye yazar. almaya devem
edecek olan sradaki prosesin register bilgilerini o prosesin "Process Databese"inde alarak
CPU register'larna ykler. Bu biimde kodlar arasndaki geie "Context Switch" ya da
"Task Switch" denir. Prosesler arsndaki gei sresine "quanta sresi" denir. WIN32
sistemlerinde bu sre 20 ms kadardr. Quanta sresi ok kk olduunda proseslerin
almas yavalar. ok yksek olduunda prosesin dardaki olaylar takip edebilme
yetenei zayflar.
CPU Konumunun Saklanp Geri Yazlmas Srasnda Dikkat Edilecek Durumlar
1) CS ve IP deerlerinin saklanp yklenmesi:
CS register' dorudan MOV komutuyla bellee alnabilir. Ancak IP ile MOV komutu
uygulanamaz. Aadaki program parasyla CS ve IP'yi saklayabiliriz:
mov
call
mem1,cs
@1
pop
mem2
@1:
Bazen saklanacak IP deeri ileride baka bir blgeye ilikin olmas istenebilir. Bunun iin
aadaki gibi bir yntem izlenebilir:
mov
call
mem1,cs
@1
add
-----
ax,offset @2-offset @1
@1:
@2:
cs,mem1
mem2
nk;
mov cs,mem1
ilemniden sonra artk CPU baka yerden komut almaya balayacaktr. CS ve IP
register'larnn ayn anda yklenmesi gerekir. Bunun bir ka yntemi vardr.
128
a)
push
push
retf
mem1(CS)
mem2(IP)
mem1,ss
mem2,sp
mov
mov
ss,mem1
sp,mem2
cli
sti
durumlarda i ie
129
ax,ds
es,ax
ds,[si+n]
bop,es:[si+m]
130
setjmp Fonksiyonu
Bu fonksiyon arld yerdeki CPU konumunu alarak parametresiyle belirtilen
jmp_buf yaps ierisinde saklar. Prototipi:
int setjmp(jmp_buf jmpb);
Fonksiyonun birinci parametresi daha nce setjmp ile saklanlan CPU bilgileridir. kinci
parametre geri dnldnde setjmpdan hangi deerle klacan belirlemekte kullanlr.
Normal olarak bu deerin 0 d bir deer olmas gerekir. Zaten 0 verilse bile fonksiyon bunu
0 d bir deere ekmektedir. setjmp ve longjmp fonksiyonlarnn prototipleri setjmp.h
dosyas ierisindedir.
131
/*****longjmp0.c*****/
132
O halde BP + 4ten elde edilen deer yerletirme yaplacak yapnn adresidir. Daha sonra SI
push edilip bu adres SIya alnmtr. Artk yap elemanlarna [SI + n] ifadesiyle eriebiliriz.
yapmakla setjmp fonksiyonunun kndaki durumu saklam oluyoruz. longjmp ile geriye
dn yapldnda SPnin durumu setjmp fonksiyonunun arlmadan nceki durumu
olmaldr.
133
gibi bir komut uygulayacak, bylece stack orijinal deerine geri dnecektir. setjmp knda
AX 0 olmaldr. longjmp ile registerlar belirlenen srada yklenirler. CS ve IPyi ayn anda
deitirmek iin FAR JMP ya da RETF komutlar uygulanabilir. rneimizde RETF tercih
edilmitir.
/****longjmp1.asm*****/
/****longjmp2.prj*****/
/****longjmp3.c*****/
DOSta Uzak Modellerde lemler
Bilindii gibi DOSta medium, large ve huge modeller uzak modellerdir. Bellek
modellerinin teknik aklamas ayrntl segment tanmlamalarndan sonra yaplacaktr. C
derleyicilerinin balang kodlar bellek modellerine gre segment registerlar eitli
deerlerde tutmaktadr.
Tiny Model
Bu modelde tm segment registerlar ayn deerdedir. Bu durumda programda CS = DS
= SS olduu iin toplam kod, data ve stack 64Kb geemez.
Small Model
Bu modelde CS bamsz bir 64Kb gsterir. DS = SS biimindedir. Program kodu
64Kb geemez, toplam statik data ve stack 64Kb geemez.
Medium Model
Bu modelde kod 64Kb geebilir. Bu durumda btn fonksiyon armalar far call ile
yaplr. Fonksiyon gstericileri default olarak uzak gstericidir. Yine bu modelde DS,
SSe eittir. Bu durumda default gstericiler yakn gstericilerdir. Programn stack ve data
blmleri toplam 64Kb geemez.
Compact Model
Bu modelde programn tek bir kod segmenti vardr. Ancak DS ile SS birbirinden
ayrlmtr. Bu durumda toplam statik data ayr bir 64Kb, toplam stack yine ayr bir 64Kb
134
/*****far0000.c*****/
proc bildiriminin near ya da far olmasnn etkisi udur: far proc bildiriminde call
makine komutunda far anahtar szc belirtilmese bile bu komut default olarak far
biiminde ele alnr. Oysa near proc bildiriminde default olarak near call biiminde ele
alnacaktr. Ayn zamanda far proc bildirimi ierisinde yalnzca ret makine komutunu
yazdmzda derleyici bunu otomatik olarak retf olarak alglamaktadr. Oysa near proc
bildirimi ierisinde ret makine komutlar yine ret olarak ele alnmaktadr.
Derleyiciler baka bir segmente erimek istediklerinde CS, DS, SS segment
registerlaryla oynamak yerine ES segment registern ykleyip segment ykleme
komutlaryla eriim yaparlar. C derleyicileri fonksiyon arldktan sonra ES registernn
bozulmu olabileceini dnrler. Dolaysyla fonksiyon ierisinde genel amal
registerlarn yan sra ES segment registern da saklamak zorunda olmadan bozabiliriz.
/*****far00000.asm*****/
_func proc far
push bp
mov bp,sp
les bx,dword ptr [bp+6]
mov word ptr es:[bx],20
pop bp
ret
135
_func endp
_main proc far
push bp
mov bp,sp
sub sp,2
mov word ptr [bp-2],10
push ss
lea ax,word ptr [bp-2]
push ax
call _func
add sp, 4
mov sp,bp
pop bp
ret
_main endp
/*****far00000.asm*****/
Win32/UNIX Flat Model Sistemi
Win32/UNIX sistemlerinde DOSta olduu gibi bir bellek modeli kavram yoktur. bu
sistemler korumal modda alrlar. Flat model sisteminde segment register2lara gereksinim
kalmamtr. Tm segment registerlar 0 gsterir. Bellein her tarafna yalnzca 4 bytelk
offset bilgisiyle eriilir. Dolaysyla flat modelde:
1. Btn call ilemleri near call biimindedir. Ancak bilindii gibi stack ilemleri 4 byte
zerinden yrtlr. Dolaysyla IP deil EIP register 4 byte olarak stacke atlacaktr.
2. Btn gstericiler ve fonksiyon gstericileri yakn gstericilerdir. Yani yalnzca 4 bytelk
offset bilgisi ierirler(32 bit korumal modda segment bilgisi de kullanlyor olsayd
gstericiler 6 byte uzunluunda olurdu).
Ayrntl Segment Tanmlar
Biz imdiye kadar basitletirilmi segment kavramn kullandk. Ancak yaptmz
ilem karmak bir tanmlama biiminin kolaylatrlm biimiydi. Segment bir programda
64Kbtan kk ya da eit olan ardk kod ya da data alandr. Aslnda bir program
segmentlerden oluur. Segmentler 64Kb olmak zorunda deildir. Daha kk olabilir. Bir
programda birden fazla segment olabilir. Her bir segment ayr bir yer sayacna(location
counter) sahiptir. Yani bir segmentin ierisindeki btn data ve kod sembolleri 0 numaral
yer sayacndan itibaren offset belirtmektedir. Tipik olarak bir segmentin balang paragraf
adresi bir segment registera atanr. Bu durumda segment ierisindeki semboller segmentin
bandan itibaren bir offset belirtirler.
Segment Tanmlama leminin Genel Biimi
<segment ismi> segment [hizalama biimi] [birletirme biimi] [snf biimi]
....
....
....
<segment ismi> ends
rnein:
_MYSEG segment
136
.....
.....
_MYSEG ends
b.asm
myseg segment para public
....
(4)
....
myseg ends
(3)
137
yourseg ends
myseg segment para public
....
....
myseg ends
Burada linker 1, 3 ve 4 numaral segmentleri birletirerek exe dosya ierisinde bir araya
getirir. Yani exe ierisinde bu segmentler kesinlikle ardk bulunacaktr. Bu segmentlerin
birletirilmesinde birbirlerine gre olan durumu modllerin link edili srasna bal olarak
deiir. public ile ayn isimli segmentler birletirilebilir. Ayn isimli public birletirme
biimine sahip olan segmentlerin hizalama biimleri ayn olmaldr. nk hizalama biimi
segment bellee yklendiinde hangi katlardan balayacan belirlemekte kullanlr. Bakas
tarafndan yazlm olan bir segment ile birletirilecek bir kodumuz varsa biz kodumuzu o
kodla ayn isimli segment ierisine yazmalyz ve birletirme biimi olarak da public
kullanmalyz. Linker ayn isimli public birletirme biimine sahip segmentlerin toplam
uzunluunun 64Kb geip gemediini kontrol eder. Toplam uzunluk 64Kb geiyorsa ilem
link aamasnda error ile sonulanr. rnein C derleyicileri small modelde alrken btn
fonksiyonlar _TEXT isimli ve public birletirme biimine sahip bir segmentin ierisine
yazarlar. Bu durumda biz program ne kadar ok modlden oluacak biimde yazarsak
yazalm, yine toplam kod 64Kb geemeyecektir. nk btn modllerde kodlar hep
_TEXT isimli segment ierisine yerletirilir. Linker bunlar birletirirken problemle karlar.
Birletirme biimi stack anahtar szc de olabilir. stack birletirme biimine sahip
olan segment linker tarafndan otomatik olarak stack segment olarak yorumlanr. Yani linker
exe dosyay olutururken SS registernn balang konumunu stack birletirme biimine
sahip olan segmentin paragraf adresi olarak belirler. SP registern da bu segmentin
sonunda olacak biimde konumlandrr. Stack birletirme biimi ayn public birletirme
biimi gibi ilem grr. Yani ayn isimli stack birletirme biimine sahip olan segmentler tek
bir segment olarak birletirilir. Stack uzunluu stack birletirme biimine ilikin segment
ierisinde tanmlanan toplam data uzunluu kadardr. rnein:
_STACK segment para stack
db
100
dup(0)
dw
5
dup(0)
_STACK ends
138
Myseg ends
Segmentleri Exe Kod erisindeki Dizilim Sras
Bilindii gibi exe dosya bir balk ksm iermektedir. Bu balk ksm ykleyici
tarafndan atlr. Exe kodunun ierisinde artk makine kodlarndan ve statik datalardan baka
hibir ey yoktur. Tlink program ile birden fazla obj modl birletirilerek tek bir exe
yaplabilir. rnein a.obj ve b.obj aadaki gibi birlikte link edilebilir:
Tlink a.obj b.obj
Segmentlerin exe dosya ierisindeki yerleim biimi 3 faktre baldr:
1. Derleyicinin obj modle yazma srasna
2. Modllerin linker tarafndan ele alnma srasna
3. Segmentin tanmlanmasnda kullanlan snf ismine(class type)
Sembolik makine dili derleyicisi normal olarak segmentleri grd srada obj modl
ierisine yazar. Ancak program ierisine yerletirilen .ALPHA direktifiyle segmentler yazl
srasna gre deil, isimsel sraya gre yazlr. rnein a.asm dosyasnda segmentler yle
belirtilmi olsun:
Y segment
....
Y ends
X segment
....
X ends
Normal olarak segmentler Y, X srasyla obj modle yazlacaktr. Ancak .ALPHA direktifini
kullanrsak X, Y srasnda obj modle yazlacaklardr. Derleyici ayn isimli public ya da stack
139
birletirme biimine ilikin birden fazla segment varsa daha derleme aamasnda onlar
birletirerek tek bir segment olarak obj modle yazar. rnein:
Y segment public
....
Y ends
X segment
....
X ends
Y segment public
....
Y ends
Burada her ne kadar 3 segment tanmlanm olmasna karn derleyici obj modle iki segment
yazacaktr.
Birden fazla modl birlikte link edildiinde linker public bir stack birletirme biimine
sahip segmentleri yine birletirir. Bunlar modllerin link edilme srasna gre snf
isimlerine bakarak obj modller ierisindeki sralarna da bakarak exe kodu ierisine
yerletirir. Snf isminin sralamay nasl etkiledii sonraki konuda ele alnacaktr. Burada
snf ismi kullanlmadan segmentlerin exe ierisindeki nihai yerletirilmelerine ilikin
rnekler vereceiz:
a.asm
X1 segment public
X1 ends
b.asm
Y1 segment public
Y1 ends
c.asm
Z1 segment public
Z1 ends
Y1 segment public
Y1 ends
X1 segment public
X1 ends
Y2 segment public
Y2 ends
Z1 segment public
Z1 ends
Burada .ALPHA direktifi kullanlmadna gre segmentler obj modle yerleim srasna
gre yazlrlar. Link ileminin
tlink a b c
biiminde yapldn dnelim. Linker btn modllerdeki public birletirme biimine
ilikin olan ayn isimli segmentleri birletirir. Segmentlerin nihai yerleimlerini modllerin
link edilme srasna bakarak ilk modldeki segment yukarda olacak biimde ayarlar. Sra:
X1, Y1, Z1, Y2 eklinde olacaktr. Link ilemini tam ters srada yapm olsaydk(tlink c b a)
exe ierisindeki dizilim Z1, Y2, Y1, X1 eklinde olacakt.
Segment Tanmlamasnda Kullanlan Snf sminin Segment Sralamasna Etkisi
Segment tanmlamasnda snf ismi tek trnak ierisinde yazlr. Herhangi bir isim
olabilir. ismin byk/kk harf duyarll yoktur. rnek:
140
Sembolik makine dili derleyicisi ve linker ayn snf ismine sahip segmentleri alt alta getirir.
Yani birletirilmeyen herhangi iki segment ayn snf ismi verilerek alt alta getirilebilir. Nihai
sralamada snf ismi de etkili olmaktadr. rnein:
a.asm
X2 segment public CODE
X2 ends
b.asm
Y1 segment public DATA
Y1 ends
Derleyici a.asm program derlediinde obj modle X2, Z1, Y1 srasnda segmentleri
yerletirecektir. Benzer biimde b.asm program derlendiinde obj modle Y1, Z2, Z3
srasnda yerletirir. Bu iki modln link ileminden sonra(tlink a b) X2, Z1, Z3, Y1, Z2
srasnda exe kodun ierisine yerletirilecektir. Bu iki modle ters srada link edilirlerse(tlink
b a) segmentlerin dizilimi Y1, Z2, Z3, X2, Z1 eklinde olacaktr. Bir segmentin herhangi bir
data iermesi zorunlu deildir. Yani ii bo bir segment tanmlamas yaplabilir. Bylece
programclar link edecekleri ilk modlde bo segment tanmlamalar yaparak nihai sra
zerinde etkili olabilirler. rnein kendi yazdmz a.asm modl ile bakasn yazd b.obj
dosyasn birlikte link edecek olalm. Biz b modlnde x1, y1 ve z1 isimli segmentlerin
tanmlanm olduunu bilelim. Ancak sras hakknda bir bilgimiz olmasn. Kendi
modlmzde bo segment tanmlamalar yaparak nihai sra zerinde etkili olabiliriz.
rnein:
X1 segment para public CODE
X1 ends
X2 segment para public DATA
X2 ends
X3 segment para public DATA
X3 ends
Byle bir tanmlamayla kendi modlmz link srasnda ne alrsak segment srasnn
belirlenmesini salayabiliriz.
C Derleyicileri ve Segmentler
C derleyicileri de Intel sisteminde program kodunu ve datalarn yine eitli isimler
altnda segmentler ierisine yazarlar. nk obj modl standarttr. Ve bu modle gre
bilgiler segmentler ierisinde olmak zorundadr. Microsoft ve Borland derleyicileri eitli
segment isimlerini birletirme biimlerini ve snf isimlerini ortak bir belirleme ile nceden
tespit edilmi biimde oluturmaktadr. Yalnzca Microsoft derleyicileri _CONST isimli ayr
bir segment daha kullanmaktadr. Bu segment Borland tarafndan kullanlmaz(obj format
141
yani OMF format baz UNIX sistemleri tarafndan da ayn biimde kullanlmaktadr). C
derleyicilerinin eitli bellek modellerine ilikin kullandklar segment isimleri unlardr:
Btn bellek modellerinde _TEXT ile balayan segment isimleri fonksiyonlarn makine
kodlar iin, _DATA ile balayan segment isimleri ilk deer verilmi statik mrl nesneleri
saklamak iin, _BSS ile balayan segment isimleri ilk deer verilmemi statik nesneleri
saklamak iin kullanlr.
Tiny model
Small model
Medium model
Compact model
Large model
Huge model
Intel sisteminde ister fonksiyon kodu olsun, ister statik data olsun her trl bilgi bir
segment ierisinde bulunmak zorundadr. Obj modl ierisinde bilgiler yine segment
ierisinde bulunurlar. Cde segmentlerle hi uramasak bile derleyici yine bilgileri obj
modle eitli isimlerde segmentler oluturarak yazar. Obj modl programlama dili
bamszdr. Programlama dili ne olursa olsun derleyiciler eninde sonunda bilgileri segment
ierisinde obj modle yazarlar. Bir segment 64Kb geemez. Segment ierisindeki data
64Kb geerse byle bir obj modl oluturulamayaca iin derleyici error verecektir.
rnein huge model dndaki tm modellerde program ne kadar ok modlden oluursa
olusun toplam statik data 64Kb geemez. Ancak huge modelde modl bana 64Kb
geemez, ancak toplamda 64Kb geebilir.
Her segment sfrdan balayan ayr bir yer sayacna sahiptir. Yani her segmentin ilk bytenn
offseti sfrdr. Segmentlerin balang adresleri(paragraf adresleri) program ierisinden
segment ismi geirilerek kullanlabilir. rnein:
142
Bir segmentin ismi o segmentin programn alma zaman srasndaki segment adresini
belirten iki byte uzunluunda sabit bir saydr. rnein:
mov ax, _DATA
ileminde gerekte ax registerna sabit bir say atanmaktadr. O sabit say da _DATA
segmentinin bellekteki paragraf adresidir. Bu durumda bir data segmentten bir data
semboln kullanrken ds registernn o segmentin balang adresini gstermesi gerekir.
Programc bunu kod ierisinde yapmak zorundadr:
mov ax, _DATA
mov ds, ax
/*****dtlseg00.asm*****/
_TEXT segment para public CODE
main proc near
mov
ax, _DATA
mov
ds, ax
mov
ah, 9
mov
dx, offset message
int
21h
mov
ax, 4c00h
int
21h
main endp
_TEXT ends
_DATA segment para public DATA
message db
Merhaba$
_DATA ends
_STACK segment para stack STACK
db
100
dup
(?)
_STACK ends
end main
/*****dtlseg00.asm*****/
Program yklendiinde cs ve ip ykleyici tarafndan program bitiren end direktifinin yannda
bulunan kod sembolnn segment ve offset adresleriyle otomatik olarak yklenmektedir.
Yine ss ve sp registerlar otomatik olarak stack birletirme biimine sahip olan segmentin
segment adresi ve uzunluu ile yklenmektedir(Byle bir segment yoksa ss PSPyi, sp ise
FFFE deeriyle yklenir. Ancak linker bu tr durumlarda No stack biiminde uyar
vermektedir). Ds ve es registerlar ykleme srasnda pspyi gsterecek biimde deer alr.
Yani ds registernn ilgili segment adresiyle yklenmesi programcnn grevidir. Ayrca
programn kodunu ieren segmentlerin bugn kullandmz linkerlarda CODE biiminde
snf ismine sahip olmas zorunludur. Normal olarak bir kod segmentin ierisinde data
sembol, bir data segmentinin ierisinde de makine kodlar yazlabilir. Makine komutlarnn
bulunduu segmentin CODE snf ismine sahip olma zorunluluu linkern baz sistemlerde
143
program kodunun bulunduu segmentleri tehis etmesi iin dnlmtr. Ayrntl segment
tanmlamalaryla program yazarken .model bildirimi programn banda kullanlmaz.
Ayrntl Segment Tanmlamalar ve Bellek Modeli
Bellek modeli kavram yksek seviyeli dillerin derleyicileri iin dnlm bir
kavramdr. nk bellek modeli kavram kullanlacak data ve kod segmentlerinin saysn
onlarn isimlerini vs belirlemekte kullanlr. Halbuki ayrntl segment tanmlamalaryla
program yazarken bu belirlemeleri biz istediimiz gibi yapabiliriz. Yani bellek modeli
kavramyla bir ilgimiz yoktur.
Birden Fazla Data Segmenti ile almak
Tek bir data segment tanmlayarak alrsak programmzn statik datalar 64Kb
geemez. Statik datalarn 64Kbtan fazla olabilmesi iin birden fazla data segment
tanmlamak gerekir. Birden fazla data segment kullanlrken ds nereyi gsterecektir? te ds
kullanlan data sembol hangi data segmente ilikinse oray gstermek zorundadr. Bu
durumda bir data sembol kullanlrken dsnin doru segmenti gsterip gstermediine
dikkat edilmelidir. rnein message1 isimli sembol _DATA1 segmentinde, message2 isimli
sembol _DATA2 segmentinde tanmlanm olsun. Bu sembollere aadaki gibi eriebiliriz:
mov ax, _DATA1
mov ds, ax
mov ax, message1
mov ax, _DATA2
mov ds, ax
mov ax, message2
biiminde yaparlar. Bu ilem far call ileminden 1 byte daha az makine koduna sahiptir.
Medium, large, huge modellerde farkl modllerde birden fazla kod segment bulunabilir.
144
imdi bu segment 64Kb geebilir. Default durum use16dr. Ancak programn bana .386,
.386p, .486 veya .486p bildirimlerinden biri yazlrsa default durum use32 olur.
Grup Kavram
64Kb ierisinde olan bir ya da birden fazla segmentin oluturduu toplulua grup
denir. Grup bildirimi yle yaplr:
grup_ismi
rnein:
DGROUP
group
_DATA, _BSS
Grup tanmlamasnn segment sralamas zerinde hibir etkisi yoktur. Segment sralamas
segmentlerin yazl srasna ve snf isimlerine baldr. Bir grubu oluturan segmentlerin
nihai sralamada 64Kb alan ierisinde bulunmas gerekir. bu segmentlerin aralarnda baka
segmentler olabilir. Grup tanmlamasnda belirtilen segment isimlerinin srasnn hibir
nemi yoktur. Bir grubu oluturan segmentlerin nihai durumda en bata olanyla en sonda
olan arasnda 64Kbtan daha fazla aklk olmamas gerekir. rnein grup bildirimi yle
yaplm olsun:
DGROUP
group
_DATA, _BSS
145
Burada _BSS ve _DATA arasndaki uzaklk 64Kb gememek zorundadr. Eer geerse link
aamasnda DGROUP exceeds 64Kb biiminde bir hata oluur.
Grup tanmlamas kmlatif bir tanmlamadr. rnein bir projede iki modl olsun.
Birinci modlde
MYGROUP group _DATA
tanmlamas yaplm olsun. Yaplan ilem sonucunda MYGROUP isimli grupta _DATA ve
_BSS isimli iki segment vardr. Bir grubu oluturan segmentlerin nihai durumda 64Kb
gememesi manual olarak salanmak zorundadr. Bunu salamak iin bu segmentlerin snf
isimlerini ayn yapmak bir katk salayabilir.
Grup Kullanm
Bir grubun ismi dorudan bir segment ismi gibi kullanlabilir. rnein:
mov
mov
ax, DGROUP
ds, ax
Grup ismi grubun balang paragraf adresini belirtir. Bu adres nihai durumda grup ierisinde
ilk srada bulunan segmentin balang adresidir. Grup kk fakat ok sayda segmentlerle
alrken segment registerlarn tekrar tekrar kullanlmasn engellemek iin tercih edilir.
rnein:
_DATA segment para public DATA
number1 dw
0
number2 dw
1
_DATA ends
_BSS segment para public DATA
number3 dw
?
number4 dw
?
_BSS ends
ax, _DATA
ds, ax
ax, number1
ax, _BSS
ds, ax
ax, number3
146
DGROUP
mov
mov
mov
group
_DATA, _BSS
ax, DGROUP
ds, ax
ax, number1
Burada bir problem vardr. Derleyicinin number1 ve number3 sembolleri iin kendi
segmentlerinin balangcndan itibaren deil, grubun balangcndan itibaren adres retmesi
gerekir. Bu ilem assume direktifiyle yaplmaktadr.
Assume Bildirimi
Assume sembolik makine dili derleyicisinin bir data ya da kod semboln grdnde
hangi orijine gre offset reteceini belirlemekte kullanlr. Assume ileminin defaultu
yoktur. Yani assume bildirimini yapmak gerekir(Masm 6.1 derleyicisinde assume yaplmazsa
default olarak semboller iin kendi segmentlerinin ba orijin alnarak offset retilir).
Basitletirilmi segment tanmlamalaryla program yazarken assume kullanlmaz. Assume
bildirimi bellek modeline baklarak default deerlerle derleyici belirlenir. Assume bildirimi
yle yaplr:
assume
rnein:
assume
Orijin noktas olarak ya bir segment ismi ya da bir grup ismi yazlmak zorundadr. Assume
ileminden sonra bir sembol kullanldnda o semboln default olarak ilikin olduu segment
register tespit edilir. O segment register ile belirlenen orijin dikkate alnr. rnein:
mov
ax, number1
number1 sembolnn default segment register dsdir. Ds ise DGROUP orijinine sahiptir. Ya
da rnein
mov
ax, ss:number1
Burada number1 sembolnn segment register sstir. Ss iin orijin _STACK biimindedir.
Bir sembol kullanldnda derleyici o semboln ilikili olduu segment register hangi
segment ya da grup ile assume edilmise o orijinden balayarak offset hesaplar.Eer kullanalan
sembol assume edilmi gruo iinde deilse bu durum error oluturur. Assume ileminin
segment register'nn yklenmesiyle bir ilgisi yoktur. Yalnzca offset belirlenmesiyle ilgisi
vardr. rnein bir modl iinde grup oluturmadan birden fazla data segment kullanldnda
hem dier segment'teki sembol kullnamadan DS'nin ykenmesi hem de o offset iin yeniden
assume ileminin yaplmas gerekir. Ancak offset operatr default olarak her zaman
semboln bulunduu segment'in bandan balayarak bir offset retmektedir. rnein; X1
sembol _DATA egment'i iinde tanmlanm olsun. DS ise DGROUP ile assume edilmi
olsun.
mov
ax,offset X1
147
DS, DGROUP ile assume edidii halde derleyici offet iin orijin noktasn _DATA kabul
eder. Ancak bu ilem aadaki gibi deitirilebilir:
mov
ax,offset DGROUP:X1
OMF Format
16 bit DOS sisteminde kullnalan .obj dosya formatna OMF Format denir. OMF
Format 1978'de Intel tarafndan tanmlanmtr ve Microsoft tarafndn gelitirilmitir. OMF
Formatnn 32 bitlik bir versiyonu da vardr. Intel ilemcilerinini kullanld UNIX
sistemlerinin ounda 32 bit OMF format kullanlmaktadr. WIN32 sistemlerinde alan
Borland derleyicilerinde hala .obj modl format olarak OMF format kullanmaktadr. Ancak
Microsoft WIN 32 sistemleriyle birlikte yeni bir .obj dosya format kullanmaya balamtr.
Bu formata COFF (Common Object File Format) denir.
OMF Formatn Genel Yaps
.obj dosya format farkl modllerin birletirilmesi konusunda nemli bilgiler ieren
bir yapya sahiptir. OMF frmat sembolik makine dili programnn binary bir dosya biimine
dntrlm hali gibidir. rnein iind mkine kodlar sement tanmlamalar, sembol
tanmlamalar, extern ve public gibi deiken tanmlamalar vardr. OMF format Borland
firmasnn TDUMP.EXE, Microsoft firmasnn DUMPBIN.EXE progamlaryla incelenebilir.
Bu programlar dosyann uzantsna bakarak .exe, .obj, .lib gibi dosyalarda inleceleyebilir.
TDUMP program yle yaplabilir:
tdump a.obj
tdump a.obj | more
tdump a.obj > x.txt
OMF format kaytlardan oluur. Her kaytn ayr bir ismi vardr. Her kaytn frmat
birbirlerinden farkldr.
1.byte
2.byte
-----------|-----------|---------------rec type | rec len | Deiebilir.
-----------|-----------|---------------Her kaytn ilk iki eleman sabittir.Bir kaydn ilk byte' o kaydn trn anlatan bir say
ierir.Daha sonraki 2 byte o kaytn uzunluudur. Her kaydn uzunluu birbirlerinden farkl
olabilir. OMF formatnda kullanolan kaytlarn isimleri unlardr:
16 VE 32 BIT OMF KAYITLARI
80
88
8A
8B
8C
THEADR
COMENT
MODEND
H386END
EXTDEF
8E
90
91
94
95
TYPDEF
PUBDEF
MPUB86
LINNUM
MLIN386
96
98
99
9A
9C
148
LNAMES
SEGDEF
MSEG386
GRPDEF
FIXUPP
9D
A0
A1
A2
A3
MFIX386
LEDATA
MLED386
LIDATA
MLID386
Her kaydn kayt uzunluu kayt tr ve kayt uzunluu dnda geri kalan bilgilerin
uzunluunu belirtir.
OMF formatnn kaytlarn display eden program:
/*---------------------- OMF.c----------------*/
typedef unsigned short int WORD;
typedef int BOOL;
typedef unsigned long int DWORD;
typedef struct _OBJREC {
BYTE recType;
char *recName;
} OBJREC;
/* Global Variables */
OBJREC objRec[] = {
{0x80, "THEADR"},
{0x88, "COMENT"},
{0x8A, "MODEND"},
{0x8B, "H386END"},
{0X8C, "EXTDEF"},
{0X8E, "TYPDEF"},
{0X90, "PUBDEF"},
{0X91, "MPUB86"},
{0X94, "LINNUM"},
{0X95, "MLIN386"},
{0X96, "LNAMES"},
{0X98, "SEGDEF"},
{0X99, "MSEG386"},
{0X9A, "GRPDEF"},
{0X9C, "FIXUPP"},
{0X9D, "MFIX386"},
{0XA0, "LEDATA"},
{0XA1, "MLED386"},
{0XA2, "LIDATA"},
{0XA3, "MLID386"},
{0, NULL}
};
/* FUNCTION PROTOTYPES */
void CheckArg(int argc);
void DispRec(BYTE recType);
void CheckArg(int argc)
{
if(argc == 1) {
fprintf(stderr, "usage: disobj <.obj file name>\n");
exit(1);
}
if(argc > 2) {
fprintf(stderr,"Too many parameter!..\n");
exit(1);
}
}
149
M2.asm
_DATA segment para public DATA
X1
db
10
X2
db
20
_DATA ends
150
.....
_TEXT ends
Buradaki makine komutlarn oluturan offset bilgileri exe koduna dorudan yansmamaldr.
Buradaki offset bilgileri o modle ilikin greli deerlerdir. Linker segmentleri birletirirken
bu makine komutundaki offsetler dzeltilmek zorunda kalnabilir. Bu yzden derleyici obj
modl olutururken btn data ve kod sembollerinin sz konusu edildii yerleri FIXUP
RECORD ierisinde not alr. Fixup record ierisinde ilgili semboln ismi yoktur, ancak o
semboln hangi segment ierisinde olduu bilgisi ve o semboln program kodunun
nerelerinde kullanld bilgisi vardr. Bu durumda linker segmentleri birletirirken o
segmentler ierisindeki sembollerin kullanld makine komutlarn gncellemek zorundadr.
Bu ilemi yle yapar:
1. Segmentleri birletirirken aradaki aklklar hesaplar.
2. Fixup recordlarn inceleyerek bu sembollerin kullanld kod blgelerini bulur.
Buradaki sembol offsetlerini bu aklk miktarlarn toplayarak nihai offsetleri elde eder.
Bu durumda fixup record sembollerin hangi segment ya da grup ierisine bulunduunu
ve bu sembollerin program kodunun nerelerinde kullanldn tutan bir recorddur.
/*****seg00001.asm*****/
_DATA segment para public 'DATA'
X1
db 100
X2
db 200
_DATA ends
_TEXT segment para public 'CODE'
assume cs:_TEXT, ds:_DATA
mov al, X1
mov bl, X2
_TEXT ends
end
/*****seg00001.asm*****/
Tasm /l seg00001.asm
/*****seg00001.lst*****/
1 0000
_DATA segment para public 'DATA'
2 0000 64
X1
db
100
3 0001 C8
X2
db
200
4 0002
_DATA ends
5
6 0000
_TEXT segment para public 'CODE'
7
assume cs:_TEXT, ds:_DATA
8 0000 A0 0000r
mov
al, X1
9 0003 8A 1E 0001r
mov
bl, X2
10 0007
_TEXT ends
11
12
end
/*****seg00001.lst*****/
Tdump seg00001.obj > seg00001.tdm
151
/*****seg00001.tdm*****/
000000 THEADR seg00001.asm
000011 COMENT Purge: Yes, List: Yes, Class: 0 (000h)
Translator: Turbo Assembler Version 3.1
000034 COMENT Purge: Yes, List: No , Class: 233 (0E9h)
Dependency File: seg00001.asm
02/22/101 08:13 pm
00004B COMENT Purge: Yes, List: No , Class: 233 (0E9h)
End of Dependency List
000051 LNAMES
Name 1: ''
000056 COMENT Purge: Yes, List: No , Class: 161 (0A1h)
Object Module Extensions Present.
00005C LNAMES
Name 2: '_DATA'
Name 3: 'DATA'
00006B SEGDEF 1 : _DATA
PARA PUBLIC Class 'DATA'
Length: 0002
000075 LNAMES
Name 4: '_TEXT'
Name 5: 'CODE'
000084 SEGDEF 2 : _TEXT
Length: 0007
/*****seg00001.tdm*****/
Btn semboller lst dosyasnda r sembolyle belirtilirler.
Makine Kodlarnn ve Statik Datalarn obj Modle Yazlmas
Segmentler ierisinde datalar ve makine kodlar derleyici tarafndan obj modle
linker tarafndan da exe dosya ierisine yazlrlar. Derleyici ham data ve kod bilgilerini
LEDATA ve LIDATA recordlarna yazarlar. Programn makine kodlar ve statik datalar
LEDATA recorduna yazlr. Ancak obj dosyay iirmemek iin elemanlar ayn deeri alan
diziler kullanldnda derleyiciler bu dizi elemanlarn tek tek LEDATA blmne
yazmazlar. Bu bilgileri 100 tane 0 gibi bir anlatmla LIDATA recorduna yazarlar. rnein:
X1
db
Burada 10, 20, 30, 40 saylar LEDATA recorduna yerletirilir. 100 tane 0 bilgisi ise
LIDATA recorduna yerletirilir. Bu durumda rnein Cde aadaki gibi bir global bir dizi
am olalm:
int a[10000];
imdi obj modl en azndan 20Kb kadar olmayacaktr. nk C derleyicisi bu bilgiyi obj
modln LIDATA recorduna yazar. Tabii maalesef mz exe dosya formatnda bu bilgi 20000
152
153
154
Bir COM programn code, data ve stack'i ayn 64K'nn ierisinde olmak zorundadr.
2. Program ierisinde stack segment tanmlanamaz (Yani stack birletirme biimine sahip
olan segment tanmlanamaz). Programn bir stack segment'inin olmas bir balk ksmnn
olmasn gerektirmektedir. Ancak programn stack'i ykleyici tarafndan otomatik
oluturulmaktadr. Ykleyici SS 'i PSP 'ye SP 'yi ise FFFE deerine eker.
3. Programn balangc IP = 100H olacak biimde organize edilmelidir. COM programn
ilk byte' offset 100H 'ta olacak biimde yklenir. Bu durumda COM programn ilk
byte'larnda kesinlikle bir makine komutu olmak zorundadr.
ORG Komutu
Bilindii gibi derleyici semboller iin offset deerlerini yani genel olarak yer sayacn
assume edilmi segment ya da gruba gre orijinleyerek vermektedir. rnein
assume cs: _TEXT
ifadesiyle _TEXT segment'i iin yer sayac 0 deerinden balar. Halbuki pek ok durumda yer
sayacnn zel bir deerden balatlmas ya da devam ettirilmesi istenebilir. rnein COM
program yazarken offset'leme ilemini 100H deerinden balamas gerekir. te ORG
komutu yer sayacnn deerini orijinlemek amacyla kullanlr. ORG komutunun genel biimi
yledir:
org
deer
ORG komutu segment'in herhangi bir yerine yerletirilebilir. Bu komuttan sonra yer
sayac komutta belirtilen deeri alacaktr.
155
main endp
_TEXT ends
end main
rnein:
_TEXT segment para public 'CODE'
assume cs:_TEXT, ds:_TEXT, ss:_TEXT, es:_TEXT
org
100h
main proc near
jmp
@1
msg
db
"This is a COM program", '$'
@1:
mov
ah, 9
mov
dx, offset msg
int
21h
mov
ax, 4c00h
int
21h
main endp
_TEXT ends
end main
Bir COM program normal bir biimde derlenerek .OBJ yaplr. Ancak /t seenei ile
link edilmelidir. Yoksa linker program .EXE sanr ve bir balk ksm oluturur. rnein:
tlink /t den.OBJ
ok Segmentli COM Programnn Yazlmas
Bu yntemde birden fazla segment tanmlanabilir. Ancak bunlarn bir grup
oluturmalar gerekir. Programn en yukarsndaki segmentin kod iermesi gerekir. Program
ok segmentli olmasna karn program ierisinde ayrca segment ismi kullanlmaz. Assume
ifadesi gruba gre verilir. Dolaysyla btn offsetler zaten gruba gre oluturulacaktr.
/*****com00001.asm*****/
DGROUP group _TEXT, _DATA
_TEXT segment para public CODE
assume cs:DGROUP, ds:DGROUP, ss:DGROUP
org
100h
entry:
mov
ah, 9
lea
dx, msg
int
21h
mov
ax, 4c00h
int
21h
_TEXT ends
_DATA segment para public DATA
msg db
Hello$
_DATA ends
end entry
/*****com00001.asm*****/
156
FFFF0 adresinde bir far jmp komutu bulunur. Bu far jmp ile ak EPROMdaki POST(power
on self test) programna geirilir. Burada eitli self test ilemleri yapldktan sonra sra
iletim sisteminin yklenmesine gelir. Bunun iin buradaki program A srcnn boot
sektrn bellein 7C00 adresine kopyalar ve CS:0000 IP:7C00 olacak ekilde program
altrr. te bylece ak boot sektrdeki programa geirilmi olur. artk buradaki program
iletim sistemini ykleyecektir.
Amacmz boot sektre bir program yerletirerek makine alr almaz bizim
programmz altrmak olsun. Bu ilem u admlardan geilerek yaplabilir:
1. Boot sektre yerletirilecek com program yazlr.
2. Bu com program boot sektre kopyalanr.
Boot sektre yerletirilecek com program yazlrken baz noktalara dikkat etmek gerekir.
Birincisi org 100h com program yazabilmek iin mutlaka gereken bir ilemdir. Yoksa linker
com dosya oluturamaz. kinci nemli nokta org 100htan dolay program 7C00a
yklendiinde semboller iin offsetler hep 100h fazla kacaktr. Bu durumda ds registernn
07B0 gstermesi gerekir. nc nemli nokta ise BPB blounu bozup bozmayacamzdr.
Eer BPB blounu bozmak istemiyorsak programmz BPB blounun tesine yklemeliyiz.
Btn bu bilgiler dorultusunda ekrana Loading CSD Operating System yazsn basan
sembolik makine dili program yle yazlabilir:
157
/*****com00002.asm*****/
_TEXT segment para public 'CODE'
assume CS:_TEXT, DS:_TEXT, SS:_TEXT
org 100h
main proc near
jmp @1
msg db "Loading CSD Operating System", 0
@1:
mov ax, 07b0h
mov ds, ax
call writestr
INFINITE:
jmp INFINITE
main endp
writestr proc near
mov si, offset msg
jmp @2
@3:
mov ah, 0Eh
mov bh, 0
int 10h
inc si
@2:
mov al, [si]
cmp al, 0
jnz @3
ret
writestr endp
_TEXT ends
end main
/*****com00002.asm*****/
Com program hazrlamann dnda baka bir alternatif yntem u olabilir: Yine tek
segmentli bir program yazlr. Yani relocatable bilgi kullanlmaz. Btn segment registerlar
ayn segmente assume edilir. rnein:
_TEXT segment para public CODE
assume cs:_TEXT, ds:_TEXT, ss:_TEXT
_TEXT ends
Bylece program com deil exe yaplr. Artk org 100h gerekmeyecektir. Bylece retilen
offsetler de 100htan deil 0dan balayacaktr. Bundan sonra exe dosyann balk ksm
atlarak ykleme gerekletirilebilir. Com yerine exe retilmesiyle 100h karkl
engellenmi olur.
Artk com programn boot sektre yerletirmek gerekmektedir. Bu ilem ayr bir
programla yaplabilir.
158
/*****putboot.c*****/
#include <stdio.h>
#include <bios.h>
#include <stdlib.h>
#define TRYNUM
#define SECTSIZE
3
512
/*****putboot.c*****/
letim Sistemi Yazmnda zlenecek Yntem
letim sistemi en aa seviyeli sistem programdr. nk BIOS kesmelerinin
dnda kullanlacak hibir yazlm kod yoktur. Ancak yine de sistemin %95i C ile
yazlabilir. Geri kalan %5i dorudan bire bir register kullanan aa seviyeli kodlar olup
sembolik makine dilinde yazlmaldr. Peki bu durumda hangi C derleyicisi kullanlacaktr?
Herhangi bir derleyici kullanlabilir. Ancak derleyiciler belirli bir iletim sistemi iin
yazldndan o iletim sisteminin sistem fonksiyonlarn kullanrlar. Oysa sz konusu iletim
sistemi ykl deildir. Belli bal problemler unlardr:
1. Derleyiciler link ileminde startup modl kullanrlar. main fonksiyonu buradan
arlmaktadr. rnein Borland derleyicilerinde small modelde startup modl c0s.obj
dosyasdr. Bu dosya yeniden oluturulmaldr. rnein startup modl aadaki gibi
olabilir:
159
Modllerle alma
Bilindii gibi modllerle program yazarken bir global deiken C'de yalnzca bir
modlde global olarak tanmlanmal, kullanlan tm modller de extern olarak bildirilmelidir.
C'de baka bir modlde tanmlanm olan bir fonksiyonun arlmas iin extern bildiriminin
yaplmasna gerek yoktur. Fonksiyonlar zaten otomatik olarak extern kabul edilir. Tabii
derleme zaman iin prototip bulundurmak gerekir. Linker program birden fazla .OBJ
modl girdi olarak alabilir. Ayrca .LIB dosyalarn da girdi olarak alabilmektedir.
TLINK.EXE program yle kullanlr:
TLINK objfiles,exefile,mapfile,libfiles
1)
2)
3)
4)
5)
6)
TLINK a1 a2
TLINK a1 a2,myapp
TLINK a1 a2,myapp,mymap,mylib
TLINK a1 a2,myapp,,mylib
TLINK a,,,mylib
TLINK a,,,mylib yourlib
Bir global deikenin baka bir modlde kullanlabilmesi iin OMF formatnda
pubdef record'a yazlmas gerekir. Sembolik makine dili derleyicilerinin bir data ya da code
semboln pubdef record'a yazabilmesi iin public bildiriminin yaplmas gerekir. public
bildirimi aadaki gibi yaplr:
public sembol_ismi
public bildirimi sembolik makine dilinde herhangi bir yerde yaplabilir. public
bildirimi ile derleyici semboln hangi segment ve hangi offset'te bulunduunu pubdef record
ierisine yazmaktadr. Pubdef record ierisine yazlmayan bir sembol baka bir modlden
kullanlamaz. C'de default olarak btn global deiken ve fonksiyonlar C derleyicileri
tarafndan public olarak yazlmaktadr. Static global deikenler ve fonksiyonlar pubdef
record'a yazlmazlar. Bu durumda baka bir modlde extern olarak bildirilseler bile
kullanlamazlar. Linker extern deikenlerin makine kodlarn dzeltebilmek iin pubdef
record'daki bilgilere gereksinim duymaktadr. rnein x baka bir modlde tanmlanm
extern bir deiken olsun. Biz program ierisinde
160
x = 10;
yazm olalm. Derleyici bu ilemi makine komutuna dntrrken x baka bir modlde
olduu iin offset deerini bilemez ve offset deerini bo brakr.
mov
word ptr[0000], 10
Burada alt izili olan offset deeri linker tarafndan dzeltilecektir. Linker'n bu dzeltmeyi
yapabilmesi iin semboln offset deerini pubdef record'dan elde etmesi gerekir.
Baka modlde public olarak bildirilmi semboln kullanlabilmesi iin o semboln
kullanlacak modlde extdef record'da belirtilmi olmas gerekir. Bir sembol extdef record'a
yazabilmek iin extrn bildiriminin yaplm olmas gerekir. Extdef record'da sembole ilikin
isim bilgisi bulunmaktadr. Linker bir modln extdef record'u ierisinde belirtilen sembol
dier modllerin pubdef record'larnda arar. Bulursa ilikilendirme yaparak koddaki offset
bilgisini dzeltir, bulamazsa link aamasnda error oluur. Bir semboln birden fazla modlde
pubdef record ierisinde bulunmas da error oluturur. Ayn sembol ne olursa olsun birden
fazla modlde pubdef record ierisinde ise yine error oluur. extrn bildiriminin sembolik
makine dilinde bildiriminin genel biimi yledir:
Kod sembolleri iin:
extrn sembol:
near
far
byte
dword
qword
tbyte
rnein:
extrn x1:word
extrn exit:near
extrn x1:byte, x2:word, exit:near
extrn bildirimi kaynak kodun herhangi bir yerinde yaplabilir. Ancak Microsoft u
tavsiyede bulunmaktadr:
1) Data sembolleri public karl hangi segment ierisinde yaplmsa o segment'in
ierisinde tanmlanmaldr. rnein x1 sembol baka bir modln _DATA isimli
segment'inde tanmlanm olsun. O zaman extrn bildirimi iin dummy bir segment
tanmlamas amak gerekir.
_DATA segment
extrn
x1:word
_DATA ends
161
_TEXT segment
extrn
_func:near
.....
.....
call
_func
.....
.....
_TEXT ends
3) far code sembolleri kaynak kodun herhangi bir yerinde extrn olarak bildirilebilir.
Microsoft'un bu nerileri bir yana extrn bildirimleri herhangi bir yerde yaplabilir.
Aslnda OMF formatnda semboln tr bilgisi extdef record ierisine yazlmamaktadr. Tr
bilgisi pubdef record ierisinde bulunmaktadr. Extdef record ierisinde yalnzca deikenin
ismi bulunur. extrn bildiriminde tr bilgisinin yazlmasnn nedeni derleyicinin syntax
bakmndan tr kontrolnn uygulanmasn salamak iindir.
C derleyicileri geleneksel olarak global ve extern deikenleri pubdef ve extdef
record'larna bana alt tire getirerek yazarlar. C derleyicilerinin semboln bana alt tire
eklemelerinin nedeni sembolik makine dili ktlarnda yanllkla anahtar szck oluturacak
isimlerin engellenmesi iindir.
Derleyicilerin tmleik evreli versiyonlarnda link ilemine otomatik olarak startup
modul ve standart C ktphaneleri dahil edilmektedir. rnein Borland derleyicilerinde
DEN.C isimli bir C dosyasnn link edilmesinin komut satr karl yledir (small modelde
derlendii varsaylmtr):
TLINK c:\tc\lib\c0s den,den,,c:\tc\lib\cs c:\tc\lib\maths c:\tc\lib\emu
c:\tc\lib\graphics
Bilindii gibi main fonksiyonu startup modul tarafndan arlmaktadr. Eer C0.ASM
dosyas incelenirse arma ileminin aadaki gibi yapld grlr:
extrn
.....
.....
call
_main:near
_main
162
rnein:
comm
comm
buffer:byte:128
num:word
comm kullanm programcy bir sembol bir modlde public, dier modllerde extern
yapma zahmetinden kurtarr. Bu durumda comm bildirimi ayn biimde her modlde
tanmlanr. Hibir modln derlenmesinde bir problem ortaya kmaz. Yer link aamasnda
bir tane ayrlr.
String Komutlar
Sembolik makine dilinde ismine string komutlar denilen bir grup makine komutu
vardr. Bu komutlara string komutlar denmesine karn yaz ilemleriyle bir ilgisi yoktur. Bu
komutlar genel olarak blok ilemi yaparlar. Bu komutlarda bir kaynak blge sz konusu
olduu zaman DS:SI, hedef blge sz konusu olduu zaman ES:DI ikilisi kullanlr.
Komutlarda nek(prefix)
Intel ilemcilerinde tek bana anlaml olmayan, onu izleyen komut ile anlam tayan 1
byte'lk makine komutlar vardr. Bu komutlara nek denir. En ok kullanlan nekler 66, 67,
F3 (REP), D0-D7(ESC), DS:, ES:, SS:, CS: nekleridir.
66 ve 67 nekleri
66 neki gerek modda ve V86 modunda register operandnn yani ilem geniliinin
16 bit'mi yoksa 32 bit'mi olduunu anlatr. Bu modlarda 66 neki komutun nnde ise yaplan
ilemde 32 bit register takm kullanlr. Yani gerek modda ve V86 modunda 32 bit
register'lar kullanabilmek iin 66 neki komuta eklenmektedir. Korumal modda doal
alma 32 bit ilem genilii ierir. Bu modda tam tersine 32 bit ve 8 bit register'lar
kullanmann bir maliyeti yoktur. Ancak 16 bit register kullanldnda 66 neki komuta
eklenir.
67 neki ise gerek modda ve V86 modunda 32 bit offset genilii kullanldnda
komuta eklenir. Korumal modda doal olan durum zaten 32 bit offset geniliidir. Orada da
tam tersi 16 bit offset genilii kullanldnda 67 neki komuta eklenir. zetle gerek modda
ve V86 modunda 32 bit register kullanmann ve 32 bit offset kullanmann 66 ve 67 neklerini
komuta eklemesi dolaysyla bir maliyeti vardr. Korumal modda da tam tersine 16 bit
register ve offset genilii kullanmann maliyeti vardr.
Bu maliyetler push ve pop ilemleri iin de geerlidir. Sembolik makine dili
derleyicisi hangi mod iin program yazldn varsayacaktr? rnein Win32 iin kod
yazarken 32 bit register'lar kullanacamz zaman 66 nekinin gelmemesi gerekir. te
ayrntl segment tanmlamalarnda gerek mod / V86 mod ya da korumal mod iin kod
yazlp yazlmad use16 ve use32 anahtar szcklerinin eklenmesiyle belirlenir.
use16
MYSEG segment
use32
.....
163
.....
MYSEG ends
Default durum use16'dr. Eer kaynak kodun bana .386, .386p, .486, .486p
eklenirse o zaman default durum use32 olur.
Segment nekleri
Segment ykleme iin kullanlan DS:, ES:, SS:, CS: sembolleri aslnda birer
nektir. rnein
mov
ax, ss:[bx]
ax, [bx]
komutlarndan olumaktadr. Bu durumda ss: neki aslnda "bir sonraki makine komutunda
bellek operand varsa onun segment register' ss yap" anlamna gelmektedir. Hatta baz
debugger'lar komutun
mov
ax, ss:[bx]
ax, [bx]
REP neki
Bu nek string komutlaryla birlikte kullanlmaktadr. Bu neki bir string komutu
izlemelidir.
String komutlarnn BYTE ve WORD versiyonlar vardr.
LODS Komutu
Bu komutun BYTE versiyonu LODSB, WORD versiyonu LODSW'dur. Komut
DS:SI adresindeki bilgiyi BYTE versiyonunda AL register'na, WORD versiyonunda AX
register'na ykler ve DF bayrann durumuna gre SI register'n artrr ya da eksiltir.
LODSB Komutu
AL = DS:SI
if (DF == 0)
SI = SI + 1
else
164
SI = SI 1
LODSW Komutu
AX = DS:SI
if (DF == 0)
SI = SI + 2
else
SI = SI - 2
Bu komut REP nekiyle kullanlmaz. Bu komut bir blok bilgiyi AX ya da AL'ye alp
ilemek iin zellikle tercih edilir. Blok bilgi DS:SI register'laryla belirlenmelidir. Ondan
sonra CLD ya da STD komutlaryla DF bayra ayarlanmal ve bir dng ierisinde bir
grup bilgi ilenmelidir. rnein:
initport db '$CHD0000'
.....
cld
lea
si, initport
mov
cx, 8
AGAIN:
lodsb
out
dec
jnz
250, al
cx
AGAIN
STOS Komutu
Bu komutun BYTE versiyonu STOSB, WORD versiyonu STOSW biimindedir.
Komut REP nekiyle kullanlabilir.
REP nekinin levi
REP neki yalnzca string komutlaryla kullanlr. String komutunun bir kez deil, CX
register'nn ierisindeki deer kadar yaplmasn salar. REP komutu nce CX register'nn
deerini 1 eksiltir. nce CX register' kontrol edilir. 0 d bir deerse string ilemini yapar, 0
ise string ilemini sonlandrr. Sonra CX register'nn deeri 1 azaltlr. Komutun kullanm
rep
rep
stosb
stosw
biimindedir. Grld gibi nek komutun bir parasym gibi kullanlr. STOS komutu u
ilemi yapar.
STOSB
ES:DI = AL
if (DF == 0)
DI = DI + 1
else
DI = DI 1
STOSW
165
ES:DI = AX
if (DF == 0)
DI = DI + 2
else
DI = DI 2
STOS komutu REP nekiyle birlikte kullanldnda aadaki gibi ilem yapar.
while(CX > 0) {
stos
--cx;
}
STOS komutu REP neksiz de kullanlabilir. REP STOS ilemi zellikle bir bloun
belirli bir deerle doldurulmas gibi ilemlerde tercih edilmektedir. Yani tipik memset gibi bir
fonksiyon bu komut kullanlarak yazlabilir. rnein bir bloun 100 byte 0'la doldurulmas
yle yaplabilir:
mov
mov
les
cld
mov
mov
rep
bp, sp
ax, ds
es, ax
di, [bp + 4]
cx, [bp + 8]
al, [bp + 6]
ax, [bp + 4]
di
bp
MOVS Komutu
Bu komutun BYTE biimi MOVSB, WORD biimi MOVSW biimindedir. Komut
REP nekiyle kullanlabilir. Uygulamada bir bloun baka bir bloa kopyalanmas amacyla
kullanlmaktadr. alma biimi yledir:
MOVSB
ES:DI = DS:SI
166
if (DF == 0) {
SI = SI + 1
DI = DI + 1
}
else {
SI = SI - 1
DI = DI - 1
}
167
MOVSW
ES:DI = DS:SI
if (DF == 0) {
SI = SI + 2
DI = DI + 2
}
else {
SI = SI - 2
DI = DI - 2
}
MOVS komutu tipik olarak memcpy gibi bir fonksiyonu yazmakta kullanlabilir.
void *memcpy(void *dest, const void *source, size_t size);
_memcpy proc near
push
bp
mov
push
si
push
di
mov
mov
mov
mov
mov
cld
rep
mov
pop
pop
pop
ret
_memcpy endp
bp, sp
ax, ds
es, ax
di, [bp + 4]
si, [bp + 6]
cx, [bp + 8]
movsb
ax, [bp + 4]
di
si
bp
Heap Algoritmas
Heap dinamik bellek fonksiyonlaryla tahsis edilme potansiyelinde olan bo
blgelerdir. Heap organizasyonu iin nce bir heap blgesinin belirlenmesi gerekir. heap
blgesinin neresi olaca iletim sisteminin tasarmna baldr. DOSta heap blgesinin yeri
ve uzunluu sembolik makine dili kursunda ele alnacaktr. Heap alan belirlendikten sonra
artk malloc, free, realloc gibi tahsisat fonksiyonlarn yazmak gerekir. Bu fonksiyonlar bir
tahsisat tablosu kullanmak zorundadr. Tahsisat tablosunun heap ierisinde yer almas gerekir.
ancak bu tablonun da dinamik olarak bytlp kltlmesi gerektiinden tablo sabit bir
yerde ve sabit uzunlukta olmamaldr. DOSta, Win32de ve UNIX sistemlerinde kullanlan
malloc algoritmas bo bal liste tekniini kullanan bir algoritmadr. Bu algoritma Ritchie
& Kernighann The C Programming Language kitabnda aklanmtr.
168
Bu yntemde btn bo bloklar bir bal liste ierisinde tutulur. Tahsis edilen bloklar ayrca
bal listede tutulmaz. Zaten tutulmasna da gerek yoktur. rnein heap blgesinde 10, 20 ve
30 bytelk bo alanlar olsun. Bu bo alanlar aadaki gibi bir bal listede tutulabilir.
Peki heap blgesinin balang durumu nasldr? Balangta bo bal listede bir tane eleman
vardr. O da tm heap blgesini kapsar.
169
POSIX Fonksiyonlar
POSIX malloc, free ve realloc fonksiyonlar aadaki teknikle TINUX multiheap APIlerini
kullanarak processin default heapi zerinde tahsisat yapmaktadr.
void *malloc(size_t size)
{
HHEAP hHeap;
hHeap = GetProcessheap();
return AllocMem(hHeap, size);
170
nce kernel heap fonksiyonlar tasarlanmaldr. Daha sonra heap API fonksiyonlar
tasarlanmaldr.
Kernel heap fonksiyonlarnn denemesi yaplrken g_pKernelHeap(kernel heap alannn
balang adresi) ve g_kernelHeapSize(kernel heap alannn uzunluu) deikenlerine
belirli deerler atanmaldr.
Btn kernel fonksiyonlar ok iyi test edilmelidir.
Sonra user API heap fonksiyonlar tasarlanmal, CreateHeap fonksiyonu ierisinde hHeap
handle alan allocKernelMem fonksiyonu kullanlarak kernel ierisinde tahsis edilmelidir.
ReleaseHeap fonksiyonu ise freeKernelMem fonksiyonunu kullanmaldr.
171
SCAS Komutu:
Bu komutun byte biimi SCASB, word biimi SCASW biimindedir. Bu komut aslnda
CMP
AL,ES:DI
AX
AL,ES:DI
if(DF == 0)
DI = DI + 1;
else
DI = DI - 1;
SCASW
CMP
AX,ES:DI
if(DF == 0)
DI = DI + 2;
else
DI = DI - 2;
SCAS ilemiyse bir bloktaki ilk eit bilgiyi bulmak iin kullanlr.
REPNE
LOST_A DB
....
100 DUP(*)
MOV
MOV
CLD
MOV
AX,DS
ES,AX
AL,'A'
172
MOV
LEA
REPNE
JZ
NOTFOUND:
....
....
....
FOUND:
DEC
CX,100
DI,LOST_A
SCASB
FOUND
DI
Burada REPNE SCAB ileminden iki nedenle klm olabilir. Birincisi A karakteri
bulunmutur. Dolaysyla son CMP ileminden JF=1 olumutur. kincisi FZ sayac 0
olmutur ve karakter bulunamamtr. Bu durumda FZ = 1 olmutur. CMP ileminden sonra
her durumda DI artrlacak ya da azaltlacaktr. Bunun iin karakterin bulunduu noktada DI 1
eksiltilmitir. SCAS komutu tipik olarak memchr() standart C fonksiyonunu yazmak
amacyla kullanlabilir.
Snf almas: Aadaki C kodunu sembolik makine dilinde yaznz.
/*C Kodu*/
model small
.code
_mymemchr proc near
push
mov
push
bp
bp, sp
di
mov
mov
mov
cld
mov
mov
REPNE
jz
ax, ds
es, ax
di, [bp + 4]
NOTFOUND:
xor
jmp
FOUND:
dec
mov
PROC_END:
pop
pop
ret
_mymemchr endp
public _mymemchr
end
173
ax, ax
PROC_END
di
ax, di
di
bp
kullanlmayacak
CreateThread() Fonksiyonu:
Bu fonksiyon thread akn yaratr.
Prototipi:
int CreateThread(THRPROC pThrProc, PVOID pParam, WORD stackSize);
174
Thread'in sonlandrlmas thread iin ayrlan handle alannn silinmesini salamaz. Thread'in
exit code'u bu handle alanna yazlr.
GetThreadExitCode() Fonksiyonu:
Bu fonksiyon sonlandrlm fakat handle alan silinmemi bir thread'in exit code'unun
alnmas iin kullanlr.
int GetThreadExitCode(int thrID);
CloseHandle() Fonksiyonu:
Bu fonksiyon thread iin ayrlan handle alann yok eder.
BOOL CloseHandle(int thrID);
175
Her thread yaratldka bir kuyruk sistemine bu yap eklenmektedir. Buradaki kuyruk sistemi
iin bir dizi kullanlmtr.
PRIVATE THRDB g_thrTable[MAX_THREAD];
Bu yap dizisi sanki heap alan gibi kullanlmtr. ift bal liste teknii uygulanarak son
yaratlan thread kuyruun sonuna eklenmitir. THRDB yapsnn status eleman threadin ve
yap dizisinin o elemannn o anki durumunu belirtir. unlardan bir tanesi olabilir:
THREAD_STATUS_FREE
THREAD_STATUS_EXIT
THREAD_STATUS_RUNNING
Slot bo
Thread sonlandrlm ama slot boaltlmam, exit codeu
alnabilir. CloseHandle fonksiyonu status elemann
THREAD_STATUS_EXITten
THREAD_STATUS_FREE durumuna getirir.
Thread alyor.
Kuyruk sisteminin ban ve sonunu tutmak iin int g_headPos, g_tailPos global deikenleri
kullanlmtr. Ayrca o anda almakta olan threadin ID deeri ve dizideki adresi u global
deikenlerde tutulmutur:
int g_curThr;
THRDB *g_pCurThr;
176
MOV
ax, bx
ax, bx
ax
Bu biimde yerel deikenler global deikenler ve parametre deikenleri bir data sembol
olarak dorudan kullanlabilir. rnein:
int add(int x, int y)
{
asm {
Mov
Add
}
}
ax, x
ax, y
void main(void)
{
printf(%d\n, add(10, 20));
}
Fonksiyonun stack frame dzenlemesini derleyici yapar. Inline assembler yazm C standard
deildir. Inline sembolik makine dilinin faydalar unlardr:
1. Kk sembolik makine dili kodlar iin ayr bir asm modl yazp project oluturmaya
gerek kalmaz.
2. Stack frame dzenlenmesi, fonksiyondan k vb gibi ayrntlarla programc uramaz.
C derleyicilerinin inline assembler dili yazmn desteklemeleri zorunlu deildir.
rnein TC 2 derleyicisinin tmleik evreli srm bunu desteklememektedir.
177
Small Model
Medium Model
178
Compact Model
Grld gibi bu modelde heap tamamen data ve stack blgesinden yarlmtr ve exe
dosyann aasndaki bo blgeye alnmtr. Tabii btn gstericiler uzak gsterici
olmaldr.
Large Model
Grld gibi large modelin compact modelden fark birden fazla code segment olmasdr.
Huge Model
179
Huge modelde heap blgesi yine en aadadr. Ancak birden fazla code ve data segment
bulunabilir.
180