You are on page 1of 180

80X86 SEMBOLK MAKNA DL

Bu dkman Kaan Aslann 1998 ylnda C ve Sistem


Programclar Derneinde vermi olduu 80X86
Sembolik Makina Dili kursunda snfta tutulmu
notlardan olumaktadr. Notlar zerinde hibir
dzeltme yaplmamtr. Notlardaki hatalarn pek
ok nedenden kaynaklanabileceini gz nnde
bulundurunuz.
Notlar tutan arkadaa teekkrler...

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

SF(Sign Flag) ...............................................................................................................21


TF(Trap Flag)...............................................................................................................21
IF(Interrupt Flag)..........................................................................................................21
DF(Direction Flag) .......................................................................................................22
OF(Overflow Flag) .......................................................................................................22
Turbo Debugger ...............................................................................................................22
CS ve IP Registerlarnn nemi.......................................................................................22
Makine Komutlarnn ncelenmesi....................................................................................23
MOV Komutu ..............................................................................................................23
ADD Komutu ...............................................................................................................23
ADC Komutu ...............................................................................................................24
Komutlarn Operand Uyumu ............................................................................................24
SUB Komutu................................................................................................................26
CMP Komutu ...............................................................................................................27
SBB Komutu (Subtract with Barrow) ...........................................................................27
Kalp: ...........................................................................................................................28
MUL Komutu...............................................................................................................28
DIV Komutu.................................................................................................................29
Bit Dzeyinde lem Yapan Komutlar ..................................................................................30
AND Komutu...................................................................................................................30
TEST Komutu ..................................................................................................................30
Kalp: ...........................................................................................................................30
OR Komutu......................................................................................................................31
XOR Komutu ...................................................................................................................31
SHL ve SHR Komutlar....................................................................................................32
SAR ve SAL Komutlar....................................................................................................32
Dndrme Komutlar........................................................................................................32
teleme Ve Dndrme Komutlarnn Biimleri................................................................33
Stack Kullanm....................................................................................................................33
POP Komutu ....................................................................................................................34
Stack Kullanmnn Amac................................................................................................35
PUSHA ve POPA Komutlar ............................................................................................36
INC ve DEC Komutlar ....................................................................................................36
XCHG Komutu ................................................................................................................36
CBW(convert byte to word) ve CWD(convert word to double word) Komutlar ...............36
Dallanma Komutlar.............................................................................................................37
Yer Deitirme(displacement) Kavram............................................................................37
Koulsuz JMP Komutu.....................................................................................................38
Koullu Dallanma Komutlar............................................................................................39
Eitlik Karlatrmas ......................................................................................................40
Eitsizlik Karlatrmas ..................................................................................................40
aretsiz Saylarn Karlatrlmas...................................................................................41
aretli Saylarn Karlatrlmas.....................................................................................41
Dier Koullu JMP Komutlar ..........................................................................................42
Alt Programlarn arlmas................................................................................................42
Alt Programdan Geriye Dn..........................................................................................43
Bayraklar zerinde zel lem Yapan Komutlar ..............................................................44
Sembolik Makine Dili Nedir? ...........................................................................................45
Exe Dosyann Yaps ve Yklenmesi ................................................................................45
Tipik Bir Sembolik Makine Dili Program ........................................................................46

Code, Data ve Stack Blmlerinin Belirlenmesi ...............................................................47


Semboller .........................................................................................................................47
Data Sembollerinin Tanmlanmas....................................................................................48
Program Yklendiinde Registerlarn Durumlar.............................................................49
Programn Sonlandrlmas ...............................................................................................50
Code Sembolleri...................................................................................................................50
proc Bildirimi...................................................................................................................50
Gerek ve Sahte Kodlar(real/pseudo)................................................................................51
Sabitler.............................................................................................................................51
Sabitlerin eitli Tabanlarda Gsterimleri ........................................................................51
Alfabetik Sabitler(stringler).............................................................................................52
Gerek Say Sabitleri........................................................................................................52
BCD Trden Sabitler ........................................................................................................52
Yer Sayac(location counter) ............................................................................................52
ASM Listing Dosyas .......................................................................................................53
Diziler zerinde lemler .....................................................................................................53
LEA(load effective address) Komutu................................................................................53
Sembolik Makine Dilinde For Dnglerinin Oluturulmas ..................................................54
Kalp: ...........................................................................................................................54
Kalp: ...........................................................................................................................54
Kalp: ...........................................................................................................................54
Kod Sembolleri ................................................................................................................55
Alt Programlarla alma .....................................................................................................55
Alt Programlara Parametre Geirilmesi ve Alt Programlarn Geri Dn Deerlerini Almak
.........................................................................................................................................56
Fonksiyonlarn Geri Dn Deerlerinin Oluturulmas....................................................61
Fonksiyon armalarna likin eitli rnekler .............................................................61
Sembolik Makine Dilinde Yazlan Fonksiyonlar Cden arlmas ................................62
Birletirme srasnda kacak problemler ..........................................................................63
e Dngler.................................................................................................................64
Kalp: ...........................................................................................................................64
Kalp: ...........................................................................................................................65
Kalp: ...........................................................................................................................65
Sembolik Makine Dilinde cdecl armna Uygun Fonksiyon Yazmna rnekler ...........67
C Derleyicilerin Sembolik Makine Dili ktlar...............................................................70
OFFSET ve SEG Operatrleri ..............................................................................................71
EXE Dosya Format .............................................................................................................71
Exe Dosyas Balk Ksm ....................................................................................................72
PS P(Program Segment prefix).............................................................................................73
Ykleme Sonrasnda Registerlarn lk Konumlar............................................................74
Derleyicilerin Balang Kodlar(Startup Module) ............................................................74
Cde char Parametrelerin ve Geri Dn Deerlerinin Seyrek Kullanlmas......................76
KESMELER(interrupts) .......................................................................................................76
INT Makine Komutu ve Kesmelere Dallanlmas .................................................................77
IRET makine komutu ...........................................................................................................78
Kesmenin Hook Edilmesi .................................................................................................78
Kesme Kodunun Yazlmas ..............................................................................................79
Sembolik Makine Dilinde Dolayl JMP ve CALL lemleri ..............................................80
Bellek Eriimlerinde Segment Ykleme Durumlar ..........................................................80
Kesmelerin Fonksiyonlar ve Alt Fonksiyonlar ................................................................81

Kesmenin Parametreleri ve Geri Dn Deerleri.............................................................81


DOS ve BIOS Kesmeleri ..................................................................................................81
10h Video Kesmesi ..........................................................................................................82
INT 10h, F:0Ah(write char) ..........................................................................................82
INT 10h, F:0Eh(write char) ..........................................................................................83
21h Kesmesi.....................................................................................................................85
INT 21h F:01h..............................................................................................................85
INT 21h F:2..................................................................................................................86
INT 21h F:7 ve F:8 .......................................................................................................86
INT 21h F:0Ah (buffered keyboard input) ....................................................................86
INT 21h F:25h(set interrupt vector) ..............................................................................87
INT 21h F:35h(get interrupt vector)..............................................................................87
INT 21h F:39h(create sub directory) .............................................................................87
INT 21h F:9h................................................................................................................88
Makro Kullanm ..............................................................................................................89
Include lemi...................................................................................................................90
LOCAL Komutu ..............................................................................................................92
Matematik lemcinin Kullanlmas ......................................................................................93
Matematik lemci Nedir? ................................................................................................93
Normal lemci ile Matematik lemcinin Birlikte almas ............................................94
Matematik lemcinin Register Yaps ..............................................................................94
Noktal Saylarn Bellekte Tutulma Biimleri ...................................................................94
Noktal Say Formatlar ....................................................................................................95
Yuvarlama Hatas(rounding error)....................................................................................95
Float(short real) Format........................................................................................................96
BIAS Deerinin Anlam ...................................................................................................97
Noktal Say Formatnda zel Saylar..............................................................................97
Double(long real) Format ................................................................................................98
Long Double(extended real) Format ................................................................................98
Matematik lemcide Noktal Saylarla lemler ...................................................................98
FLD Komutu....................................................................................................................99
FST ve FSTP Komutlar ...................................................................................................99
Tam Saylara likin PUSH ve POP Komutlar .................................................................99
FADD, FADDP Komutlar .............................................................................................100
Cde Gerek Say Trlerine Geri Dnen Fonksiyonlar...................................................101
FMUL ve FMULP Komutlar .........................................................................................102
FDIV ve FDIVP Komutlar ............................................................................................102
FSIN, FCOS, FTAN, FSQRT Komutlar ........................................................................102
BORLAND derleyicilerin Matematik lemci Seenekleri ..............................................103
Gerek Say Emlasyonu................................................................................................103
Sembolik makine dilinde gerek saylar tutan sembollerin tanmlanmas: ......................103
PipeLine lemi ..............................................................................................................104
Normal lemciyle Matematik lemcinin Senkronizasyonu............................................104
Wait komutunun alma biimi: ....................................................................................105
Gerek Saylarn Karlatrlmas : ................................................................................106
Status Register(status word) ...........................................................................................106
Normal lemcilerde Bayrak Register zerinde lemler ..............................................107
C0, C2 ve C3 Status Register Bitlerinin Karlatrmadaki Anlamlar............................108
Programlama Dillerindeki Yerel Deikenlerin Kullanlmas..............................................109
Hizalama(Alignment).........................................................................................................116

Word Hizalamas(word alignment) .................................................................................116


Dword Hizalamas(dword alignment) .............................................................................117
Hizalama Problemleri .....................................................................................................117
C++ta Bir Snfn ye Fonksiyonlarnn Sembolik Makine Dilinde arlmas ................119
Cde Deiken Sayda Parametre Alan Fonksiyonlarn Sembolik Makine Dilinde Yazm..121
C'de deiken sayda parametre alan fonksiyonlarn yazm:...............................................123
C'de Deiken Sayda Parametre Alan Fonksiyonlara rnekler ..........................................125
Uzak Gstericilerin Yklenmesi.........................................................................................126
lds, les, lfs, lys Makine Komutlar: .....................................................................................126
C Derleyicilerinin Uzak Gsterici lemlerini Ele Al Biimi ............................................127
CPU'nun Durumunun Saklanmas ......................................................................................127
CPU Konumunun Saklanp Geri Yazlmas Srasnda Dikkat Edilecek Durumlar ...............128
1) CS ve IP deerlerinin saklanp yklenmesi:................................................................128
2) SS:SP register'larnn saklanmas ve yklenmesi: .......................................................129
3) Dier Register'larn saklanmas ve yklenmesi: ..........................................................130
C'de Yerel Olmayan Dallanmalar .......................................................................................130
setjmp Fonksiyonu .........................................................................................................131
longjmp Fonksiyonu.......................................................................................................131
Neden longjmp Kullanlr? .............................................................................................132
setjmp ve longjmp Fonksiyonlarnn Sembolik Makine Dilinde Yazm..........................133
DOSta Uzak Modellerde lemler......................................................................................134
Tiny Model.....................................................................................................................134
Small Model...................................................................................................................134
Medium Model...............................................................................................................134
Compact Model..............................................................................................................134
Large Model...................................................................................................................135
Huge Model ...................................................................................................................135
Uzak Modellerde Data Gstericileriyle lemler .................................................................135
Win32/UNIX Flat Model Sistemi .......................................................................................136
Ayrntl Segment Tanmlar...............................................................................................136
Segment Tanmlama leminin Genel Biimi..................................................................136
Segmentleri Exe Kod erisindeki Dizilim Sras...............................................................139
Segment Tanmlamasnda Kullanlan Snf sminin Segment Sralamasna Etkisi .......140
C Derleyicileri ve Segmentler .......................................................................................141
Tiny model .................................................................................................................142
Small model ...............................................................................................................142
Medium model ...........................................................................................................142
Compact model ..........................................................................................................142
Large model ...............................................................................................................142
Huge model ................................................................................................................142
Segment Kavramnn nemi...........................................................................................142
Ayrntl Segment Tanmlamalar ve Bellek Modeli........................................................144
Birden Fazla Data Segmenti ile almak......................................................................144
Birden Fazla Kod Segmenti ile almak ......................................................................144
Win32/UNIX Flat Modellerde Segment lemleri...........................................................145
Grup Kavram ................................................................................................................145
Grup Kullanm ..............................................................................................................146
Assume Bildirimi ...........................................................................................................147
OMF Format .....................................................................................................................148
OMF Formatn Genel Yaps .........................................................................................148

16 VE 32 BIT OMF KAYITLARI..................................................................................148


Data ve Kod Sembollerinin obj Dosyaya Yazlmas............................................................150
Makine Kodlarnn ve Statik Datalarn obj Modle Yazlmas ............................................152
Basitletirilmi Segment Kullanmnda Segment lemleri..................................................153
Relocatable Adresler ..........................................................................................................153
Relocatable Adresler ve Relocation Tablosu.......................................................................154
COM Dosyalar ...................................................................................................................154
ORG Komutu .................................................................................................................155
COM Programlarn Yazm ............................................................................................155
Tek Segmentli COM Programlarnn Yazlmas ............................................................155
ok Segmentli COM Programnn Yazlmas ................................................................156
Tiny Model Programlar ve COM Dosyalar ....................................................................157
COM Programlarnn nemi ..........................................................................................157
COM Programnn Kullanlmasna Tipik Bir rnek: Boot programnn yazlmas ..........157
letim Sistemi Yazmnda zlenecek Yntem.....................................................................159
letim Sisteminin Sistem Fonksiyonlarnn arlmas iin Kullanlan Yntemler.......Error!
Bookmark not defined.
Modllerle alma ............................................................................................................160
Communal Tanmlama ...................................................................................................162
String Komutlar ................................................................................................................163
Komutlarda nek(prefix) ...................................................................................................163
66 ve 67 nekleri ...........................................................................................................163
Segment nekleri ...........................................................................................................164
REP neki .....................................................................................................................164
LODS Komutu ...............................................................................................................164
LODSB Komutu.............................................................................................................164
LODSW Komutu............................................................................................................165
STOS Komutu................................................................................................................165
REP nekinin levi .......................................................................................................165
STOSB...........................................................................................................................165
Small model memset rnei:.......................................................................................166
MOVS Komutu ..............................................................................................................166
MOVSB .........................................................................................................................166
MOVSW ........................................................................................................................168
Heap Algoritmas ...............................................................................................................168
Bo Bal Liste Algoritmas............................................................................................169
TINUX Sisteminde Heap Organizasyonu ...........................................................................170
Kernel Heap Fonksiyonlarnn Tasarm iin Yaplacak lemler ........................................171
SCAS Komutu:...............................................................................................................172
rnek Thread Ktphanesi:................................................................................................174
Thread Ktphanesinin kullanm:..................................................................................174
InitThreadLib() fonksiyonu: .......................................................................................174
CreateThread() Fonksiyonu: .......................................................................................174
ExitThread() Fonksiyonu:...........................................................................................175
GetThreadExitCode() Fonksiyonu: .............................................................................175
CloseHandle() Fonksiyonu: ........................................................................................175
EndThreadLib() Fonksiyonu:......................................................................................175
Thread Ktphanesinin Kullanlmasnda Dikkat Edilmesi Gereken Noktalar:.................175
Thread Ktphanesinin sel Tasarm:...........................................................................176
Cde Inline Sembolik Makine Dili......................................................................................177

DOS Sisteminde Heap Ynetimi ........................................................................................178


Tiny Model.....................................................................................................................178
Small Model...................................................................................................................178
Medium Model...............................................................................................................178
Compact Model..............................................................................................................179
Large Model...................................................................................................................179
Huge Model ...................................................................................................................179

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.

Adres yolu (Address Bus)

C
P
U

..........
..........
.........

Data yolu (Data Bus)

R
A
M

Kontrol yolu (Control

Mikroilemci dngsel bir biimde ilemlerini gerekletirir. Yani;


1) Bir grup byte topluluunu RAM'den okur (instruction fetch).
2) Bu byte topluluunun hangi komut olduunu yorumlar.
3) Bu komutu altrabilmek iin elektronik devreleri altrr.
4) Tekrar birinci adma dnlerek ilemler yinelenir.

Baz mikroilemcilerde makine komutlarnn uzunluklar hep ayndr (zellikle RISC


grup ilemciler). Oysa Intel gibi pek ok CISC ailesi ilemcilerde komutlar farkl
uzunluklarda olabilir. Mikroilemci komutu yorumladktan sonra uzunluluunu da elde etmi
olur. Bylece bir sonraki komutun yerini de saptayabilir.
Mikroilemcinin nemli bir blm, ilemlerin yaplmasn salayan mantk
devreleriyle kapldr. Makine komutlarnn operantlar bellee ilikin olabilir. rnein bir
makine komutu "500 numaral bellek blgesindeki sayy 1 artr" biiminde olabilir. Bu
durumda ilemci komutu altrrken bellekten yine okuma ve yazma yapmak zorundadr.
Yani mikroilemci yalnzca komutu elde etmek iin deil, komut ierisndeki operantlar elde
etmek iin de bellee eriir.
Tipik Bir RAMin Yaps
RAM'ler entegre devre biiminde retilir. D dnya ile balanty salayan eitli
ular vardr. Bir RAM genellikle byte biiminde organize edilmi gzeneklerden oluur. Her
gzenek ierisinde tipik olarak 8 bit vardr. Ama 8 bit olmas zorunlu deildir. RAM'ler
genellikle kapasite olarak ;
gzenek says * gzenekteki bit says'dr.
rnek: 1024 * 8
1024 byte'lk bir RAM'de herhangi bir gzenei seebilmek iin ikilik sistemde 10 tane
elektriksel hat gerekir. Dardaki bir devre bu ulara 5 volt ya da 0 volt gerilim uygulayarak
bir say oluturur. RAM devresi de bu bilgiyi alarak hangi gzenein seilmi olduunu anlar.
Bir gzenei semekte kullanlan bu ulara RAM'in adres ular denir. A0, A1, A2, ...
biiminde gsterilir. Bunun dnda gzenek seildikten sonra okuma m, yoksa yazma m
yaplacan anlatmaya sra gelir. Bu ilem ayr bir utan yaplr. BU uca R / W ucu denir.
rnein bu uca 5 volt uygulanrsa okuma yaplaca, 0 volt uygulanrsa yazma yaplaca
anlamna geliyor olabilir. RAM'in gzeneklerdeki bilgiyi aktarmak iin kullanlan bir veri ucu
vardr.Bu ular genellikle D0, D1, D2, ... olarak isimlendirilir. (www.dalsemi.com adresinden
Akbil'in mekanizmasn renebilirsin (1991 ilemci).) Bu durumda 1024 * 8'lik bir RAM de
10 tane adres ucu, 8 tane data ucu ve bir tane de R/W ucu olmaldr. ve ek olarak baka ular
da vardr.
RAM'den okuma yle yaplr:
1.Adm : Adres ularna gzenek numaras girilir.
2.Adm : R/W okuma konumuna getirilir.
3.Adm : Bir sre beklenir ve data ular rneklenir.
Yazma ilemi ise yle yaplr:
1.Adm : Gzenek numaras adres ularna braklr.
2.Adm : R/W ucu yazma konumuna getirilir.
3.Adm : Yazlacak bilgi ikilik sistemde data ularna braklr.
CPU ile RAM Arasndaki Balant

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.
-

Genel amal registerlar uyum korunarak 4 bytea ykseltilmitir.

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.
-

Index registerlar da 32 bite ykseltilmitir.

Pointer registerlar da 32 bite ykseltilmitir.

14

Segment registerlar 16 bit olarak kalmtr, FS ve GS isimli iki segment register daha
eklenmitir.

Flag register 32 bite ykseltilerek EFLAGS ismini almtr.


Makine Komutlarndaki Bellek Operandlar

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

MOV AX, [100]


Burada register operand 2 byte olduu iin 100 ve 101 numaral byte deerleri AX
registerna atanacaktr. Eer komut
MOV AL, [100]

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]

komutu aadaki gibi ilenecektir.

16 Bit almada Bellek Operandnn Oluturulmas


16 bit almada keli parantezler ierisine getirilecek bellek operandlar sabit ya da
register ierecek biimde olabilir. Keli parantez ierisinde bellek operand biiminde
bulunabilecek registerlar BX, BP, DI ve SI registerlardr. BX ve BP registerlarna base
registerlar SI ve DI registerlarna ise index registerlar denir. Keli parantez ierisinde bu
registerlar tek balarna bulunabilir ya da base ve index register toplam biiminde
bulunabilir. ki base register toplam ve iki index register toplam yasaklanmtr. 16 bit
almada btn bellek operandlar aadaki gibi oluturulabilir.
disp8
disp16

1.
2.
3.
4.
5.
6.
7.

8 bitlik bir sabit say


16 bitlik bir sabit say

[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]

Buradaki olaslklar szel olarak yle aklanabilir:


1. Keli parantez ierisinde 16 bit sabit bir say
2. BX, BP, SI, DI registerlar tek balarna keli parantez ierisinde
3. BX, BP, SI, DI registerlar disp8 toplamyla keli parantez ierisinde

16

4.
5.
6.
7.

BX, BP, SI, DI registerlar disp16 toplamyla keli parantez ierisinde


Bir base ve bir index register toplam keli parantez ierisinde
Bir base, bir index ve disp8 toplam keli parantez ierisinde
Bir base, bir index ve disp16 toplam keli parantez ierisinde

[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]

Default Segment Register


DS
SS
DS
DS
DS

Bellek operandnn default segment register 1 byte uzunluunda makine komutu


eklenerek deitirilebilir. Sembolik makine dilinde bu deitirme ilemi segreg:[operand]
biiminde yaplr. rnein:
ss:[BX]
cs:[SI]
es:[BX]
ds:[BP]

17

rnein bir komut ierisinde aadaki gibi kullanlabilir:


MOV AX, ES:[BX]

Bellek operandnn sembolik makine dilinde belirtilmesinde iki edeer biim


kullanlr. bellek operand toplam ieriyorsa + sembol kaldrlp gsterim ayrk keli
parantezlerle yaplabilir. rnein [BX + SI] ile [BX] [SI] edeerdir. Ya da rnein [BX + SI
+ disp8] ile [BX] [SI] [disp8] edeerdir. Toplamann deime zellii olduu iin toplam
ifadesindeki elemanlar yer deitirebilir.
16 Bit Adresleme lemi
8086 mikroilemcisi 1 MB bellek kullanabilecek biimde tasarlanmtr. 8086
ilemcisinin 20 tane adres ucu vardr(A0-A19). 1 MB bellek 5 hex digit ile gsterilebilir.

16 bit almada keli parantez ierisindeki bellek operand en fazla 16 bit


uzunluunda olabilir. Toplam bu uzunluu asa bile yksek anlaml bitler atlarak dk
anlaml 16 bit elde edilir. 8086 ilemcisi bir bellek operandyla karlat zaman 20 bitlik
fiziksel adresi yle bulur:
1. Fiziksel adres 2 byte segment, 2 byte offset bilgisinden elde edilir. Segment deeri
segment registerlarnn ierisindedir. Offset deeri bellek operand olarak keli parantez
ierisindedir. Mikroilemci bellek operandyla ilikili segment register tespit eder ve o
registern deerini 16 ile arpar(sana 0 ekler).
2. Bunu keli parantez ierisinde bulunan offset deeriyle toplar. Sonu 5 hex digit
uzunluunda bir bilgidir. Bu bilgi adres yoluna verilir.
rnein:
DS = 1234
BX = 1000 ise
MOV AX, [BX]

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]

ilemi sonucunda AX registerna 138F * 16 + 1000 + 10 = 14900 fiziksel adresindeki veri


yerletirilir.
Segment register ierisindeki deeri hi deitirmeden yalnzca offset deerini
deitirerek segment * 16 adresinden ancak 64 KB uzaklalabilir.

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

32 Bit Bellek Operandnn Oluturulmas


Korumal modda 32 bitlik bellek operand 16 bitten daha geni ve farkl biimde
oluturulmaktadr. 32 bitlik bellek operandlar yle oluturulur:
1. [disp32]
2. [EAX], [EBX], [ECX], [EDX], [EBP], [ESI], [EDI]
3. [EAX + disp8], [EBX + disp8], [ECX + disp8], [EDX + disp8], [EBP + disp8], [ESI +
disp8], [EDI + disp8]
4. [EAX + disp32], [EBX + disp32], [ECX + disp32], [EDX + disp32], [EBP + disp32], [ESI
+ disp32], [EDI + disp32]
5. EAX, EBX, ECX, EDX, EBP, ESI, EDI, ESPnin ikili btn toplamlar
6. EAX, EBX, ECX, EDX, EBP, ESI, EDI, ESPnin btn ikili toplamlar + disp8
7. EAX, EBX, ECX, EDX, EBP, ESI, EDI, ESPnin btn ikili toplamlar + disp32
8. 5., 6. ve 7. maddelerdeki oluumlarda ikinci toplam operand olan register 1, 2, 4, 8
arpanlarn alabilir.
[EAX]
[EBX * 4]
[ECX + EAX * 4]
[EAX + EBX + disp16]
[EAX + EBX + 32]
[EAX * 2 + disp8]
[ESI + EAX * 4 + disp32]
[EAX + EAX]

Geerli
Geersiz
Geerli
Geersiz
Geerli
Geersiz
Geerli
Geerli
16 Bit almada Flag Register

8086 ilemcisinde F ya da FLAG biiminde belirtilen ve ismine bayrak register


denilen bir register vardr. Bu register 386 ve sonraki modellerde korumal modda
kullanlmak zere EFLAGS ismi verilerek 32 bite ykseltilmitir. Flag register bit bit
anlaml bir registerdr. Her bitin anlaml dierinden farkldr. Mikroilemci eitli makine
komutlarn altrdktan sonra komutlarn sonular hakknda ilave bir takm bilgiler verir.
rnein Bir toplama ilemi yapldnda tama olmu mudur? ya da Oluan saynn iaret
biti nedir? gibi. Flag registernn bitleri komut altrldktan sonra ilemci tarafndan 1 ya
da 0 yaplr. Bu bitlerin 1 yaplmasna set edilmesi, 0 yaplmasna reset edilmesi denir.
Her makine komutu bayrak registernn bitleri zerinde etkili olmaz. Bir komutun btn
bitleri etkileyecei anlam da kmamaldr. Bir komutun flag registernn hangi bitlerini
etkiledii, bu etkiden kan sonular ilgili komut renilirken ayrca renilmek zorundadr.
15
-

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

Turbo debugger program ile unlar yaplabilir:


Manuel olarak makine komutlar girilebilir ve altrlabilir.
Komutlar altrlrken CPU registerlarnn durumlar incelenebilir.
Bellekteki herhangi bir blge incelenebilir.
Bir exe dosya program yklenerek makine kodlar incelenebilir.
CS ve IP Registerlarnn nemi

IP register offset belirtir. Segment register CSdir ve deitirilemez. Mikroilemci


komutlar yle altrmaktadr: CS:IP registernn gsterdii yerden bir byte topluluunu
okur, bunu komut olarak yorumlar, ilemini yapar ve IP registern komutun uzunluu kadar
arttrr. Yani CS ve IP birlikte ilemcinin o anda altrd makine komutunun adresini
belirtmektedir. Aslnda her mikroilemcide ve mikrodenetleyicide bu grevi yapan bir register
vardr. Genellikle bu register PC(program counter) biiminde isimlendirilir. Turbo debuggera
ilk girildiinde btn segment registerlar ayn deeri gsterir. Bu segment adresi ilk bo
blgenin adresidir. Turbo debuggerda ana pencerede yle bir grnt vardr:
CS:IP
CS:0100

Makine komutunun hex karl


Komutun sembolik karl
56
PUSA SI

Sa taraftaki pencerede registerlarn deerleri vardr. Komut altrlnca bu deerler


deiebilir. En sadaki pencerede flag registerndaki bitler grlmektedir. Aa pencerede
DS segment register kullanlarak bellekten bir kesit verilmitir. Bir makine komutu yazlrsa
makine komutu bandn bulunduu adrese girilmi olur. Bir registern durumunu dardan
deitirmek iin o registern zerinde say yazlr. F7 tuu bir komutu altrmaya yarar.

22

Makine Komutlarnn ncelenmesi


Her makine komutunun firma tarafndan belirlenmi biimleri vardr. Bir komut
renilirken btn bu biimlerin renilmesi gerekir. Komutlarn aklanmasnda kullanlacak
ksaltmalar unlardr:
Sreg
Reg
reg/mem
Sabit

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

MOV AX, [SI]

Bu komut AF, CF, OF, PF, SF ve ZF flagleri zerinde etkili olmaktadr.


ADC Komutu
Biimleri:
1. reg reg/mem
2. reg/mem sabit
Mikroilemcilerin hemen hepsinde bu ilemi yapan bir toplama komutu vardr. ADD
komutundan farkl olarak iki operandn toplamndan baka bir de CF bayran da toplar. Bu
komut yardmyla ilemcinin register uzunluundan byk iki tamsay toplanabilir. Bylelikle
16 bit sistemde 32 bitlik iki say nce dk anlaml WORD deerleri ADD komutuyla sonra
yksek anlaml bytelar ADC komutuyla toplanabilir.

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

MOV AX, [200]


ADD AX, [204]
MOV [208], AX
MOV AX, [202]
ADC AX, [206]
MOV [20A], AX

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

Bir komutta ilemcinin deerlendirdii iki parametre sz konusudur:


-

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

Gerek mod Korumal mod

MOV EAX, [ESI]


ADD EAX, [SI]
MOV AX, [ESI]
MOV AX, [SI]
MOV AL, [SI]
MOV AL, [ESI]

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

ilemi yle yaplr:


1C
2F
-2F(2Fnin 2ye tmleyeni)

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

SUB EAX, [1FC4]


MOV [1FC8], EAX

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

unsigned int a,b,c,d;


d = a*b*c;
MOV AX, a
MUL word ptr b
MUL word ptr v
MOV d, AX
unsigned int a,b,c;
d = (a+b) * c;

ilemi yle yaplr.


MOV AX, a
ADD AX, b
MUL word ptr c
MOV d, AX

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;

ilemi yle yaplabilir.


MOV DX, 0
MOV AX, x
DIV word ptr y
MOV z, AX

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

yerine bu kod tercih edilebilir:


if (x & 1) {
}

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

zellikle ifreleme ilemlerinde tercih edilir.


Kalp:
Bir sayy kendisiyle XOR ilemine sokarsak 0 elde ederiz. Bir register sfrlanmak istendiinde
aadaki yntemlerden birisi kullanlabilir:
MOV AX, 0
SUB AX, AX
AND AX, 0
XOR AX, AX

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

AH:1111 0101 CF:0(sondaki bit saa carry li dndrmede)


Eldeli versiyonlarda CF bayra sanki saynn en dk anlaml bitiymi gibi ilem grr.
Yani dndrme ilemine aktif olarak katlr.
Kalp:
16 bit ilem genilii kullanarak 32 bitlik bir sayy sola ve saa telemek iin dk anlaml
word deeri telemek yksek anlaml word deeri dndrmek gerekir.
DX:AX gibi bir 32 bitlik bilgi olsun bunu sola bir otele.
SHL AX,1
RCL DX,1

teleme Ve Dndrme Komutlarnn Biimleri


Btn teleme ve dndrme komutlar 3 biimden oluur.
1.
2.
3.

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

(80186 ve sonras iin)

80186 ve sonras iin doru


Doru
Doru

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

Programn stack blgesi balangta belirlenir daha sonra byltlemez ve


kltlemez. Ar derecede PUSH ilemi yaplrsa SP stack iin ayrlan blgeyi geer buna
stack overflow denir(stackin yukardan tamas). Stack tamalar ilemci tarafndan otomatik
olarak tespit edilemez. Stack blgesini byklne programc karar verir ancak program
baladnda SP reg. konumlandrlmasn ykleyici yapar.
POP Komutu
Bu ilemde SP register ile belirtilen blgeden 2 byte alnr (korumal modda ESPnin
gsterdii yerden 4 byte) ve SP 2 byte artrlr.
Bir kere PUSH bir kere POP yapldnda SP eski deerine ekilmi olur. rnein
aadaki ilemler sonrasnda AX ve BX registerlarnn ilerindeki deerler yer
deitirilebilir.
PUSH AX
PUSH BX
POP AX
POP BX

34

Stack Kullanmnn Amac


Stack kullanmn 2 amac vardr:
1.
Bilgilerin geici olarak saklanmas
2.
Programlama dillerinde yerel deikenlerin saklanmas ve parametre aktarlmas
Biz burada yalnzca birinci kullanm amac zerinde duracaz.
rnein CX register iindeki bilgiyi tutmak isteyelim. Ve elimizde hibir bo
register kalmam olsun. bu durumda rnein CX registern zorunlu olarak bozmak
durumunda kalabiliriz. (rnein CL registernn yklenmesini gerektiren bir teleme ilemi
olabilir.) te CX iindeki bilgi geici sre stackte saklanabilir.
PUSH CX
MOV CL, 3
ROL AX,CL
POP CX

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]

Byle bir ilem zel durumlarda kullanlr.


PUSH ve POP komutlar herhangi bir biimde bayraklar etkilemez.
Stack ile ilgili dier iki nemli komut PUSHF ve POPF komutlardr. Normal olarak
flag register birka zel komut dnda hibir biimde kullanlamaz. (genel gsterimlerdeki
reg flag ve segment registerlar haricindeki tm registerlar, sreg ise yalnzca segment
registerlarn gstermektedir.)
Flag register iindeki bilgiyi almak ve flag registerna yeni bir deer yklemek iin
PUSHF ve POPF komutlar kullanlr.
rnein bayrak register iine bilgi yerletirmek iin:
PUSH AX
POPF

komutlar; bilgi almak iin:


PUSHF
POP AX

35

komutlar kullanlabilir. POPF komutlar tm bayraklar etkiler.


Bazen btn registerlarn stackte saklanmas gerekebilir. rnein bir donanm
kesmesi olutuunda arlacak bir kod yazmak istesek kesme knda btn registerlarn
ilk konumuna getirilmesi gerekir. bunun iin kesme koduna girite btn registerlar stackte
saklanmal, kta da hepsi geri alnmaldr.
Bu ilemi kolaylatrmak iin 2 zel komut vardr.
PUSHA ve POPA Komutlar
PUSHA komutu srasyla 16 bit sistemde AX, CX, DX, BX, SP, BP, SI, DI registerlarn
stacke atar. POPA ters srada geri eker.
INC ve DEC Komutlar
Bu komutlar tek operandr ve operandn tek arttrr ya da azaltr.
Biimleri:
INC/DEC reg/mem
Komutun etkiledii bayraklar: AF, OF, PF, SF ve ZFdir(Bu komutlar CF bayra zerinde
etkili olmaz, nk zaten elde olutuunda ZF bayrayla bu tespit edilebilmektedir).
XCHG Komutu
Biimleri:
XCHG regreg/mem
ki bellek blgesini yer deitirmek iin aadaki gibi bir ilem yapabiliriz. Bu komut
herhangi bir bayra etkilememektedir.
Kalp:
A ve B ile ifade edilen iki bellek blgesindeki verilerin yerlerinin deitirilmesi aadaki
makine komutlar dizisiyle yaplabilir:
MOV AX, A
XCHG AX, B
MOV A, AX

CBW(convert byte to word) ve CWD(convert word to double word) Komutlar


Bu komutlar bytetan worde ya da wordden dworde iaretli dnm yapan
komutlardr. Bu komutlar operandszdr. Ancak gizlice AX ve DX registerlar zerinde etkili
olurlar. rnein Cde kk tamsay trnn byk tamsay trne dntrlmesi ileminde
bu makine komutlarndan yararlanlr.
CBW komutunda dntrlecek say AL registernn ierisine yerletirilir. Komut
uygulandktan sonra dntrlm olan say AXten alnr. rnein Cde aadaki gibi bir
dnm olsun:

36

char x = -1;
int y;
y = x;

derleyici aadaki gibi bir kod retecektir:


MOV AL, FF
CBW

CWD komutunda dntrlecek bilgi AXe yerletirilir. Komut uygulanr. Sonu


DX, AXten alnr.
Bu komutlarn dntrme dnda DX registern ayarlamas dnda iaretli blme
komutlarndan nce kullanlmasna sk rastlanr. rnein Cde 16 bit iki sayy aadaki gibi
blecek olalm:
int a, b, c;
a = b/ c;

bu ilem iin DX:AX registerlarnn hazrlanmas gerekir. DX register saynn iaretine


gre 00 ya da FFlerle doldurulacaktr. lem aadaki gibi yaplabilir:
MOV AX, b
CWD
IDIV word ptr c
MOV a, AX

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:

Debuggerlarda JMP ilemi iin hedef adres kullanlr. rnein:


JMP 1000
Sembolik makine dilinde ve debuggerlarda byle olmasna karn makine dilinde JMP
komutunun operand yer deitirme miktar biiminde bulunmaktadr. Yani sembolik makine
dili derleyicileri ve debuggerlar ilem kodunu belirlerken yer deitirme miktarn
hesaplarlar.
lem kodu: Komutun makine dilindeki ikilik sistemdeki karldr. Yer deitirme
miktarnn origin noktas JMP komutundan bir sonraki komutun yeridir. Yani sonraki
komutun yeri 0 olmak zere ileriye doru yaplan dallanmalar pozitif, geriye doru yaplan
dallanmalar negatif yer deitirme miktar biiminde verilir.
Koulsuz JMP Komutu
Koulsuz JMP komutunun 5 ayr biimi vardr:
1. Segment ii ksa JMP(direct within segment short JMP)
Bu komut 2 byte uzunluundadr. lk byte EB biimindedir. kinci byte yer deitirme
miktarn belirtir. Bu komut ile en fazla [-128, +127] uzaklklara dallanlabilir. Bu
dallanma biimi sembolik makine dilinde short anahtar szc kullanlarak belirtilir.
rnein:
JMP short EXIT
...
...
...
EXIT:

Sembolik makine dili derleyicileri ileriye doru dallanmalarda(forward jump) short


anahtar szc kullanlmamsa dallanmann ksa olduunu anlayamaz. Ancak geriye
doru dallanmalarda bunu anlar.
2. Segment ii dorudan yakn JMP(direct within segment near JMP)
Bu komut 3 byte uzunluundadr. Komutu anlatan byte E9 biimindedir. Bu byte 2
bytelk yer deitirme miktar takip eder. Yani yer deitirme miktar [-32768, +32767]
arasndadr. Bu komutla segmentin her yerine dallanlabilir. Pozitif ya da negatif yer
deitirmede segment dna klrsa sarma ilemi(wrapping) uygulanr.
3. Segment ii dolayl yakn JMP(indirect within segment JMP)
Bu komut 2 byte uzunluundadr. FF komutu anlatan bytetr. Dier byte register ya da bellek
operandn belirtir. rnein:
JMP near [SI]

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();

C kodu, aadaki ekilde sembolik makine dilinde ifade edilebilir:


MOV p, func
CALL near p

Dolayl JMP ileminde registerlar da kullanlabilir. rnein:


JMP AX

4. Segmentler aras dorudan JMP(direct intersegment JMP)


Bu komut 5 byte uzunluundadr. Komut EA ile balar. Bundan sonra iki byte offset ve iki
byte segment bilgisi alr. Offset IP registerna segment CS registerna yerletirilir ve baka
bir segmente dallanlr. Komut sembolik makine dilinde ve debuggerlarda JMP segment:offset
biiminde bildirilir. rnein:
JMP 0FFFF:0000

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

Intelin 16 bir ilemcilerinde koullu JMP komutlarnn ilem kodu 2 byte


uzunluundadr. Birinci byte komutun kendisini, dier byte yer deitirme miktarn
(displacement) anlatr. Yani 16 bit mimaride koullu JMP komutlaryla en fazla bulunulan
yerden 128 byte uzakla dallanma yaplabilir. 80386 ve sonrasnda koulu JMP komutlar 2
byte ve 4 byte yer deitirme yaplabilecek biimde geniletilmitir.
Eitlik Karlatrmas
ki deerin eitlii CMP komutundan sonra ZF bayrana baklarak tespit edilebilir.
Bu testi yapan makine komutu JZ/JEdir(Bu iki komut birbirinin aynsdr). Koullu JMP
komutlar koul salanmsa belirtilen blgeye dallanmay salarlar. Koul salanmamsa bir
sonraki komuttan devam ederler. Aadaki C karlatrmasnn sembolik makine dili
karl:
if (x == y)
ifade1;
else
ifade2;

MOV AX, x
CMP AX, y
JZ @1
fade2
JMP NEXT
@1:
ifade1
@2:

Burada tipik bir if komutunun sembolik makine dilindeki karl grlmektedir.


Eitsizlik Karlatrmas
CMP komutundan sonra JNZ/JNE komutu ile ZF bayra 0 ise dallanlabilir.
Kalp:
Bellekte bulunan bir deerin 0 olup olmadn anlamak iin iki yntem kullanlabilir.
1. Deikeni dorudan 0 ile karlatrp ZF bayrana bakmak,
2. Deikeni registera ekip kendisiyle AND ya da OR ilemine sokmak. Bu yntem daha
etkindir. Aadaki if ifadesinin sembolik makine dili karl:
if (result)
ifade1;
else
ifade2;

MOV AX, result


AND AX, AX
JNZ @1
fade2
JMP @2
@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:

aretsiz Saylarn Karlatrlmas


aretsiz saylarn karlatrlmas iin SUB ya da CMP komutundan sonra CF ve ZF
bayraklarna bakmak yeterlidir. Aada aklanan komutlar yalnzca bu bayraklara
bakmaktadr. aretsiz karlatrma yapan komutlar ve e deerleri aada verilmitir:
Komutlarda byktr iin above szc, kktr iin below szc kullanlmaktadr.
Karlatrma ileminin anlatm SUB ya da CMP komutunun birinci operand dikkate
alnarak kurulmutur.
JA(jump if above)/JNBE(jump if not below or equal)
JB(jump if below)/JNAE(jump if not above or equal)
JAE(jump if above or equal)/JNB(jump if not below)
JBE(jump if below or equal)/JNA(jump if not above)
if (x >= y)
ifade1;
else
ifade2;

MOV AX, x
CMP AX, y
JAE @1
ifade2
JMP @2
@1:
ifade1
@2:

aretli Saylarn Karlatrlmas


aretli saylarn karlatrlmasnda SUB ya da CMP komutundan sonra OF, ZF ve
SF bayraklarna baklr. Karlatrmann anlatm yine birinci operanda gre kurulmutur.
Byktr iin greater, kktr iin less szckleri seilmitir. aretli karlatrma komutlar
unlardr:
JG(jump if greater)/JNLE(jump if not less or equal)
JL(jump if less)/JNGE(jump if not greater or equal)
JGE(jump if greater or equal)/JNL(jump if not less)
JLE(jump if less or equal)/JNG(jump if not greater)
if (x >= y)
ifade1;
else
ifade2;

MOV AX, x
CMP AX,y
JGE @1
ifade2
JMP @2
@1:
ifade1
@2:

41

Dier Koullu JMP Komutlar


aretli ve iaretsiz karlatrma komutlarnn dnda CF, OF, PF ve SF bayraklarnn
durumuna gre dallanmay salayan 8 koullu JMP komutu da vardr:
JC(jump if carry)
JNC(jump if not carry)
JO(jump if overflow)
JNO(jump if not overflow)
JP(jump if parity)
JNP(jump if not parity)
JS(jump if sign flag set)
JNS(jump if not sign flag set)
Alt Programlarn arlmas
Cde bir fonksiyon arldnda fonksiyonun ana blou bittiinde ya da fonksiyon
ierisinde return anahtar szc kullanldnda ak arlma ileminden sonraki koddan
devam eder. Fonksiyonlarn arlmas iin Intel ilemcilerinde CALL makine komutu,
fonksiyondan geri dnmek iin ise RET komutu kullanlr. CALL makine komutunun
JMPden tek fark dn adresinin stackte saklanmasdr. CALL makine komutu
dallanmadan nce CALL komutundan sonraki komutun adresini kendi ierisinde otomatik
olarak stacke PUSH eder. Bylece dallanma ilemi yapldnda dn adresi stacktedir.
stediimiz zaman RET makine komutuyla o adresi stackten alarak geri dnebiliriz. Bu
durumda
CALL adr

edeerindeki bir komut


PUSH sonraki_adr
JMP adr

biiminde yaplr. CALL makine komutunun 4 biimi vardr:


1. Segment ii dorudan CALL(direct within segment CALL)
Bu makine komutunu E8 byteyla tehis edilir. Komutun kendisi 3 byte uzunluundadr.
2 bytelk bir yer deitirme miktar vardr. Yani segmentin her tarafna dallanlabilir.
Dallanmadan nce yalnzca IP register stacke PUSH edilir. rnein:
CALL
func

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

2. Segment ii dolayl CALL(indirect within segment CALL)


Burada komutun operand bellek ya da registerdr. Programn ak operand ile belirtilen
bellekteki adrese gider. Bu arma ileminin segmentler aras dolayl arma
ileminden ayrlmas iin CALL komutundan sonra near anahtar szcnn getirilmesi
gerekir. rnein:
CALL near [SI]
CALL near [BP 2]

Komutu anlatan byte FF biimindedir.


3. Segmentler aras dorudan CALL(direct intersegment CALL)
Segmentler aras CALL ileminden geri dnlebilmesi iin hem CS hem de IP
registerlarnn stacke atlmas gerekir. Komut nce PUSH CS, sonra PUSH IP
ilemleriyle sonraki komutun segment ve offset bilgilerini stacke atar ve operand
biiminde verilmi olan CS ve IP deerlerini ykleyerek dallanmay gerekletirir.

Komut 5 byte uzunluundadr. Sembolik makine dilinde CALL segment:offset biiminde


kullanlr. rnein:
CALL 1FC0:2C15
Segmentler aras CALL ileminden RETF makine komutuyla geri dnlr.
4. Segmentler aras dolayl CALL(indirect intersegment CALL)
Bu komutun operand bellek ya da registerdr. Belirtilen bellek blgesindeki dk
anlaml word IP registerna, yksek anlaml word CS registerna ekilerek dallanma
gerekletirir. Komutta far anahtar szc kullanlmaldr. rnein:
CALL far [SI]
CALL far [BP 2]

Alt Programdan Geriye Dn


RET makine komutu CALL komutuyla stacke atlm olan dn adresini geri
ykleyerek dn gerekletirir. RET komutlar segment iiyse RET ile segmentler aras ise
RETF ile ifade edilir. 4 eit RET komutu vardr:
1. Segment ii RET
Bir byte uzunluunda bir makine komutudur. Komutun ilem kodu C3tr. Komut POP IP
gibi bir ilemi gerekletirir.
2. Segment ii artrml RET

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:

Bu komut zellikle pascal arma biimini ve Windows programlamasnda __stdcall


arma biimini gerekletirmek amacyla kullanlmaktadr.
3. Segmentler aras RET
Sembolik makine dilinde RETF komutuyla belirtilir. Komut srasyla POP IP ve POP CS
ilemlerini yapar ve baka bir segmente geri dner. Komut CB deeriyle anlatlr. Komut
1 byte uzunluundadr.
4. Segmentler aras artrml RET
Komut 3 byte uzunluundadr ve RETF n biiminde gsterilir. Komut nce RETF ilemini
gerekletirir, daha sonra SP registern n kadar artrr. rnein:
RETF 4

gibi bir komut altrlrsa;

Bayraklar zerinde zel lem Yapan Komutlar


Normal olarak bayrak konumlarn deitirmek iin PUSHF ve POPF makine
komutlarndan faydalanlabilir. Ancak baz kritik bayraklar iin onlar set eden ve reset eden
zel makine komutlar vardr. Bu komutlar unlardr:
CLC
STC
CLI
STI
CLD

clear CF
set CF
clear IF
set IF
clear DF
44

STD
CMC

set DF
complement CF
Sembolik Makine Dili Nedir?

Debugger programlarnda komut o anda girilir ve altrlr. Girilen komut kmesinin


kaynak kod olarak bir dzyaz dosyas ierisinde saklanmas mmkn deildir. Sembolik
makine dili bir derleyiciye sahip olan, makine komutlarnda yazlm bir program exe hale
getirebilen bir alma biimini oluturur. Bylelikle istenilen deiiklikle kaynak kod
ierisinde yaplp saklanabilmektedir. Sembolik makine dosyalarnn uzants asm olarak
belirlenir. Asm program tpk C program gibi derlenip link ilemine sokulmak zorundadr.
Sembolik makine dili derleyicileri genellikle tek bir exe dosya biimindedir. Borlandn
TASM, Microsoftun MASM programlar kullanlan tipik derleyicilerdir. TASM programlar
Borland derleyici paketlerinin ierisinde zaten bulunmaktadr. Sembolik makine dili
derleyicileri geleneksel olarak bir editre sahip deildir. Programlar herhangi bir editrde
yazlp komut satrndan derlenir. Tipik bir programn derlenmesi ilemi:
TASM <dosya ismi>;
Obj modl tllink.exe ya da link.exe programlaryla komut satrndan link edilerek exe dosya
elde edilir. TLINK programnn tipik kullanm yledir:
TLINK <obj dosya ismi>;
Exe Dosyann Yaps ve Yklenmesi
Exe dosyalar ierisindeki bilginin organizasyonuna gre yle evrim geirmitir:
DOS
Win3.x
Win32

MZ format
NE format
PE format

Bir exe dosyann yaps tipik olarak yledir:

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.

Tipik Bir Sembolik Makine Dili Program


Sembolik makine dili programlar yalnlatrlm segment tanmlamalaryla ya da
ayrntl segment tanmlamalaryla yazlabilir. Genel yap DOS ve UNIX, Win32 programlar
arasnda kk farkllklar gstermektedir. Biz bu blmde tipik bir DOS programnn
organizasyonunu inceleyeceiz.
Sembolik makine dilinde byk-kk harf duyarll yoktur. Dilin karakter kmesi
Cden fazla olarak @ ve ? iaretlerini kapsayacak biimdedir. Tipik bir DOS program nce
bir bellek modelinin belirtilmesiyle balar. Toplam 6 bellek modeli vardr:
Tiny
Small
Medium
Compact
Large
Huge
Bellek modeli ileride ayrntlaryla ele alnacaktr. Yalnzca DOS iin geerli olan bir
kavramdr. Bellek modeli u belirlemeler konusunda etkili olur:
- Programn toplam kod data ve stack bykl
- Program yklendiinde segment register'larn birbirlerine gre olan durumu
- JMP ve CALL komutlarnn segment iinde kalp kalmayaca
Cde bellek ynetimi small modeldir. Small model programlarda code blm 64 Kb
geemez. CS register code blmnn bana ekilmitir. Bu nedenle JMP ve CALL
komutlar segment iinde kalmak zorundadr. Small modelde programn data ve stack toplam
da 64 Kb geemez. Small model programlarda sembolik makine dili derleyicisi DS ve SS

46

registerlarnn ayn deerde olduunu varsayarak kod retirler. Bu durumda tipik bir small
model program yklendiinde nemli registerlarn durumlar aadaki gibi olacaktr:

Program yklendiinde DS hari CS, SS ve SP registerlarnn deeri ykleyici tarafndan


verilir. Programn hemen banda DS registerna ekilde gsterilen deeri bizim vermemiz
gerekir. Bu deer aadaki gibi verilebilir:
MOV AX, @data
MOV DS, AX

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

gibi bir kod aslnda


MOV AX, [100]

anlamna gelir. Bir data sembol + operatryle birlikte kullanlabilir. rnein:


MOV AX, sample + 2

47

Bu durumda sembolik makine dili derleyicisi semboln belirttii offset ile ilgili bir toplama
yapldn dnr. Yukardaki kod
MOV AX, [102]

anlamna gelir. + operatryle [] tamamen ayn anlama gelir. rnein:


MOV AX, sample + SI
MOV AX, sample[SI]
MOV AX, sample + [SI][BX]

MOV AX, [SI + 100]


MOV AX, [SI + 100]
MOV AX, [SI + BX + 100]

zetle bir sembol aslnda [] ierisinde bir say anlamna gelir.


Data Sembollerinin Tanmlanmas
Bir programn statik mrl deikenleri data segment ierisinde yer alr. Bir data
sembol .DATA blmnde tanmlanmak zorunda deildir, ancak tipik olarak burada
tanmlanmaldr. Data sembol tanmlamann genel biimi yledir:
Sembol

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)

Dup ifadesinin genel biimi yledir:


n dup (val)

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

Burada X1 sembolnn offset deeri 0, X2 sembolnn offset deeri 4tr. rnein:


MOV AL, X1 + 2

komutu aslnda derleyici tarafndan aslnda


MOV AL, [0002]

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

lemlerini yapmamz gerekir.


Program Yklendiinde Registerlarn Durumlar
Bir exe program yklendiinde register durumlar yle olacaktr:
-

Ykleyici CS ve IP registerlarnn balang deerleri exe dosyann balk ksmndan


alarak kendisi ykler. Linker balk ksmna CS iin code blmnn balang segment
adresini yerletirmektedir. Bir sembolik makine dili program end komutuyla bitirilir. end
komutunun genel biimi yledir:
end [sembol]

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:
....
....

2. proc bildirimi biiminde


3. Segment bildirimi biiminde
proc Bildirimi
Genel biimi:
sembol proc [near/far]
.....
sembol endp

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

Gerek ve Sahte Kodlar(real/pseudo)


Sembolik makine dilinde makine komutlar dorudan makine kodu olarak exe dosyaya
yansr. Ancak yalnzca derleyicinin bilgi edindii, program derlenip link edildikten sonra exe
kodu ierisinde yer almayan, program yazarken kullandmz eitli yardmc ifadeler de
vardr. Makine koduna yansyan ifadelere gerek kod, yansmayan ifadelere sahte kod denir.
rnein proc bildirimi bir sahte koddur.
/*----------ilkprog.asm----------*/
.model small
.CODE
main proc near
MOV AX, @data
MOV DS, AX
MOV AL, X1
MOV X2, AL
MOV AX, 4c00h
INT 21h
main endp
.DATA
X1 db 10
X2 db 20
.STACK 100h
END main

/*----------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

Saynn sonuna b getirerek sabit ikilik sistemde yazlabilir. rnein:


name db 10101101b

Sekizlik sistemde yazlm sabitler saynn sonuna o ya da q getirilerek belirtilir. rnein:


name db 135q

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

yerine name[2], name + SI yerine name[SI] kullanlabilir.


Gerek Say Sabitleri

dd, dq ya da dt uzunluklu data sembollerine noktal saylarla ilk deer verebiliriz.


rnein:
n dd 3.4
n dq 3.4
n dt 3.4

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

Yer Sayac(location counter)


Sembolik makine dili derleyicisi kod zerindeki her satra ismine yer sayac denilen
bir offset numaras karlk getirir. Yer sayac bir satrdaki bilginin exe dosya ierisindeki
kendi segmentine gre offsetini belirtmektedir. Derleyici makine komutlarnn uzunluklarn
bildiine gre kod blgesindeki tm satrlarn yer sayalarn hesaplayabilir. Sembolik makine
dilinde her komut bir satra yazlmak zorundadr. Yani ifadeleri birbirinden ayrmak iin ;
deil CR/LF kullanlmaktadr. Ancak sarlar tmden bo braklabilirler. rnein aadaki
program parasnda grnen 4 satrn da yer sayac da ayndr:

52

EXIT:

MOV AX, BX

Yani komutun yle yazlmas ayn anlama gelir:


EXIT: MOV AX, BX

ASM Listing Dosyas


Sembolik makine dili derleyicileri derleme ilemi ister baarl, ister baarsz olsun
istee bal olarak bir listing dosyas verebilmektedir. Listing dosyas programcnn analiz
yapmas iin retilmektedir. Listing dosyasnn ierisinde unlar bulunur:
1. Komutlarn ilem kodlar,
2. Her satrn yer saya deeri,
3. Programa ilikin dier teknik bilgiler.
Listing dosyasn oluturabilmek iin derleme ilemi TASM ile yaplrken komut satr ; ile
kapatlmaz, /L argman verilir. Listing dosyasnn ismi program ismiyle ayn, uzants lstdir.
Diziler zerinde lemler
Bellekte ardk bir yap ierisinde bir dng ierisinde dolaabilmek iin indexleme
ilemi yapmak zorundayz. Bu durumda [] ierisinde SI, DI ya da BX gibi bir index register
olmal. Bu index register dngye girmeden nce dizinin balang adresiyle ykl olmaldr.
Ya da dizi elemanlarna erimek iin [sabit + index_reg] yaps kullanlabilir. te bu biimde
dngde her yinelenme ile index registern deeri gerektii kadar arttrlr ve dizi
elemanlarna eriilir. Bu blmde eitli dnglerin oluturulmas, dizilerin taranmas gibi
temel ilemler zerinde durulacaktr.
LEA(load effective address) Komutu
En ok kullanlan makine komutlarndan birisidir. Komutun biimi:
LEA reg mem
Komutun sol tarafndaki operand bir register sa tarafndaki bir operand bir bellek olmak
zorundadr. rnein:
LEA AX, [BX 4]
LEA BX, [SI + BX 10]

Bu makine komutu [] ierisindeki offset deerinin registera yklenmesini salar. rnein:


LEA SI, [BX + 4]
Burada BX registernn ierisinde 1000h deeri olsun. Komut bir MOV komutu olsayd
1004h adresinden balayan 2 bytelk veri SI registerna atanrd. Bu komut 1004 deerinin

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

0dan ne kadar alacak bir dng

Kalp:
MOV CX, 0
@2:
CMP CX, n
JAE @1
....
...
....
INC CX
JMP @2
@1:

0dan ne kadar alacak baka bir dng

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

Bir dizinin en byk elemann bulan sembolik makine dili program:


/**********dongu.asm**********/
.model small
.DATA
ARRAY DB 1,2,3,4,5,6,7,8,9,0
MAX DB ?
.CODE
MAIN:
MOV AX, @DATA
MOV DS, AX
MOV SI, 1
MOV DL, ARRAY
JMP @1
@2:
CMP DL, ARRAY + SI
JGE @3
MOV DL, ARRAY + SI
@3:
INC SI
@1:
CMP SI, 10
JB @2
MOV MAX, DL
MOV AX, 4C00H
INT 21H
.STACK 100H
END MAIN

/**********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

Alt Programlara Parametre Geirilmesi ve Alt Programlarn Geri Dn Deerlerini


Almak
Bir alt programa parametre aktarmnn uygulamada kullanlan 3 yntemi vardr:
1. Registerlar kullanlarak parametre aktarm:
Bu yntemde alt program arlmadan nce parametreler, nceden belirlenmi
registerlara yazlrlar. rnein: 3 parametreli bir alt program sz konusu olsun; alt
program birinci parametreyi AX, ikinci parametreyi BX ve nc parametreyi CX
registerndan alacak biimde yazlabilir. aracak kii de armadan nce bu
parametreleri bu registerlara yazmak zorundadr. Bu tr parametre aktarm biimine
fastcall denilmektedir. C derleyicilerinde fonksiyonun geri dn deerinin sana fastcall,
_fastcall ya da __fastcall yazlarak belirtilir. Byle parametre aktarm olabilecek en hzl
yntemdir. Bu nedenle sembolik makine dili programclar arasnda yaygn olarak
kullanlr. Bu biimdeki parametre aktarmnn standart bir dokmantasyonu yoktur.
Programclar aktarm farkl registerlarla yapabilirler. Derleyicilerin fastcall arma
biimiyle kullandklar registerlar da dokmante edilmemitir. Ancak denemelerle
bulunabilir. Yntemin en kt taraf register yetersizliinden dolay az sayda parametreye
sahip olan fonksiyonlarda uygulanabilmesidir.
2. Data segment kullanlarak parametre aktarm:
Bu yntemde alt program arlmadan nce parametreler .data blm ierisindeki eitli
alanlara yazlr. Alt programlar da bu alanlardan parametreleri alacak biimde tasarlanr.
Bu yntem C derleyicileri tarafndan pek tercih edilmemektedir.
3. Stack kullanlarak parametre aktarm:
Bu yntem C derleyicileri tarafndan en sk kullanlan yntemdir. pascal, cdecl, stdcall
arma biimleri bu yntemi kullanmaktadr. Bu yntemin birka biimi vardr. Biz bu
biimleri Cdeki karlklarna gre inceleyeceiz.
1. cdecl Yntemi
Bu durum DOS, Windows ve UNIX sistemlerinde derleyicilerin uygulad default
yntemdir. Cde fonksiyonun geri dn deerinin sana cdecl, _cdecl ya da __cdecl

56

yazlarak belirtilir. C tarz fonksiyon armada parametreler sadan sola fonksiyonu


aran tarafndan stacke PUSH edilir. Sonra fonksiyon CALL edilir. rnein:
void func(int a, int b);

fonksiyonu yle arlmaldr:


PUSH b
PUSH a
CALL func

Akn fonksiyona geldii noktadaki stack durumu yle olacaktr:

Btn fonksiyon arma biimlerinde yalnzca AX, BX, CX, DX registerlar


fonksiyonu tasarlayan tarafndan bozulabilir. Ancak bunun dndaki btn registerlar
fonksiyon ierisinde bozulsa bile fonksiyondan klmadan nce orijinal deerleriyle
yeniden yklenmelidir. nk C derleyicileri fonksiyonu armadan nce dier
registerlara belirli bilgileri yazm olabilir ve fonksiyonu ardktan sonra o bilgileri
kullanacak olabilir.
imdi ak arlan fonksiyondadr ve arlan fonksiyon stackten parametreleri
ekmek durumundadr. Stack blgesini indexlemek iin BP register kullanlmak
zorundadr. Bunun iin BP registernn da ayrca saklanmas gerekir. te
fonksiyondaki ilk iki makine komutu DOS sisteminde
PUSH BP
MOV BP, SP

Win32 ve UNIX sistemlerindeyse


PUSH EBP
MOV EBP, ESP

biiminde olmaldr. Bu iki makine komutundan sonraki stack durumu aadaki gibi
olacaktr:

57

Bu durumda bu iki makine komutundan sonra artk BP register ivilenmi olur.


Fonksiyonun ierisinde artk PUSH komutlarn kullanabiliriz. SP yukar doru
hareketine devam eder. Ancak BP ivilenmitir. lk parametrenin yeri yledir:
DOS yakn modeller iin
DOS uzak modeller iin
UNIX ve Win32 sistemleri iin

[BP + 4]
[BP + 6]
[BP + 8]

Fonksiyondan karken BP registern geri alarak kmalyz. Bunun iin DOSta


POP BP
RET/RETF

komutlar, Win32 ve UNIX sistemlerinde


POP EBP
RET

komutlar kullanlr. Fonksiyondan kldktan sonra stackin durumu aadaki gibi


olacaktr:

Grld gibi henz stack eski haline gelmemitir. Fonksiyonu arann SP


registern toplam parametre miktar kadar artrarak stacki dengelemesi gerekir.
Stackin dengelenmesi iin DOSta:
ADD SP, n

UNIX ve Win32 sistemlerinde:


ADD ESP, n

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, UNIX ve Win32 sistemlerinde


PUSH b
PSUH a
CALL func
ADD ESP, 8

aracaktr. Bylece bu biimdeki parametre aktarmna uygun parametre iskeletleri


de DOS iin:
func proc near
PUSH BP
MOV BP, SP
....
....
POP BP
RET
func endp

UNIX ve Win32 sistemleri iin:


func proc near
PUSH EBP
MOV EBP, ESP
....
....
POP EBP
RET
func endp

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);

fonksiyonunun arlmasnda yalnzca u ilemler yaplr:


PUSH a
PUSH b
CALL func

Fonksiyonun parametreleri kullanma biimi yine ayndr. Stack framein dzenlenmesi


iin
PUSH BP
MOV BP, SP

komutlar gerekebilir. Ancak [BP + 4]te ilk parametre deil, son parametre
bulunacaktr. Fonksiyondan k
POP BP
RET n

makine komutlaryla yaplr. Grld gibi stackin dengelenmesi arlan


fonksiyon tarafndan yaplmaktadr. Bu durumda
void pascal func(int a, int b);
gibi bir fonksiyonun iskelet kodu
func proc near
PUSH BP
MOV BP, SP
...
...
POP BP
RET 4
func endp

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);

DOS yakn modeller iin


_add proc near
PUSH BP
MOV BP, SP
MOV AX, [BP + 4]
ADD AX, [BP + 6]
POP BP
RET
_add endp

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

2. Gsterici parametresi alan fonksiyonlar iin aadaki rnek verilebilir.


int total(int *pArray, int nSize);

DOS yakn modeller iin


total proc near
PUSH BP
MOV BP, SP
MOV BX, [BP + 4]
XOR AX, AX
XOR CX, CX
JMP @1
@2:
ADD AX, [BX]
ADD BX, 2
INC CX
@1:
CMP CX, [BP + 6]
JL @2
POP BP
RET
total endp

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

Sembolik Makine Dilinde Yazlan Fonksiyonlar Cden arlmas


Linker program birden fazla obj modl bir exe halinde birletirecek biimde
yazlmtr. Bu yzden C ve ASM dosyalar ayr ayr derlenir, her ikisi birden standart C
ktphaneleri kullanlarak link edilir. Modller halinde alma daha sonra ileride ele
alnacaktr. Birden fazla modlle link ilemi iin bilindii gibi make ya da proje dosyas
oluturulur. Proje dosyas ierisinde C dosyas ile sembolik makine dilinde derlediimiz obj
dosyas bulunmaldr. rnein util.asm dosyas ierisinde fonksiyonlarmz olsun; biz bu
fonksiyonlar den.c ierisinden aracak olalm. Util.asm derlenmeli ve proje dosyas
ierisinde den.c ile util.obj olmaldr. Program exeye dntrldnde Cde
yazdklarmzla sembolik makine dilinde yazdklarmz ayn exe dosya ierisinde birletirilmi
olur.

62

Birletirme srasnda kacak problemler


1. Derleme ileminde byk/kk harf duyarlln salamak iin /mx seenei
kullanlmaldr. rnein:
TASM /mx util.asm;
2. Bir fonksiyonun dier modllerden arlabilmesi iin public bildiriminin yaplmas
gerekir. Public bildirimi herhangi bir yerde yaplabilir ancak en iyi yer programn sonunda
yaplmasdr. Public bildirimi yle yaplr:
public <fonksiyon ismi>

3. Programn stack tanmlamas C derleyicisi tarafndan C modlnde zaten yaplmtr. Bu


yzden ASM modlnde stack tanmlamasna gerek yoktur. ASM modl statik data
kullanmayacaksa data modlne de gerek yoktur.
4. C derleyicileri Cde yazldnn anlalmas iin fonksiyon isimlerinin bana _
getirerek obj modlne yazmaktadr. Yani rnein biz Cde printf fonksiyonunu
ardmzda derleyici fonksiyonu _printf ismiyle obj modlne yazar. Biz de sembolik
makine dilinde yazacamz fonksiyonlar Cden arabilmek iin onlarn bana _
getirmeliyiz.
5. Fonksiyonlar Cden arlrken prototip bildiriminin bulundurulmas gerekir. C
derleyicisi arlan fonksiyonun hangi registerdan alnacan fonksiyon prototipine
bakarak anlamaktadr. Fonksiyon prototipi yazlmazsa geri dn deerinin int olduu
varsaylr ve geri dn deeri AX registerndan alnacak biimde kod retilir.
Snf almas:
/*****dosutil.asm*****/
.MODEL small
.CODE
_add proc near
push bp
mov bp, sp
mov
add

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

for (i = 0; i < 10; ++i)


for (j = 0; j < 10 ; ++j) {
}

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);

prototipine uygun assembler kodu Win32 iin

/*****sum.asm*****/
.386
.model flat
.code

65

_sum proc near


push ebp
mov ebp, esp
xor eax, eax
xor ecx, ecx
mov ebx, [ebp + 8]
jmp @1
@2:
add eax, [ebx + ecx * 4]
inc ecx
@1:
cmp ecx, [ebp + 12]
jl
@2
pop ebp
ret
_sum endp
public _sum
end

/*****sum.asm*****/
olabilir.
void square(int x, int *pResult);

fonksiyonu Win32 iin


_square proc near
push ebp
mov ebp, esp
mov eax, [ebp + 8]
imul eax, [ebp + 8]
mov ebx, [ebp +12]
mov [ebx], eax
pop ebp
ret
_square end

eklinde yazlabilir.

66

Sembolik Makine Dilinde cdecl armna Uygun Fonksiyon Yazmna rnekler


1. size_t asm_strlen(const char *str); fonksiyonunun yazm.
/*****util16.asm*****/
.model small
.code
_asm_strlen proc near
push
bp
move
bp, sp
xor
ax, ax
mov
bx, [bp + 4]
jmp
@1
@2:
inc
ax
inc
bx
@1:
mov
dl, [bx]
and
dl, dl
jnz
@2:
pop
bp
ret
_asm_strlen endp
public _asm_strlen
end

/*****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*****/

Bilindii gibi AX, BX, CX, DX registerlarnn dndaki registerlar kullanlmak


istendiinde fonksiyon knda orijinal deerleriyle yklenmelidir. Saklanacak
registerlar stack frame dzenlendikten sonra, yani
PUSH BP
MOV BP, SP

komutlarndan sonra stacke PUSH edilebilir. Stack framein dzenlenmesinden sonra


PUSH ilemi parametreleri ekme konusunda bir deiiklie yol amaz. rnein SI
registern kullanacak olalm. Tipik bir fonksiyonun giri kodu
PUSH BP

68

MOV BP, SP
PUSH SI

eklinde olmaldr ve k kodu da


POP SI
POP BP
RET

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

4. Aadaki C kodunun sembolik makine dili karln yaznz.


void disp(void);
int add(int a, int b);
int x, y;
void main(void)
{
printf("%d\n", add(10, 20));
x = 50;
y = 100;
disp();
}
void disp(void)
{
printf("%d %d\n", x, y);
}
int add(int a, int b)
{
return a + b;
}

.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

C Derleyicilerin Sembolik Makine Dili ktlar


Neredeyse tm C derleyicileri istendiinde sembolik makine dilinde kt verebilir.
Borland C++ 3.1de Options\Compiler\Code Generation mns altnda Generate
Assembler Source seenei ile derleyici sembolik makine dili kts retebilir. Derleyici obj
yerine asm dosyas retecektir. TC 2de sembolik makine dili kts iin komut satr

70

versiyonu kullanlr. bunun iin s seenei kullanlmaldr(tcc S dosya.asm). ayn ilem


Borland C++ 3.1 ile komut satrnda da yaplabilir(bcc S dosya.asm). Borland C++ 4.0dan
sonra 32 bit sembolik makine dili kts elde etmek iin bcc32.exe program kullanlr. Visual
C++ derleyici ortamnda sembolik makine dili kts elde etmek iin
Project\Settings\C/C++\Listing Files\Listing File Type seilebilir. Visual C++ derleyici
ortam 2.0 srmnden itibaren 16 bit kod retmemektedir.
OFFSET ve SEG Operatrleri
Bu iki operatr operand olarak bir sembol ismi alr. Bir semboln offset bilgisini
programn alma zaman srasnda LEA komutu ile ekebiliriz. rnein:
LEA AX, name
Ancak bir semboln offset adresini daha derleme aamasnda derleyiciden renebiliriz.
nk btn sembollerin offset adresleri derleme srasnda hesaplanabilir. Offset operatr
yle kullanlr:
OFFSET sembol
Bu operatr ilgili semboln offset adresinin elde edilmesi iin kullanlr. Bu operatrn
rettii deer sabit bir saydr. Bu durumda aadaki iki komut tamamen edeer ilevlere
sahiptirler:
LEA AX, name

MOV AX, OFFSET name

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

Exe Dosyas Balk Ksm


Balk blm linker tarafndan obj modllerden elde edilen bilgilerden
oluturulmaktadr. DOS exe balk ksmnda programn yklenmesine ilikin eitli bilgiler
vardr. Ykleyici ancak bu bilgilerden faydalanarak program ykleyebilir. DOS exe balk
format aadaki gibidir.
Offset
0(0)
2(2)
4(4)
6(6)
8(8)
A(10)
C(12)
E(14)
10(16)
12(18)
14(20)
16(22)
18(24)
1A(26)
1C(28)
varies
varies
varies
varies

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

Burada MZ karakterlerinin ASCII numaralar olan 4D5A


bulunmaldr. DOS iletim sistemi program yklerken bu deeri
kontrol etmez ama baka ilemlerde etmektedir.

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

Ykleme iin gereken


minimum ve maksimum
paragraf saylar

SS deeri

SP deeri

Checksum

CS ve IP deerleri

Relocation
tablosunun
yeri
Overlay says

Bu konu ileride ele alnacaktr.


Bir paragraf 16 bytetr. Burada balk ksmnn uzunluu
verilmektedir. Balk ksmnn uzunluu burada verilen saynn
16 ile arpmdr. Artk ykleyici balk uzunluunu da bildiine
gre balk ksmn atarak program ykleyebilir hale gelmitir.
Buradaki bilgiler gerekte fazlaca kullanlmamaktadr. Genellikle
minimum 0 ve maksimum 0xFFFF biimindedir. Yklemek iin
gereken minimum bellek dosyann yklenmesinden sonra
kesinlikle tahsis edilmesi gereken ekstra bellek miktarn belirtir.
rnein burada 100 says yazyor olsun. Program bellee
yklendikten sonra sanki programn alanym gibi 1600 byte
daha bellekten tahsis edileceini belirtir. Buradaki istek
karlanmazsa ykleyici baarsz olur, mesaj vererek program
sonlandrr. Ykleme iin gerekli maksimum paragraf says
ykleyicinin ne kadar mmknse o kadarn karlamas gerektii
deerdir. Burada genellikle 0xFFFF deeri bulunur. Bu deer 16
ile arplrsa 1 MB eder. Durumdan kan sonu: minimum 0 ve
maksimum 0xFFFF ise(hemen her zaman byledir) ykleyici
program bellee ykledikten sonra geri kalan btn alan tahsis
etmektedir.
Burada program yklendiinde SS segment registernn alaca
deer yazmaktadr. Aslnda burada yazlan deer gerek segment
deeri deildir. erik ksmn 0 olmak zere greli bir deerdir.
Linker obj modlden .CODE ve .DATA blmlerinin
uzunluklarn elde eder. SS registernn greli deerini balk
ksmna yazar. Ykleyici de program nereye yklediyse o deeri
balkta belirtilen SS deeriyle toplar ve SS registerna atar.
Burada program yklendikten sonra ykleyici tarafndan SP
registerna atanacak deer bulunmaktadr. Bu bilginin yazlmas
yle olmaktadr: Sembolik makine dili programcs .STACK
bildirimiyle stackin uzunluunu verir. Bu uzunluk obj modle
yazlr. Linker bu bilgiyi alarak exe dosyann balk ksmna
yazar.
Exe dosyann bozulmu olup olmadn tespit etmek amacyla
linker bu blgeye bir checksum deeri yazar. Ancak ykleyici
yklerken bu checksum deerini kontrol etmemektedir.
Burada programn balang CS ve IP deerleri bulunmaktadr.
Tabii CS deeri exe dosyann ierik ksmna gre greli bir
deerdir. DOS altnda alan pek ok virs kodu burada
belirtilen CS:IP deerleriyle ilgilenir.
Burada balk ksmnda bulunan relocation tablosunun yeri
belirtilmektedir. Relocation kavram ileride ele alnacaktr.
Overlay alma ile ilgilidir. Burada genellikle 0 says bulunur.
PS P(Program Segment prefix)

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
-

CS, IP, SS ve SP deerleri exe balk ksmndan alnarak yklenir.


DS ve ES PSPnin segment adresiyle yklenir.
AX, BX, DX, SI, DI ve BP 0 olarak yklenir.
CX registernn ierisindeki bilgi herhangi bir biimde olabilir. Undocumented bir
bilgidir.
Derleyicilerin Balang Kodlar(Startup Module)

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

Benzer biimde main fonksiyonu ierisinde return anahtar szc kullanldnda


aslnda main fonksiyonunun geri dn deeri programn exit codeu olmaktadr. Bu durum
sembolik makine dilinde yle aklanabilir: main de sradan bir fonksiyon olduuna gre geri
dn deeri AX registernda braklacaktr. Dorudan AL ierisindeki deer exit codeu
olarak 21h kesmesi iinde kullanlabilir.
CALL _main
MOV AH, 4Ch
INT 21h

Grld gibi Cnin standardizasyonunda main fonksiyonunun geri dn deeri ya void


olur ya int olur ama DOSta biz int desek bile processin exit kodu 1 byte geemeyecei iin
yksek anlaml byten bir nemi kalmamaktadr. main fonksiyonunda return kullanmakla exit
fonksiyonunu armak arasnda ilevsel bir farkllk yoktur.
Bir C kodu ierisinde
exit(n);

biiminde exit fonksiyonunun arlmas srasnda derleyici u kodu retir:


MOV AX, n
PUSH AX
CALL _exit
ADD SP, 2

Bu durumda exit fonksiyonu da yle yazlm olmaldr:


_exit proc near
PUSH BP
MOV BP, SP
MOV AL, [BP + 4]
MOV AH, 4Ch
INT 21h
POP BP
RET
_exit endp

75

Derleyicilerin balang kodlar iletim sistemine zg iler yapmaktadr. Bu yzden


gerektiinde devre d braklabilir. Bu yzden derleyici firmalar balang kodlarn
sembolik makine dilinde kaynak kod olarak vermektedir. Geleneksel olarak balang
kodlarnn isimleri C0.ASM biimindedir. Bunun derlenmi hali ise C0.OBJ biimindedir.
DOSta balang kodlar bellek modeline gre deiiklik gstereceinden C0.ASM
dosyasnn eitli bellek modelleri iin yeniden derlenmesi gerekir. rnein C0.ASMnin
small model iin derlenmi halinin ismi C0S.ASMdir. Large model iin C0L.OBJ
biimindedir. Aslnda biz C2de tek bir modlle alsak bile linker otomatik olarak balang
kodunun bulunduu modl link ilemine sokmaktadr. rnein den.c isimli dosyann
altrlmas yle gerekletirilir:
1. Den.c derlenir, den.obj oluturulur.
2. C0X.OBJ ile den.obj birlikte link edilerek den.exe yaplr.
Modllerle alma ileride ele alnacaktr.
Bir C program ierisinde main fonksiyonunu tanmlamadan program derleyebiliriz.
Ancak link ilemini yapamayz. Bu durumda hata link aamasnda linkern balang
kodundan belirtilmi olan main isimli fonksiyonu hibir modlde bulamamas biiminde
ortaya kacaktr.
Cde char Parametrelerin ve Geri Dn Deerlerinin Seyrek Kullanlmas
Cde char trne ilikin parametreler ve geri dn deerleri char yerine genellikle int
trden verilirler. Cde char parametresine sahip parametre deikenleri PUSH makine
komutuyla stack yoluyla fonksiyona aktarld iin aslnda derleyici tarafndan sanki int
trndenmi gibi ilem grmektedir. Cde int tr tipik olarak allan ilemcide bir register
uzunluu kadar alnmaktadr. Genellikle bir register uzunluundaki bilgiler stacke atlr.
zetle parametre char trnden olsa bile aslnda pek ok sistemde sanki int trdenmi gibi
aktarlmaktadr. Bu yzden programclarn bir blm char trden parametre kullanmak
yerine bu doall vurgulamak amacyla int trden parametre kullanmaktadr. Ayn durum
geri dn tr iin de kullanlr.
KESMELER(interrupts)
Kesme mikroilemcinin o anda altrd koda ara verip, baka bir kodu altrmas
ilemidir. Kesme olutuunda mikroilemcinin altrd koda kesme kodu(interrupt
handler) denilmektedir. Kesmeler arlma biimlerine gre 3e ayrlr:
1. Yazlm kesmeleri(software interrupts)
2. Donanm kesmeleri(hardware interrupts)
3. sel kesmeler(internal interrupts)
Yazlm kesmeleri INT makine komutuyla oluturulan kesmelerdir. Programc kesme
oluturmak istedii zaman INT makine komutunu kullanabilir. INT makine komutu tpk
CALL makine komutu gibi program akn kesme koduna geirmektedir. INT makine
komutuyla oluturulan kesmeden IRET makine komutuyla geri dnlr.

76

Donanm kesmeleri mikroilemcinin dndaki bir birim tarafndan mikroilemcinin


INT ucunun aktive edilmesiyle oluturulur. Kesme denilince ilk akla gelen donanm
kesmeleridir. Mikroilemci bir makine komutunu altrdktan sonra, bir sonraki makine

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

komutlarna(mantksal olarak) edeerdir.


Kesmenin Hook Edilmesi
Bir keme olutuunda dallanlacak adres bellein tepesindeki kesme vektrnde
yazmaktadr. Kesme vektrnde n numaral kesmenin CS ve IP deerleri yerine kendi koduna
ilikin CS ve IP deerlerini yerletirirsek kesme olutuunda bizim belirlediimiz kod
altrlr. Bizim bu kodu IRET makine komutuyla sonlandrmamz gerekir. Eer biz bu kod
ierisinde orijinal kesme kodunu aracaksak tpk INT makine komutu uygulanm gibi
armalyz. Bu ilem

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 Kodunun Yazlmas


ster yazlm kesmesi iin kesme kodu yazacak olalm, isterse donanm kesmesi iin
kesme kodu yazacak olalm, kesme kodundan IRET komutuyla kmadan nce bozduumuz
btn registerlar eski durumuyla geri yklememiz gerekir. Yani kesmenin arlmasyla
herhangi bir durum deiiklii olumamaldr. Registerlarn saklanmasnda stack blgesi
kullanlabilir. Bu durumda kesme kodunun banda kullanlacak registerlar stacke PUSH
edilir. Kesme kodunun sonunda bu registerlar POP edilerek IRET uygulanr. rnein
yazacamz kesme kodu ierisinde AX, BX, CX, DX registerlarn bozacak olalm, kod
aadaki gibi organize edilmelidir:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
....
....
....
....
POP DX
POP CX
POP BX
POP AX

Kesme
kodu

79

Sembolik Makine Dilinde Dolayl JMP ve CALL lemleri


Sembolik makine dilinde dolayl JMP ve CALL ilemleri iin nce bir data sembol
oluturulur, sonra JMP ya da CALL komutlar word ptr ya da dword ptr operatrleriyle data
sembol belirtilerek kullanlr. rnein:
.data
adr1
adr2

dw
dd

.code
JMP
CALL

word ptr
dword ptr

1234h
12345678h

adr1
adr2

Burada adr1 ve adr2 sembolleri srasyla dallanlacak segment ii ve segmentler aras


adresleri tutmaktadr.
Bellek Eriimlerinde Segment Ykleme Durumlar
Normal olarak bellek operandnn default bir segment register vardr. Ancak bu
default durumu segment yklemesi ile deitirebiliriz. rnein:
MOV AX, [SI]

burada bellek operandnn default segment register DSdir. Ancak biz


MOV AX, ES:[SI]

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

Cde uzak gstericileri kullanarak bu ilemi yapmak ok kolaydr:


WORD far *pIntr = (WORD far *) (intrno * 4);
*pIntr++ = 0x5678;
*pIntr = 0x1234;

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

Aa seviye disk ilemleri


Video ilemleri
Klavye ilemleri
Seri port ilemleri

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

Geri dn deeri yoktur.


rnek:
/*****10hf0ah.asm*****/
.MODEL SMALL
.DATA
mname db 'a'
.CODE
main proc near
mov ax, @data
mov ds, ax
mov ah, 0ah
mov al, mname
mov bl, 0
mov cx, 10
int 10h
mov

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)

Geri dn deeri yoktur. Bu fonksiyon ekrana karakter yazdrmakta kullanlan en genel


fonksiyondur. Ekrana her eit yaz yazlmak istendiinde en aa seviyeli fonksiyon olarak
tercih edilmelidir. Fonksiyon her zaman renk bilgisini ihmal ederek karakter basar ve cursor
ilerletir.
Snf almas: Data blmnde xname isimli bir sembol alarak sonu NULL karakterle biten
bir string giriniz. Ekrana INT 10h F:0Eh kesmesini kullanarak karakter yazan putchar isimli
alt program yaznz(yazdrlacak karakter stack yntemiyle fonksiyona aktarlacaktr). Bu alt
program kullanarak xname isimli sembol NULL karakter grene kadar ekrana yazdrnz.
/*****10hf0eh.asm*****/
.model small
.data
xname db "eren, mehmet", 0
.code
putchar proc near
push
bp
mov
bp, sp
mov
al, [bp + 4]
mov
ah, 0Eh
mov
bh, 0
mov
bl, 7
int
10h
pop
bp
ret
putchar endp
main proc near
mov
ax, @data
mov
ds, ax
xor
si, si
jmp
@2
@1:
mov
al,xname + si
xor
ah, ah

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.

MOV SI, offset xname

Artk [SI] ifadeleriyle sembol indexlenir.


2. LEA SI, xname
Burada da [SI] ile indexleme yaplabilir.
3. xname+ SI ya da xname[SI]
Burada nce SI 0lanmal, daha sonra ifadeyle indexleme yaplmal.
Snf almas: xname isimli bir data semboln, sonu NULL karakterle biten ilk deer
vererek tanmlaynz. Bu semboldeki btn kk harfleri byk harfe dntrnz.
Not: Byk-kk harf dntrmesini sembolik makine dilinde etkin olarak yapmak iin
karakterin ASCII koduna 32 eklemek ya da kartmak yeterlidir. Bunun iin saynn 5
numaral biti ile ilem yaplabilir.
/*****upper.asm*****/
.model small
.data
xname db "eren, mehmet", 0
.code
main proc near
mov ax, @data
mov ds, ax
mov si, offset xname
jmp @1
@2:
mov al, [si]
cmp al, 97
jb
@3
cmp al, 122
ja
@3
and al, 11011111b

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

Bu fonksiyon Cde kullandmz getche fonksiyonunun ta kendisidir. Klavyeden bir tua


baslana kadar bekler. Bu fonksiyon kendi ierisinde 16h BIOS kesmesiyle karakteri okur,
10h BIOS kesmesinin 0Eh fonksiyonuyla ekrana yazar.
/*****getchee.asm*****/
.model small
.code
main proc near
mov ah, 1
int 21h
mov ah, 0Eh
mov bh, 0
int 10h
mov ax, 4c00h
int 21h
main endp
.stack 100h
end main

/*****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*/
}

INT 21h F:2


Bu fonksiyon bir karakteri display etmek amacyla kullanlr. Parametreler:
AH
DL

2
Grntlenecek karakter

Bu fonksiyon da dorudan ekrana karakter yazmakta kullanlan BIOS kesmesini arr,


ancak Ctrl-C ilemine duyarldr. Ctrl-Cye baslrsa control break handler olarak INT 23h
kesmesi arlr.
INT 21h F:7 ve F:8
7 numaral fonksiyon Cde kullandmz getch fonksiyonuna karlk gelir. Ancak
Ctrl-C ilemini dikkate almaz. 8 numaral fonksiyonun 7 numaral fonksiyondan fark Ctrl-C
ilemini dikkate almasndadr. Her iki fonksiyonda da kesme sonlandnda okunan karakter
AL registernn ierisine yerletirilir. Eer AL 0 ise okunan zel bir tutur. Bu
fonksiyonlardan biri yeniden arlrsa extended scan code alnabilir.
INT 21h F:0Ah (buffered keyboard input)
Bu fonksiyon Cde kullandmz gets fonksiyonuna benzer. DOS kendi promptunda
bu kesmeyi ararak yaz bekler. Benzer biimde programlama dillerindeki eitli
fonksiyonlar bu kesmeyi arabilmektedir. Parametreler:
AH
DS:DX

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*****/

INT 21h F:25h(set interrupt vector)


Bu fonksiyon kesme vektrne belirli bir kesme iin segment:offset adresi yerletirir.
Geri bu ilem manuel olarak kk bir kodla gerekletirilebilir. Ancak bu kesme pratik bir
zmdr. Parametreler:
AH
AL
DS:DX

25h
Kesme numaras
Yerletirilecek vektr adresi

INT 21h F:35h(get interrupt vector)


Bu fonksiyon kesme vektrnden istenen bir kesmenin segment ve offset adreslerinin
elde edilmesinde kullanlr. Parametreler:
AH
AL

35h
Kesme numaras

Geri dn deeri:
ES
BX

Segment adresi
Offset adresi

INT 21h F:39h(create sub directory)


Bu kesme bir alt dizin yaratmak iin kullanlr. Parametreler:
AH
DS:DX

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

INCLUDE <dosya ad>


Genellikle include dosyalarnn ierisine makrolar yazlr. Dosya da asl kaynak kod
ierisinden include edilir.
/*****util.inc*****/
;util.inc
getche macro
mov ah, 1
int 21h
endm
putch macro chr
mov ah, 2
mov dl, chr
int 21h
endm
getch macro
mov ah, 8
int 21h
endm
putstr macro str
mov ah, 9
mov dx, offset str
int 21h
endm
pos macro row, col
mov ah, 2
mov bh, 0
mov dh, row
mov dl, col
int 10h
endm
writec macro chr
mov ah, 0eh
mov bh, 0
mov al, chr
int 10h
endm
initprg macro
mov ax, @data
mov ds, ax
endm
exitprg macro ecode
mov ah, 4ch
mov al, ecode
int 21h
endm

/*****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

byte ptr [BX] 0


@2

@1:

endm

makrosu
.DATA
xname
yname

db
db

ali sere, 0
necati, 0

.CODE
....
....
putstr
putstr
....

xname
yname

kodunda iki defa kullanld iin derleyici hata verir.


LOCAL komutu kod sembolleri iin kullanlr. Kullanm biimi:
92

LOCAL sembol1, sembol2, sembol3, ...

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

byte ptr [BX] 0


@2

@1:

endm

eklinde deitirilirse problem ortadan kalkar.


Matematik lemcinin Kullanlmas
Matematik lemci Nedir?
Mikroilemciler klasik olarak yalnzca tam sayl ilemleri yapacak biimde
tasarlanmtr. Entegre devre teknolojisinin geri olduu dnemlerde noktal saylar zerinde
de ilem yapabilecek byk bir ilemci tasarlamak mmkn deildi. Buna ramen noktal say
ilemleri yava olmasna karn tam sayl ilemlerle gerekletirilebilmitir. Intelin 8086,
8088, 80286, 80386 SX ve DX, 80486 SX modelleri yalnzca tam sayl ilemler
yapabilmektedir. Noktal say ilemlerinin tam say ilem yapan makine komutlaryla
gerekletirilmesine gerek say emlasyonu denir. Emlasyon ynteminde rnein iki
noktal saynn arpm yze yakn makine komutu gerektirmektedir. Matematik ilemci
gerek ilemciye balanarak altrlan noktal say ilemlerini elektronik devrelerle yapan
yardmc bir ilemcidir. Bir noktal say ilemi emlasyon yntemi yerine matematik ilemci
tarafndan ok ksa bir sre ierisinde yaplmaktadr. rnein 8086 ilemcisinde emlasyon
yoluyla ilemcinin 5 megaherzt hznda olduu varsaymyla Cde kullandmz iki double
saynn arpm 2100 mikro saniye tutmaktadr. Oysa 8087 matematik ilemcisi ayn ilemi 27
mikro saniyede yapmaktadr. Yani emlasyon yntemine gre 80 kat daha hzldr. 8086,
8088 mikroilemcileri iin retilen matematik ilemci 8087 ilemcisidir. 80286 ilemcisi iin
80287 matematik ilemcisi retilmitir. Nihayet 80386, 80486 ve Pentium ilemcileri iin
halen 80387 matematik ilemcisi kullanlmaktadr. Intel en bata normal ilemciyle matematik
ilemciyi elektriksel yolla balant kurularak alacak biimde tasarlamtr. Gemie doru
uyumu korumak zorunluluu nedeniyle bugnde bu kullanm biimi devam etmektedir. 80486
DX ve sonraki modellerde matematik ilemci ayn entegre devrenin iersinde ancak ayrk
olarak monte edilmitir. Burada kullanlan matematik ilemci teorik olarak 80387dir.

93

Normal lemci ile Matematik lemcinin Birlikte almas


Bellekten komutlar normal ilemci tarafndan alnr. Eer komut bir matematik ilemci
komutu ise normal ilemci tarafndan matematik ilemciye verilir ve komut bylece
matematik ilemci tarafndan ilenir. Btn matematik ilemci komutlar DE n ekiyle balar.
Normal ilemci komutun DE n ekiyle baladn grdnde komutu matematik ilemciye
verir. Sembolik makine dilinde F ile balayan komutlar matematik ilemciye ilikin
komutlardr. rnein:
FADD
FMUL
FDIV

Bu komutlarn ilk byte DE n ekiyle balamaktadr.


Matematik lemcinin Register Yaps
Matematik ilemcinin 3 nemli register vardr:
1. Data Registerlar:
Bu registerlar 8 tanedir. Her biri 10 bytetr ve bir eit stack sistemi gibi alr.
2. Control Register:
Bu register matematik ilemcinin durumunu deitirmek amacyla kullanlr. 16 bit
uzunluundadr.
3. Status Register:
Bu register da matematik ilemcinin alma durumu hakknda bilgi verir. Yani normal
ilemcinin bayrak register gibidir. 16 bit uzunluundadr.
Noktal Saylarn Bellekte Tutulma Biimleri
Noktal saylarn bellekte tutulma biimleri konusunda ilk nceleri belli bir standart
yoktu. rnein DEC firmasnn, IBM firmasnn tanmladklar farkl formatlar vardr.
Microsoft firmas da Microsoft Binary Format diye isimlendirilen ayr bir format
tanmlamtr. Ancak daha sonra kullanmaktan vazgemitir. Daha sonra IEEE noktal
saylarn tutulmasna ilikin 754 numaral standard belirlemitir. Bu standart donanm
firmalarnn ou tarafndan benimsenmitir. Intel matematik ilemcileri de noktal say
format olarak bu belirlemeleri kullanmaktadr.
lk noktal say formatlar sabit noktal formatlard. Bu formatlarda noktann belirli bir
yerde olduu varsaylmaktadr. Bu yerin sol tarafna saynn tam ksm, sa tarafna ise kesir
ksm yerletirilmektedir. Ancak daha sonralar kayan noktal formatlara geilmitir. Bu
formatlarda sanki nokta yokmu gibi say bir btn halinde ifade edilir, noktann yeri say
ierisine dahil olan ilave bitlerle ifade edilir. IEEE format bir kayan nokta formatdr. IEEE
formatnda farkl uzunlukta 3 noktal say tr tanmlanmtr. 4 byte uzunluundaki formata
short real format(Cde float), 8 byte uzunluundaki formata long real format(Cde
double), 10 byte uzunluundaki formata extended real format(Cde long double) denir.

94

Noktal Say Formatlar

1.

2.

3.
4.

Noktal say formatna dnm u admlardan geilerek yaplabilir:


Noktal say ikilik sistemde nokta kullanlarak noktann sol tarafnn ikinin pozitif
kuvvetleriyle, sa taraf negatif kuvvetleriyle arplacak biimde ifade edilir. rnein
12.25 saysn dntrecek olalm. Bu admda sayy yle yazarz: 1100.01
Format ksmdan olumaktadr:
a. aret biti
b. Mantis ksm
c. stel ksm
Bu admda saynn 1.xx durumuna getirilebilmesi iin ne kadar saa ya da sola
kaydrlaca hesaplanr(Bu say pozitif ya da negatif olabilir). Sola kaydrmalar pozitif,
saa kaydrmalar negatiftir. Bu say BIAS deeri denilen bir deerle toplanr ve formatn
stel ksmna yerletirilir.
Saydan nokta atlr. Bir btn olarak en soldaki 1 kartlarak formatn mantis ksmna
yerletirilir. Bu blmde bo kalan bitler 0 ile doldurulur.
Saynn iaret biti 0sa pozitif, 1se negatif olacak biimde formatn iaret biti ksmna
yerletirilir.

Formattaki bu 3 blmn ka bit uzunlukta olduu ve bu bitlerin hangi bitler olduu


formatta belirlenmitir.
Yuvarlama Hatas(rounding error)
Kayan noktal formatlarda noktann sa taraf 2nin negatif kuvvetleriyle arpld
iin onluk sistemde aka yazlabilen baz saylar bu formatta kesin olarak
belirtilemeyebilirler. rnein .1 ve .9 ile biten saylarn ou bu formatta tam olarak ifade
edilememektedirler. Ancak kendisi kesin olarak ifade edilemese de o sayya yaklak bir say
bu formatta yine de ifade edilebilmektedir. Bir saynn kendisinin tam olarak ifade
edilememesinden dolay onun yerine ona yaklak bir saynn ifade edilmesine yuvarlama
hatas(rounding error) denir. Formatta saynn mantis ksm ne kadar byk tutulursa
yuvarlama hatasnn olumsuz etkisi o kadar azaltlr. Yuvarlama hatas tam olarak ifade edilen
iki saynn ileme sokulup sonu olarak alnan saynn zerinde de oluabilir. Yuvarlama
hatalar byk saylarla arpma ilemlerinde iyice byyebilir. Programlama dillerinin
ounda iki gerek saynn eitliinin karlatrlmasnda tam eit olma durumuna baklr.
Byle bir karlatrma ileminden kanmak gerekir. rnein aadaki eitlik matematiksel
olarak doru olduu halde Cde if deyimi ierisine alndnda dorulanmayabilir:
1/3+3/4+7/8 == 3/4+7/8+1/3
belki bu iki toplam noktadan sonra 70 basamak ayndr, fakat tam olarak ayn deildir.
rnein Cde iki gerek saynn eitlik karlatrmas belli bir duyarllk karlnda
yaplmaldr. Bunun iin iki yntem nerilebilir. Birinci yntem olduka hzl alr.
Saylarn farknn mutlak deeri belli bir snrdan kk m? diye baklr(fabs fonksiyonu).
kinci yntem popler olarak pek ok yksek seviyeli programlama dilinde kullanlmaktadr.
Burada saylar sprintf fonksiyonu ile n basamakl yazlara dntrlr. Yazlar da strcmp
fonksiyonu ile blok olarak karlatrlr(noktann ASCII karl saysal karakterlerden daha
kktr).

95

int Cmp(double x, double y, int prec)


{
char s[SIZE], d[SIZE];
char temp[10];
sprintf(temp, %%.%dlf, prec);
sprintf(s, temp, x);
sprintf(d, temp, y);
return strcpm(s, d);
}

Float(short real) Format


31

30

23 22

aret

stel ksm(8bit)

Kesir ksm(23 bit)

BIAS deeri 127dir.


rnek uygulama: 100.25 saysn float say formatna dntrnz.
kilik dzende
stel ksm
Kesir ksm
aret biti

1100100.01
6(0110)
1.10010001 10010001
0

Kesir ksm
stel ksm
Say

1001 0001 0000 0000 0000 000


6+127=133(10000101)
0100 0010 1100 1000 1000 0000 0000 0000(4C88000h)

Kontrol etmek iin


#include <stdio.h>
void main(void)
{
float a = 100.25;
int i;
unsigned char *p = (unsigned char *)&a;
for (i = 3; i >= 0; --i)
printf("%02x ", p[i]);
putchar('\n');
}

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

0000 0000 0000 0000 0000 000


-3+127=124(01111100)
0011 1110 0000 0000 0000 0000 0000 0000(3E000000)

rnek uygulama: 10000000 saysn ifade edin.


kilik dzende
stel ksm
Kesir ksm
aret biti

11110100001001000000
19
1.11101000010010000001110100001001000000
0

Kesir ksm
stel ksm
Say

1110 1000 0100 1000 0000 000


19+127=146(10010010)
0100 1001 0111 0100 0010 0100 0000 0000 (49742400)
BIAS Deerinin Anlam

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

0111 1111 1000 0000 0000 0000 0000 0000(1.701412e+38)


0000 0000 1000 0000 0000 0000 0000 0000(1.175494e-38)
Noktal Say Formatnda zel Saylar

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

Double(long real) Format


Sekiz bytelk noktal say formatdr. Float formatna gre saynn stel ksm ve
kesir ksm bytlmtr.
52 51

63

62

aret biti

stel ksm(11 bit)

Kesir ksm(52 bit)

BIAS 1023
Long Double(extended real) Format
64 63

79

78

aret biti

stel ksm(15 bit)

Kesir biti(64 bit)

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.

Bu registerlarn hepsi 10 byte uzunluundadr. Btn noktal saylar matematik ilemci


ierisinde long double formatna dntrlerek bu registerlar ierisinde tutulur. Bu stack
sistemine ilikin bir stack gstericisi(stack pointer) vardr. buradaki stack sistemi dngseldir.
Yani stack gstericisi D0a geldiinde bir PUSH ilemi yaplrsa D7 registerna dnmektedir.
Yani stack tamas diye bir durum sz konusu olmaz. Matematik ilemci komutlar birka
grupta incelenebilir:
1. Bellekten matematik ilemcinin stack registerna PUSH eden komutlar. Bu ilem
srasnda stack gstericisi azaltlr ve deer stack gstericisiyle belirtilen registera
yerletirilir.

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.

FSTP/FSTP dword ptr mem


FST/FSTP qword ptr mem
FST/FSTP tbyte ptr mem
FST/FSTP ST(n)
ST(0)

Register ierisindeki float bilgiyi bellee almak iin kullanlr.

stack gstericisinin gsterdii yerdir. ST(1) stack gstericisinin


gsterdii yerden bir ileridir. Bu komut ST (0)daki bilgiyi ST(n)e atar.
Tam Saylara likin PUSH ve POP Komutlar

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

iin derleyiciler yle bir kod retirler:


FILD word ptr b
FSTP qword ptr a

FIST ve FISTP komutlarysa bu komutlar matematik ilemcinin stack registerndaki


bilgileri tam say formatna evirerek bellekte istenilen yere yklerler. Temel olarak iki
biimleri vardr:
1. FIST/FISTP word ptr mem
2. FIST/FISTP dword ptr mem
rnein Cde
long x;
double y;
x = y;
gibi bir ilem iin derleyici
FLD qword ptr y
FISTP dword ptr x

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

komutu stack gstericisinin gsterdii yerdeki bilgiyle bellekteki bilgiyi toplar,


stack gstericisinin gsterdii yere yazar.
FADD mem

FADD ve FADDP komutlarnn operandsz versionlar da vardr. FADD komut


ST(0)ST(0)+ST(1) ilemini yapar.
Cde Gerek Say Trlerine Geri Dnen Fonksiyonlar
Cde float, double ve long double trlerinde geri dn deerlerine sahip fonksiyonlar
geri dn deerlerini matematik ilemcinin stack registernda PUSH edilmi bir biimde
tutmak zorundadr. Yani aran fonksiyon parametreleri stacke PUSH ettikten sonra
fonksiyonu arr. Daha sonra FSTP komutuyla geri dn deerini matematik ilemcinin
stackinden POP eder. aran fonksiyon matematik ilemcinin stack registern
dengeleyerek ilemini bitirmektedir. rnein:
double add(double a, double b);

gibi bir fonksiyonun


c = add(a, b)

eklinde arlmas yle yaplacaktr:


PUSH b3
PUSH b2
PUSH b1
PUSH b0
PUSH a3
PUSH a2
PUSH a1
PUSH a0
CALL _add
FSTP qword ptr c
ADD SP, 16

Stackin grnm:

101

Bu fonksiyon yle yazlabilir:


/*****fadd00.asm*****/
.model small
.code
_add proc near
PUSH BP
MOV BP, SP
FLD QWORD PTR [BP + 4]
FADD QWORD PTR [BP + 12]
POP BP
RET
_add endp
public _add
end

/*****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

Bu seenekte kodda matematik ilemci ilemi yaplmayaca belirtilir.


Bylelikle derleyici matematik ilemci iin kod oluturmaz. Eer noktal say
ilemi kullanlrsa error oluur.
Emulation
Bu seenek matematik ilemcinin olup olmadn aratr, varsa onu kullan,
yoksa emlasyon ktphanesiyle fonksiyon ararak ilemleri yap anlamna
gelir. Bu default olarak installation srasnda belirlenen durumdur.
8087
Bu seenekle gerek say ilemleri her zaman 8087 matematik ilemci uyumlu
komutlar kullanlarak yaplr.
80287/80387 Derleyici her zaman 80287 ya da 80387 uyumlu matematik ilemci uyumlu
kod retir.
Gerek Say Emlasyonu
Emlasyon yntemi statik ve dinamik biimlerde kullanlabilir. Statik emlasyonda
derleyiciler bir LIB dosyasn link ilemine dahil ederler. Bu LIB dosyas ierisinde noktal
say ilemlerini yapan fonksiyonlar bulunur. Derleyiciler gerek say ilemlerini bu
ktphaneden fonksiyon ararak yaparlar. rnein BORLAND derleyicilerinde EMU.LIB
isimli ktphane bu biimdeki emlasyon ktphanesidir. Eer matematik ilemcimiz yoksa,
rnein iki double sayy topluyorsak derleyici bu ilem iin FADD makine komutunu
kullanmaz, bunun yerine toplama ilemini tam sayl ilemlerle yapan EMU.LIB ierisindeki
bir fonksiyonu arr(INT 11h ile matematik ilemci olup olmad renilebilir). Dinamik
emlasyon yntemi ilgin bir yntemdir. Bu yntemde derleyici normal matematik ilemci
kodu retir. Ancak derleyici btn DE matematik ilemci n eki yerine CC komutunu
yerletirir. CC INT 3 isimli bir makine komutudur. INT 3 her zaman 3 numaral kesmeyi
oluturan tek bytelk bir makine komutudur. Normal INT makine komutu 2 byte
uzunluundadr. Program altrldnda bir matematik ilemci komutuna gelindiinde 3
numaral kesme arlacaktr. Bu kesmenin kodu emlasyon program tarafndan memory
resident olarak hook edilmitir. Hook kodu gerek koda bavurarak hangi matematik ilemci
komutunun kullanldn anlar ve uygun fonksiyonu arr.
Sembolik makine dilinde gerek saylar tutan sembollerin tanmlanmas:
Gerek saylar "dd", "dq" ya da "dt" semboleriyle belirtilir. Bu belirleyiciler
kullnalarak data sembolleri tanmlandnda sembolik makine dili derleyicileri verilen ilk
deerlerde "." olup olmadna bakarlar. Eer "." varsa gerek say formatna uygun olarak
sayy yerletirirler. "." yoksa ikiye tmleyen aritmetiine gre tam say formatnda
yerletirilirler.
rnein:
x
y

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

Not: TD programnda matematik ilemcimnin register'lar "View-->Numeric Processor"


seeneiyle grntlenir. Bu grntde ST(0), ST(1), ST(2), ... o anda stack gsatericisinin
gsterdii data register 'dan balayarak register belirtir. ST(0), matemetik ilemcisinin stack
gstericisinin gsterdii register'dr. Bunun gerekte ka numaral data register olduu
debugger'de ST alannda yazmaktadr.
PipeLine lemi
PipeLine , mikroilemci bir makine komutu zerinde alrken saonraki makine
komutlarnn eitl ilemlerini bu arada yapmas anlamna gelir. Bylece alma sras
sonraki makine komutuna gelindiinde o komutun zaten belirli bir paras yaplm olur.
RISC ilemcilerinde bu mekanizma ideal bir ekilde yaplmaktadr. nk RISC
ilemcilerinde btn komutlarn byte uzunluu eittir ve btn komutlar eit zamanda
altrlrlar. Bu zellikler PipeLine ilemini tasarm bakmndan ok kolaylatrmaktadr.
Ancak yine de bir CISC grubu ilemci olan 80x86 ailesinde de ideal olmasa da bir pipe line
ilemi yaplmaktadr.
Normal lemciyle Matematik lemcinin Senkronizasyonu
Normal ilemciyle matematik ilemci arasnda elektriksel bir balant sz konusudur.
Normal olarak ilemci komutun matematik ilemciyi ilgilendirdiini anlar ve komutu
matematik ilemciye verir. Bundan sonra komutlar artk paralel bir biimde asenkron olarak
iletilmektedir. Bu asenkron almann iki problemi vardr:
1. Bir matematik ilemci komutundan sonra bir normal ilemci komutu varsa ve bu normal
ilemci komutu matematik ilemci komutunun sonucuyla ilgiliyse normal ilemcinin
matematik ilemcinin komutu bitirmesine kadar bekletilmesi gerekir. rnein,
inc bx
fstp x
mov ax,word ptr x

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:
-

lemde tama olmu mudur?


Sfra blme olmu mudur?
Stack gstericisi ka numaral register gstermektedir?
Dierleri

Noktal saylarn karlatrlmasnda da bu registern baz bayraklar kullanlr. Status


register bilgisi elde edilebilir. Bu ilem FSTSW komutuyla yaplr. Komutun kullanm tm
matematik ilemcilerde bellek operand verilerek yaplabilir, ancak 80287 ve sonrasnda
komut register zerinden de alabilmektedir. Register normal ilemcinin 16 bit
registerlarndan biri olmaldr. Komutun kullanm biimi yledir:
FSTSW word ptr mem
(80287 ve sonras)

FSTSW reg

Status register ierisindeki bitler yledir:


15
B

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

(ST ile ST(1) saylarn karlatrr)


(ST ile ST(n) saylarn karlatrr)
(ST ile mem saylarn karlatrr)

Bu komutun FCOMP isimli POPlu versiyonlar da vardr. Tipik bir karlatrma ilemi
yle yaplr:
rnein a ile b karlatrlacak olsun
FLD a
FCOMP b

Bu karlatrma ileminden sonra karlatrmann sonucu status registern C0, C2, C3


bitlerine baklarak tespit edilir. Tabii bu bitlere bakabilmek iin nce status register
FSTSW komutu ile elde etmek gerekir. Bu elde etme ilemi 80287 ve sonras iin
FSTSW AX
ile, 8087 iin iki aamada
FSTSW word ptr mem16
MOV AX, mem16

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

(flag registerlar zerinde ilemler).

3. LAHF ve SAHF komutlarn kullanmak.


Bu komutlar operandszdr. LAHF komutu bayrak registernn dk anlaml byten AH
registerna ykler. SAHF AH registerndaki bilgiyi bayrak registernn dk anlaml
bytena ykler. Bayrak registernn dk anlaml bytenda CF, PF, AF, ZF, SF ve TF
bayraklar bulunmaktadr. Status registern yksek anlaml byte ile bayrak registernn
dk anlaml byte aadaki gibi birebir eletirilebilir:

107

15

14
C3

13

12

11

10
C2

9
C1

8
C0

7
TF

6
ZF

4
AF

2
PF

0
CF

imdi a ile b saysnn karlatrlmasnn genel kalb yazlabilir:


FLD a
FCOMP b
FSTSW AX
WAIT
SAHF

Artk CF = C0, PF = C2 ve ZF = C3 olmutur.


C0, C2 ve C3 Status Register Bitlerinin Karlatrmadaki Anlamlar
Eer C2 set edilmise problemli bir durum vardr. Ya operandlardan bir tanesi geerli
bir say deildir, ya da +sonsuz, -sonsuz gibi bir deerdedir. Byle problemli bir durumun
aratrlmas ou kez gerekmez, grmezden gelinebilir. Bu hatann tespit edilmesi JP
komutuyla yaplabilir. Eer C3 set edilmise iki operand birbirine eittir. Bu durum JZ
komutuyla tespit edilebilir. Eer birinci operand yani rneimizdeki a(yani STde bulunan)
ikinci operanddan bykse C0 reset edilir, kkse set edilir. Bu durum JC, JB, JNC, JNB
komutlaryla tespit edilebilir. Ayrca kk eit ve byk eit karlatrmalar iin JBE, JNE,
JA, JAE komutlar kullanlabilir.
Karlatrma rnekleri:
C kodu
double a, b;
if (a == b)
ifade1;
else
ifade2

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:

Programlama Dillerindeki Yerel Deikenlerin Kullanlmas


Programlama dillerinde yerel deikenler tpk parametre deikenleri gibi stack
blgesini kullanmaktadr. Intel mimarisinde C derleyicileri fonksiyonun hangi blounda
olursa olsun tm yerel deikenleri fonksiyonun banda stack zerinde oluturur. Bunun iin
PUSH BP
MOV BP, SP

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 ;
.....
}

Yerel deikenlerin taral blgeye nasl yerletirilecei derleyiciden derleyiciye deiiklik


gsterebilmektedir. rnein Turbo C 2.0 derleyicisinde yerleim ilk tanmlanan deiken
stack blgesinin dk anlaml blgesinde olacak biimde yerletirilmektedir. Borland C ve
Microsoft derleyicilerinde ilk tanmlanan deiken yksek anlaml byteta olacak biimde
109

yerleim yaplmaktadr. Yukarda belirtilen func fonksiyonu iin giri kodu aadaki gibi
olacaktr:
PUSH BP
MOV BP, SP
SUB SP, 8

sel organizasyon biiminin deimesinin hibir tanabilirlik problemi yoktur. nk yerel


deikenlere dardan zaten eriilemez. Bu durumda fonksiyonu programc yazmsa baka
fonksiyonlar zaten bu deikenlere erimeyecektir. Derleyici yazmsa sembolik makine dili
programcs erimeyecektir. Yani derleyicinin uygulad yntem ile sembolik makine dili
programcsnn uygulad yntem farkl olsa bile herhangi bir problem olumaz. Yukardaki
rnekte TC 2.0 derleyicisinde yerel deikenlerin yerleri yle olacaktr:
x[BP - 8]
y[BP - 6]
z[BP - 4]
m[BP - 2]
BC 3.0 ve Microsoft derleyicilerinde eriim yledir:
m[BP - 8]
z[BP - 6]
y[BP - 4]
x[BP - 2]
Yerel deiken kullanan fonksiyonlar k kodu aadaki gibi olmaldr:
MOV SP, BP
PUSH BP
RET
MOV SP, BP

yerel deikenler iin ayrlan alann boaltlmas amacyla kullanlmaktadr.

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

int add(int a, int b)


{
int result;

_add proc near


PUSH BP
MOV BP, SP
SUB SP, 2
MOV AX, [BP + 4]
ADD AX, [BP + 6]
MOV [BP - 2], AX
MOV AX, [BP - 2]
MOV SP, BP
POP BP
RET
_add endp

result = a + b;
return result;
}

/*****yerel001.c*****/

/*****yerel001.asm*****/

C Kodu

Assembler karl

void swap(int *p1, int *p2)


{
int temp;

_swap proc near


push bp
mov bp, sp
sub sp, 2
push si
mov bx, [bp + 4]
mov ax, [bx]
mov [bp - 2], ax
mov si, [bp + 6]
mov ax, [si]
mov [bx], ax
mov ax, [bp 2]
mov [si], ax
pop si
mov sp, bp
pop bp
ret
_swap endp

temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void main(void)
{
int x = 10, y = 20;
swap(&x, &y);
}

_main proc near


push bp
mov bp, sp
sub sp, 4
mov word ptr [bp 2], 10
mov word ptr [bp 4], 20
lea ax, [bp 4]
push ax
lea ax, [bp 2]
push ax
call _swap
add sp, 4
mov sp, bp
pop bp
ret
_main endp

/*****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

int is_debug_line(const char *buf);


void main(int argc, char *argv[])
{
char Path[MAXPATH], buf[LINELEN];
FILE *fs, *fd;
if (argc != 2) {
fprintf(stderr, "usage: %s <filename>\n", argv[0]);
exit(1);
}
if (argc > 2) {
fprintf(stderr, "Too many parameters\n");
exit(2);
}
if ((tmpnam(Path)) == NULL) {
fprintf(stderr, "Cannot get temp file\n");
exit(3);
}
if ((fs = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "cannot open file: %s\n", argv[1]);
exit(4);
}
if ((fd = fopen(Path, "w")) == NULL) {
fprintf(stderr, "cannot open temp file: %s\n", Path);
exit(4);
}
while (fgets(buf, LINELEN, fs) != NULL) {
if (!is_debug_line(buf))
fprintf(fd, "%s", buf);
}
fclose(fs);
fclose(fd);
if (remove(argv[1]) == -1) {
fprintf(stderr, "cannot delete file: %s\n", argv[1]);
exit(5);
}
if (rename(Path, argv[1]) == -1) {
fprintf(stderr, "cannot rename file %s to file %s\n", Path, argv[1]);
exit(6);
}
}

112

int is_debug_line(const char *Buf)


{
while(isspace(*Buf))
++Buf;
return *Buf == '?';
}

/*****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];

_main proc near


push bp
mov bp, sp
sub sp, 4
mov byte ptr [bp - 4], a
mov byte ptr [bp - 3], l
mov byte ptr [bp - 2], i
mov byte ptr [bp - 1], 0
lea ax, [bp 4]
push ax
call _puts
pop ax
mov sp, bp
pop bp
ret
_main endp

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;

_main proc near


push bp
mov bp, sp
sub sp, 4
push si
mov word ptr [bp - 2], 10
lea ax, [bp - 2]
mov [bp - 4], ax
mov si, [bp - 4]
mov word ptr [si], 20
pop si
mov sp, bp
pop bp
ret
_main endp

/*****yerel004.c*****/

/*****yerel004.asm*****/

p = &a;
*p = a;

Stringler derleyici tarafndan .data alanna yerletirilir. Sonra balang adresiyle


kullanlrlar.

113

C kodu

Assembler karl

void main(void)
{
char *p;

.data
s@

p = Ankara;
puts(p);
}

/*****yerel005.c*****/

db

Ankara, 0

_main proc near


push bp
mov bp, sp
sub sp, 2
mov ax, offset s@
mov [bp 2], ax
push ax
call _puts
pop cx
mov sp, bp
pop bp
ret
_main endp

/*****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

_func proc near


push bp
mov bp, sp
sub sp, 10
mov ax, 10
push ax
mov ax, offset a@
push ax
lea ax, [bp 10]
push ax
call _memcpy
add sp, 6
mov sp, bp
pop bp
ret
_func endp

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)

4e eittir. Bu yzden dinamik tahsisatlarda kesinlikle sizeof operatr


kullanlmaldr. Byte hizalamas demek derleyicinin byle bir abaya girmemesi demektir.
Byte hizalamas yapldnda sizeof(struct SAMPLE) 3e eit olacaktr. Dinamik bellek
fonksiyonlar hizalama problemi yznden genellikle ift adresten balayacak biimde
tahsisat yapar. Bylece malloc ile tahsis edilen bir yap alanna eriimde word hizalamas
kullanlm olsa bile hz kayb olmayacaktr.

116

4. Yapnn toplam uzunluu tek ise ifte tamamlanmaktadr. Yani:


struct SAMPLE {
int b;
char a;
};

yapsnn da sizeofu 4tr.


Borland derleyicilerinde word hizalama iin OptionsCompilerCode generationWord
seilir. Default durum byte hizalama biimidir.

alignment

Dword Hizalamas(dword alignment)


32 bit ilemcilerde hizalama seenei byte ya da dword biimindedir. Derleyici dword
hizalamasna getirildiinde unlar olur:
1. Fonksiyon blok girilerinde SP her zaman dword katlarndadr.
2. char tr dndaki tm trler 4n katlarndaki adreslere yerletirilir.
3. Yap deikenlerinin kendisi de 4n katlarndaki adreslerden balayacak biimde
yerletirilir.
4. Yapnn toplam uzunluu 4n katlar olacak biimde tamamlanr.
Diziler hangi trden olurlarsa olsunlar aralarnda boluk bulundurulmadan
yerletirilirler. Ancak dizinin balangc word hizalamada ift adreste, dword hizalamada ise
4n katlarndaki adrestedir. Visual C++ 6.0 derleyicinde bir proje yaratldnda hizalama
default olarak dword biimindedir.
Hizalama Problemleri
Hizalama yznden tipik birka problem sz konusu olmaktadr.
1. Dosyada bulunan bir veri yapsnn bir yap deikeni iine transfer edilmesi durumunda
word ya da dword hizalamas kullanldnda akmama problemi ortaya kabilir.
rnein .x biiminde bir dosya format sz konusu olsun. Dosyann ilk bytelar yle
dizilmi olsun:
1 byte ID
2 byte MAXCOLOR
4 byte TOTALCOLOR
Dosyadaki bu durum XFORMAT biimindeki bir yap ile ifade edilip, fread ile okuma
yaplacak olsun:
typedef struct _XFORMAT {
BYTE id;
WORD maxcolor;
DWORD totalcolor;
} XFORMAT;
XFORMAT x;
...
fseek(f, 0, 0);
fread(&x, sizeof(XFORMAT), 1, f);

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

Assembler karl(16 bit)

struct SAMPLE {
int a;
long b;
char c;
};

_Set proc near


push bp
mov bp, sp
push si
mov si, [bp + 4]
mov word ptr [si], 10
mov word ptr [si + 2], 20
mov word ptr [si + 4], 0
mov word ptr [si + 6], 97
pop si
pop bp
ret
_Set endp

void Set(struct SAMPLE *p)


{
p->a = 10;
p->b = 20;
p->c = a;
}
void main(void)
{
struct SAMPLE x;
Set(&x);
}

_main proc near


push bp
mov bp, sp
sub sp, 7
lea ax, [bp 7]
push ax
call _Set
pop cx
mov sp, bp
pop bp
ret
_main endp

/*****yerel008.asm*****/

118

Assembler karl(32 bit)


_Set proc near
push ebp
mov ebp, esp
mov eax, [bp + 8]
mov dword ptr [eax], 10
mov dword ptr [eax + 4], 20
mov byte ptr [eax + 8], 97
pop ebp
ret
_Set endp
_main proc near
push ebp
mov ebp, esp
sub esp, 9
lea eax, [bp 9]
push eax
call _Set
pop ecx
mov esp, ebp
pop ebp
ret
_main endp

/*****yerel008.c*****/
Fonksiyon gstericileri dolayl call komutuyla ifade edilir.
C kodu

Assembler karl

void func(void)
{
}

_func proc near


ret
_func endp

void main(void)
{
void (*p)(void);

_main proc near


push bp
mov bp, sp
sub sp, 2
mov word ptr [bp 2], _func
call word ptr [bp 2]
mov bp, sp
pop bp
ret
_main endp

p = func;
p();
}

NOT:Kod

sembolleri de bir bellek blgesine mov komutuyla dorudan atanabilir. Kod


sembolleri [] ierisinde deil, dorudan bir say belirtmektedir.
C++ta Bir Snfn ye Fonksiyonlarnn Sembolik Makine Dilinde arlmas
Bilindii gibi C++ta bir ye fonksiyon snf nesnesi yoluyla nokta operatrn
kullanarak ya da snf gstericisi yoluyla ok operatr kullanlarak arlr. ye fonksiyon
aslnda normal bir fonksiyondur. Yalnzca mantksal bakmdan snfla ilikilendirilmitir.
Derleyici ye fonksiyon hangi snf nesnesiyle arlmsa onun adresini gizlice this
gstericisi biiminde geirmektedir. This gstericisi fonksiyonun ilk parametresi olarak

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

void Date::Disp(void) const


{
printf("%d/%d/%d\n", day, month, year);
}
void Date::Verify(void) const
{
}
void Date::Set(int d, int m, int y)
{
day = d;
month = m;
year = y;
Verify();
}
void main(void)
{
Date x;
x.Set(18, 1, 2001);
x.Disp();
}

.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, ...);

Burada fonksiyon en azndan bir parametre almak zorundadr. Bu parametreden sonra


istenildii kadar ok parametre alabilir. Bu durumda printf fonksiyonunun prototipi yle
olmaldr:
int printf(const char *format, ...);,

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);

Derleyici fonksiyonu yle aracaktr:


push b
push a
push yaz_adresi
call _printf
add sp, 6

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

Bazen deiken sayda parametre alan fonksiyonlarda birinci parametre ka parametreyle


arld bilgisini iermez. fonksiyon son parametrenini zel bir deer olmasndan hareketle
tasarlanr. rnein yukardaki kodu birinci parametrenin anlamn deitirip son paramt-etre 0
oluncaya kadar saylarn toplam biiminde ifade edebiliriz. Yukardaki sum() fomksiyonunu
son parametrenin yerini 0 ile tesbit ederek yeniden tasarlaynz. C'de deiken sayda
parametre alan saylarn en az bir paramteresi olmak zorundadr. Bu yzden fonksiyonun
prototipi yine;
int sum(int n,...);
biiminde belirtilmelidir.
C'de deiken sayda parametre alan fonksiyonlarn yazm:
C'de deiken sayda parametre alan foksiyonlar standart makrolarla yazlmaktadr. Bu
makrolar kullanlrsa kod sistem bamsz olarak alabilir. Aslnda biz sistemi iyi
yanyorsak birinci parametrenin adresini alarak stack zincirini takip edebikiriz. Ancak byle
bir zm tanabilir deildir.
rnek:
int sum(int n,...)
{
int total = 0;
int i;
int *pnum;
pnum = &n + 1;
for(i = 0; i < n; ++1)
total += pnum++;
return total;
}
void main(void)
{
printf("%d\n", sum(5,3,2,6,7,4));
}
Bu ilemler standart makrolar kullanlarak yaplmaldr.
1) va_list trnden bir deiken tanmlanr.
typedef void *va_list

2) va_start makrosu va_list trnden deiken ve birinci parametre ismiyle arlr.


#define va_start(ap,parmN)

((ap) = (char *) &parmN + size(parmN))

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)

((sizeof(x)+ sizeof(int) - 1) & ~(sizeof(int) -1))

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)))

((char *)(ap) += size(type), *(type)((char *)(ap)-

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

C'de Deiken Sayda Parametre Alan Fonksiyonlara rnekler


1) void avg(const char *msg, ...);
Bu fonksiyon 0 parametresini grene kadar parametre olarak girilen saylarn aritmetik
ortalamasn ekrana yazdrr. Fonksiyonun birinci parametresi aritmetik ortalama
yazdrlmadan nce ekrana kacak olan yazy belirtir.
void main(void)
{
arg("average", 10, 20, 30, 40);
}
void avg(const char *msg, ...)
{
double average, total = 0, val;
int count = 0;
va_list va;
va_start(va, msg);
while((val = va_arg(va, int)) != 0) {
total += val;
++count;
}
average = total / count;
printf("%s % lf\n", average);
va_end(va);
}
2) letim sisyemi yklendiinde hatta makine satn alndnda bir karakteri ekrana basan
fonksiyon kesme biiminde vardr. Bu fonksiyonun putchar() fonksiyonu olduunu
varsayalm. Yalnzca putchar() fonksiyonunu kullanarak %d ve %s formatlarna duyarl olan
printf() fonksiyonunu myprintf() ismiyle yaznz. Aadaki kodla test ediniz.
void myprintf(const char *format, ...);
void main(void)
{
int a = 100;
char *msg = "deneme";
myprintf(""a = %d\n%s\n, a, msg);
}

125

Aklama1; Int bir sayy ekrana yazdran fonksiyon yledir.


void printd(int n);
{
if(n < 0) {
putchar('-');
n = -n;
}
if(n / 10)
printd(n / 10);
putchar(n % 10 + '0');
}

Aklama2: Fonksiyonun birinci parametresindeki yaz incelenir. % karakteri grldnde


yanndaki karaktere baklr. Yanndaki karakter "d" ise stack'ten int bir argman ekilir ve
printd() fonksiyonuyla yazlr. "s" ise stack'ten char * trnden argman ekilir o argman
NULL grlene kadar yazdrlr. %'nin yanndaki karakter bunlardan biri deilse %
karakteriyle yanndaki karakteri ayn biimde yazar.
Uzak Gstericilerin Yklenmesi
Bilindii gibi DOS ortamnda segment 64 K ile snrldr. Bu durumda fiziksel adreste
istenilen adresin grlebilmesi iin segment'in de deitirilmesi gerekir. Uzak gsterici 4 byte
uzunluunda bir bellek alandr. Bu bellek alannn dk anlaml 2 byte'nda offset, yksek
anlamlu 2 byte'nda segment bilgisi bulunur. WIN32 ve UNIX sistemlerinde uzak gsterici
kullanlmaz. Btn segment deeri 0 kabul edilir. Bellein her yerine yalnzca offset
bilgisiyle eriilir. Offset ise 4 byte uzunluktadr. DOS'ta bellek modeli medium, ladge ya da
huge ise far anahtar szc kullanlmasa bile gstericiler uzak gstercilerdir. Bir uzak
gstericiyi kullanabilmek iin dk anlaml 2 byte'n index register'a, yksek anlaml 2
byte'n ise segment register'a yerletirmek gerekir. Uzak gstericilerle ilem yaparken hangi
segment register' semeliyiz. CS ve SS segment register' kullanmann anlam yoktur. DS ise
.data blmnn balang adresini gsterdiine gre eer deitirilecekse bile yeniden bu
adrese yklenmesi gerekir ki bu da zaman kayb anlamna gelir. deal yntem ES segment
register'n kullanp segment yklemesi yapmaktr.
char far *p = (char far *) 0xB8000000;
*p = 'a';
1) mov si, ...
2) mov es, ..
3) mov

es:[si],...
lds, les, lfs, lys Makine Komutlar:

Kullanm Biimleri:
lds
les
lfs

reg,mem
reg,mem
reg,mem

126

lgs

reg,mem

lfs ve lgs komutlar 386 ve sonrasnda geerlidir.


Bu komutlar belirtilen bellek adresinden balayarak ilk iki byte' belirtilen register'a sonraki 2
byte' ise komtta belirtilen segment register'a yklerler. Bylece uzak gstericiler tek hamlede
yklenmi olurlar. Komutun operant sembolik makine dilinde DD (define double word)
trnden bir data sembol iermelidir. Eer data sembol DD trnden deilse dword ptr ile
tr deitirilmesi yaplmaldr. Ancak debugger'larda dword ptr dntrlmesi olmadan da
komut verilebilmektedir.
C Derleyicilerinin Uzak Gsterici lemlerini Ele Al Biimi
_main proc
push
mov
sub
push
mov
mov
les
mov
pop
mov
pop
ret
_main endp

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

CPU'nun Durumunun Saklanmas


Birden fazla kodun aparalel bir biimde zaman paylaml olarak alabilmesi iin bir
koda ara verildiinde o kodun tm register bilgilerinin bellekte bir yerde saklanmas gerekir.
Ger dn ilemi srasnda saklanan yerden bilgiler alnr ve register'lara geri yklenir. Tabii
kodun almasna ara verilip yeniden dnldnde kodun kulland bellek alannn
bozulmam olmas gerekir. Eer bozulduysa yeniden dzeltilerek kodun almasna devam
edilmesi gereklidir. ok ilemli bir iletim sistemi tipik bir biimde yle davranr:
1) Bir progran altrlaca zaman bir sistem fonksiyonu kullanlr. rnein bu fonksiyonun
WINDOWS sistemlerindeki ismi CreateProcess() 'dir.
2) Program bellee yklendiinde ismi artk proses olur. Prosesi yaratan fomksiyon proses
bilgilerini tutmak iin bir handle alan tahsis eder. Bu alana "Process Database" ya da
"Process Table" denmektedir. Process Database iinde prosesle ilgili btn bilgiler
tutulmaktadr. rnein;

Prosesin am olduu dosyalar,


Programn altrlmasnda kullanlan komut satr argmanlar ,
Senkronizasyon nesnelerinin bilgileri,
Proses kesildiinde PCU register'larnn konumlar,

127

Prosesin EXIT kodu,


vs...

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:

Barada IP iin saklanan deer @2 pozisyonudur. CS ve IP deerlerinin geri yklenmesi


aadaki gibi yaplamaz:
mov
push
ret

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)

b) IP ve CS deerleri 4 byte'lk bir alana yazlr ve bu alan kullanllarak "segmentler aras


dolayl jump" komutu uygulanr.
mov ax,mem2
mov dest,ax
mov ax,mem1
mov dest+2,ax
jmp dword ptr dest

CS, IP yklemeleri registe yklemelerinin en sonunda yaplmak zorundadr. nk CS:IP


deitii anda kod kendini baka bir yerde bulacaktr.
2) SS:SP register'larnn saklanmas ve yklenmesi:
Hem SS hem de SP MOV komutuyla birlikte kullanlabilir. Bu durumda aadaki gibi bir
saklana olas gzkmektedir:
mov mem1,sp
mov mem2,ss
Gerekten saklama ilemi byle yaplabilir. Ancak geriye ykleme ilemi aadaki gibi
yaplabilir mi?
mov ss,mem1
mov sp,mem2
Pek ok IRQ stack olarak programcnn yani o anda kesilen programn stack'ini kullanr. Bu
yzden program iinde push ilemi yapmasak bile yine de IRQ'lar ve dier kesmeler iin
stack bulundurmalyz. Yukardaki ilemde;
mov ss,mem1
komutundan sonra bir IRQ oluursa stack olarak kullanlacak blge gvensiz bir blge olur.
Bunu engellemek amacyla 8086 ve 8080m ilemcilerinde donanm kesmeleri disable
edilmesi gereklidir:
mov
mov

mem1,ss
mem2,sp

mov
mov

ss,mem1
sp,mem2

cli

Ancak 80286 ve sonrasnda bu ileme gerek yoktur. nk


mikroilemci SS segment register'na ykleme yapldnda
sonraki komut sonlanana kadar otomatijk olarak kesme kabul
etmemektedir. Tabii SS register'na ykleme komutdan sonra
hemen SP register'na ykleme yapmak gerekir.

sti

durumlarda i ie

Bir kesme olutuunda kesmenin SS ve SP deerlerini


deitirerek kendi stack'ini kullanmas problemli olabilir. Bu tr
kesme armalarnda sistem kilitlenebilir. rnein DOS'un INT21h

129

kesmesinin fonksiyonlar SS ve SP deerlerini nceden belirlenmi sabit bir yere ekerler. bu


durumda i ie DOS kesmesi arldnda iteki kesmden kldnda dtaki kesmenin
stack blgesi bozulmu olur. DOS'ta bellekte kalan programlar yazlrken bir tua basldnda
IRQ1 (INT9) yardmyla kod ele geirilir.Bu kod iinde INT21h kesmesi arldnda eer
kesilen kod DOS fonksiyonu iindeyse kta kilitlenme yaanr. Bellekte kalan programlarn
yazlmas iin DOS iinde INDOS denilen bir bayrak deikeni tutulmutur. Bu bayrak
INT21h iindeyken 1, deilken 0 yaplr. Bylece bellekte kalan program aktive edilirken bu
bayraa baklr. Bu bayrak 1 ise aktive edilmez. Eer aktive edilecekse DOS fonksiyonlar
kullanlmaz. Bayrak 1 ise IRQ0 (INT8) hook edilir. Her INT8 olutuunda INT8 o bayraa
yeniden bakar. BAyrak 0'a dnce aktivasyonu INT8 yapar.
3) Dier Register'larn saklanmas ve yklenmesi:
Der register'larn yklenmesi srasnda pek ok kombinasyon bozucu etki yaratabilir.
rnein DS yklendii zaman artk SI ve DI ndex register'lar farkl bir yeri gstrecektir.
mov ds,[si+n]
mov bp,[si+m]
Bu tr durumlarda segment ykleme ilemleri tercih edilebilir.
mov
mov
mov
mov

ax,ds
es,ax
ds,[si+n]
bop,es:[si+m]

C'de Yerel Olmayan Dallanmalar


Bilindii gibi C'de goto komutunun etiketi fonksiyon faaliyet alanna ilikindir. Yani
goto deyimiyle baka bir fonksiyonun iine dallanma yaplamaz. Bunun C'de yasaklanm
olmasnn nedeni u zorunluluklardan kaynaklanmaktadr:
1) Bir fonksiyondan baka fonksiyona goto yaplabilseydi dallanlan fonksiyonda hi bir yerel
deikeni ve hi bir parametre deikeni kullanamazdk. nk goto basit bir jump
komutudur. Dallanlan kodda ise yerel deikenlere erimekte kullanlan [bp-n] ,
parametrelerre erimekte kullanlan [bp+m] komutlar vardr. imdi bu komutlarn hi bir
geerlilii kalmaz. nk BP register' goto komutunun yerletirildii fonksiyona ilikindir.
Zaten parametreler stack'te deildir, yerel deikenler iin yer ayrlmamtr. Oysa baka bir
fonksiyona arma yntemiyle dallandmzda parametreler doru bir ekilde push edilmi
olur, "stack frame" kurulmu olur.
2) Baka bir fonksiyona dallanma yaplabilseydi stack de dengelenmemi olarak kalacakt.
nk k srasnda
pop bp
mov sp,bp
gibi komutlar grlemeyecekti. Ancak C'de yine de baka bir fonksiyona dallanma olasdr.
Bunun iin prototipleri SETJMP.H iinde bulunan SETJMP ve LONGJMP komutlar
bulunur.

130

setjmp Fonksiyonu
Bu fonksiyon arld yerdeki CPU konumunu alarak parametresiyle belirtilen
jmp_buf yaps ierisinde saklar. Prototipi:
int setjmp(jmp_buf jmpb);

jmp_buf bir typedef ismidir:


typedef struct {
unsigned j_sp, j_ss;
unsigned j_flag, j_cs;
unsigned j_ip, j_bp;
unsigned j_di, j_es;
unsigned j_si, j_ds;
}jmp_buf[1];
Grld gibi jmp_buf aslnda bir elemanl bir yap dizisine ilikin bir tr ismidir. Bu
durumda setjmp fonksiyonunun parametresi bu yap trnden bir gsterici olur. setjmp
fonksiyonundan iki k vardr:
1. lk k: Bu durumda setjmp 0 ile geri dner ve CPU registerlarnn konumu
kaydedilmitir.
2. Programn baka bir yerinde longjmp ile yaplan k. longjmp yapldnda ak sanki
setjmpdan kyormu gibi geri dner. Bu durumda fonksiyon 0 d bir deerle geri
dner. O halde kn longjmp dolaysyla olup olmad aadaki gibi anlalabilir:
if (setjmp(jmpb))
{
...
...
...
exit(1);
}
longjmp Fonksiyonu
Bu fonksiyonla ak, daha nce geilmi olan ve setjmp ile kaydedilmi olan duruma
geri dner. Prototipi:
void longjmp(jmp_buf jmpb, int retval);

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

Neden longjmp Kullanlr?


Cde programn eitli yerlerinde oluabilecek problemlerin tek bir noktadan kontrol
iin longjmp tercih edilebilir. longjmp ilemi C++taki exception handling mekanizmas
gibidir. Ancak C++ta throw ilemi ile longjmp yapldnda o zamana kadar yaratlm olan
tm yerel snf nesneleri iin biti fonksiyonu da arlmaktadr.
longjmp rnei:
/*****longjmp0.c*****/
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
jmp_buf jmpb;
void sample(void);
void func(void);
void main(void)
{
switch(setjmp(jmpb))
{
case 1:
printf("Cannot open file..\n");
exit(1);
case 2:
printf("Not enough memory..\n");
exit(1);
}
func();
}
void func(void)
{
FILE *f;
sample();
if ((f = fopen("abcdzyx", "r")) == NULL)
longjmp(jmpb, 1);
printf("Success..\n");
}
void sample(void)
{
char *p;
p = (char *)malloc(0);
if (p == NULL)
longjmp(jmpb, 2);
printf("Success..\n");
}

/*****longjmp0.c*****/

132

setjmp ve longjmp Fonksiyonlarnn Sembolik Makine Dilinde Yazm


setjmp fonksiyonuyla CPUnun genel amal registerlarnn konumlarn saklamaya
gerek yoktur(Aslnda ES ve flag registerlarnn da saklanmasna da gerek yoktur). setjmp
fonksiyonu arldnda stackin durumu yledir:

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.

IP olarak setjmp fonksiyonunun kndaki deer saklanmtr. Derleyici setjmp


fonksiyonunu arrken komuttan bir sonraki yeri zaten stacke push etmitir. rnek
programda:
mov ax, [bp + 2]
mov [si + 8], ax

yapmakla setjmp fonksiyonunun kndaki durumu saklam oluyoruz. longjmp ile geriye
dn yapldnda SPnin durumu setjmp fonksiyonunun arlmadan nceki durumu
olmaldr.

133

Bylece longjmp ile geri dnldnde artk ak setjmpdan sonraya dmtr.


altrlacak kod derleyicinin stack dengeleme komutudur. Yani setjmp knda derleyici
add sp, 2

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

ierisindedir. Fonksiyon armalar default near call biimindedir. Ancak gstericiler


default uzak gsterici olmak zorundadr.
Large Model
Bu modelde birden fazla kod segmenti vardr. Yani program kodu 64Kb geebilir.
DS ile SS birbirlerinden ayrlmtr. Yani toplam statik data ve stack ayr ayr 64Kb
uzunluundadr. Fonksiyon armalar default far call biimindedir ve default
gstericiler yine uzak gstericilerdir.
Huge Model
Bu modelde programn birden ok data segmenti ve stacki olabilir. Tabii stack
64Kb yine geemez. Fonksiyon arma ilemi default olarak far call biimindedir.
Default gstericiler uzak gstericilerdir.
Uzak Modellerde Data Gstericileriyle lemler
Uzak modellerde DS ile SS birbirlerinden ayrld iin stackteki bir gstericiye data
segmentteki bir deikenin adresi, data segmentteki bir gstericiyeyse stackteki bir
deikenin adresi atanabilir. Bu durumda btn gstericiler default uzak gstericidir. rnein:
/*****far0000.c*****/
void func(int *p)
{
*p = 20;
}
void main(void)
{
int a = 10;
func(&a);
}

/*****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

Basitletirilmi segment tanmlamalaryla kod yazldnda derleyici aslnda .CODE, .DATA,


.STACK denildiinde ayr segmentler amaktadr.
Segment isimleri ve segmentin btn zellikleri obj modl ierisine
yazlmaktadr.
Segment ismi isimlendirme kuralna uygun herhangi bir isim olabilir. Microsoft ve Borland
derleyicileri standart olarak aadaki isimleri tercih edilir:
_TEXT
_DATA
_BSS
_CONST
Segmentin hizalama biimi iin byte, word, dword, para ve page anahtar szckleri
kullanlabilir. Hizalama biimi belirtilmezse default olarak para olduu kabul edilir. Hizalama
biimi segmentin bir nceki segment bittikten sonra kan katlarndan balayacan
belirlemekte kullanlr. rnein para 16nn katlar anlamna gelir. Bir nceki segment
rnein 1FC34 adresinde bitmi olsun. Sonraki segment para hizalama biimine sahipse araya
12 byte boluk braklarak 1FC40 adresinden itibaren yklenecektir. Peki bir segmentin
hizalanmas kimin tarafndan gerekletirilir?
DOSun ykleyicisi exe program blok olarak paragraf bandan
itibaren bellee ykler. Bu nedenden dolay segment hizalama grevi
ykleyicinin grevi deil, linkern grevidir.
Linker exe kodu segment hizalamasn dikkate alarak iki segment arasnda gerekirse boluk
brakarak oluturur. Bylece program yklendiinde segmentin hizalanmas mmkn hale
gelmi olur. Sonu olarak hizalama biimi derleyici tarafndan obj modle yazlr, linker
tarafndan deerlendirilerek exe kod oluturulur.
Segmentin birletirme biimi iin public, stack, common, memory ya da at biiminde
olabilir. birletirme biimi belirtilmezse segment birletirme ilemine sokulmaz. Yani
buradaki anahtar szcklerden hibiri default deildir.
Public Birletirme Biimi kod ve data segmentleri iin kullanlan bir birletirme
biimidir. public birletirme biimi linkern ayn isimli segmentleri birletirmesi iin
kullanlr. rnein:
a.asm
(1)

myseg segment para public


....
....
myseg ends

b.asm
myseg segment para public
....
(4)
....
myseg ends

yourseg segment para public


....
(2)
....

(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

Program altnda SS bu segment2in balangcn gsterecektir. SP 110(decimal) deerinde


bulunacaktr. Bu durumda programn stack uzunluu da 110 byte uzunluunda olacaktr. Bir
projede normal olarak stack birletirme biimine ilikin ayn isimli tek bir segment
bulunmaldr(Ayn isimli birden fazla stack olabilir. Ancak bunlar zaten linker tarafndan
birletirilecektir). Stack birletirme biimine sahip birden fazla farkl isimli segment
olduunda linker stack olarak grd son stack birletirme biimine sahip olan segmenti
alr. Byle bir durum normal deildir. Stacke ilikin segmentin uzunluunun 16 bit sistemde
ift, 32 bit sistemde 4n kat olmas tercih edilmelidir. 16 bit sistemde SP registernn tek
adreste braklmas hizalama kavram yznden etkin bir kavram deildir.
Segment common birletirme biimine sahip olabilir. Ancak bu birletirme biimi ok
seyrek kullanlr. Common birletirme biimiyle linker ayn isimli segmentleri ayn adresten
balayacak biimde aktrr. rnein:

138

Seg1 segment para common


X1
db
?
Seg1 ends
Seg1 segment para common
X2
db
?
Seg1 ends

Burada aslnda X1 ile X2 program yklendiinde ayn yerdir.


Memory birletirme biimi tanmlanm olsa da tamamen public gibi bir anlama
gelmektedir.
At birletirme biiminden sonra bir bellek paragraf adresi verilir. Bylece linker
segmenti o paragraftan itibaren yerletirir(Aslnda linker at birletirme biimine sahip
segmentleri bellee yerletirmez. Programc yalnzca orada tanmlanan sembolleri kullanarak
bu ilemden fayda salar). rnein:
Myseg segment at 0B800h
X
db
?

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

Myseg segment para public CODE


....
Myseg ends

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

Y1 segment public DATA


Y1 ends

Z2 segment public DATA


Z2 ends

Z1 segment public CODE


Z1 ends

Z3 segment public CODE


Z3 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

Tiny modeldeki segment tanmlama biimleri srasyla yledir:


- _TEXT segment
byte public CODE
- _DATA segment
word public DATA
- _BSS
segment
word public DATA
- _TEXT segment
byte public CODE
- _DATA segment
word public DATA
- _BSS
segment
word public DATA
- _STACK segment
word stack STACK
- filename_TEXT segment
byte public CODE
- _DATA segment
word public DATA
- _BSS
segment
word public DATA
- _STACK segment
word stack STACK
- _TEXT segment
byte public CODE
- _DATA segment
word public DATA
- _BSS
segment
word public DATA
- _STACK segment
word stack STACK
- filename_TEXT segment
byte public CODE
- _DATA segment
word public DATA
- _BSS
segment
word public DATA
- _STACK segment
word stack STACK
- filename_TEXT segment
byte public CODE
- filename_DATA segment
word public FAR_DATA
- filename_BSS
segment
word public FAR_DATA
- _STACK segment
word stack STACK
Segment Kavramnn nemi

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

mov ax, _DATA


mov ds, ax

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

Ayrntl segment tanmlamalaryla oluturulmu rnek iskelet program yle olabilir:

/*****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

Birden Fazla Kod Segmenti ile almak


Programn kodu 64Kb geecekse birden fazla kod segmenti tanmlamak gerekebilir.
Bu durumda baz fonksiyonlar bir kod segmentte, bazlar dier kod segmentte olabilir. baka
bir kod segmentteki fonksiyonu arabilmek iin far call yapmak gerekir. Ayn segment
ierisindeki bir fonksiyonu near call ile arabiliriz. Ancak bir fonksiyonun hangi
segmentten arlacan bilemiyorsak ya da bir fonksiyon hem kendi segmentinden hem de
dardaki bir segmentten arlacaksa fonksiyonu retf ile bitirmek gerekir. Bu durumda ayn
segmentte bile olsak arma ilemini far call ile yapmak zorunda kalrz. Sonu olarak
birden fazla kod segmenti ile alldnda en pratik yntem btn fonksiyonlar retf ile
bitirmek fonksiyon hangi segmentten arlrsa arlsn far call ilemi yapmaktr.
Derleyicilerin bazlar birden fazla kod segmenti ile alrken ayn segment ierisinde
armalar
push cs
call near func

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

Win32/UNIX Flat Modellerde Segment lemleri


Win32 flat modelde btn segment deerleri 0 adresini gstermektedir. Bellein her
yerine yalnzca offset bilgisiyle eriilebilir. Bu durumda segment kavramnn bir nemi
kalmamaktadr. rnein bir fonksiyon baka bir kod segmentte olsa bile biz o fonksiyonu
near call ilemiyle arabiliriz(32 bit modda near call 4 bytelk bir hedef adres almaktadr).
Flat modelde birden fazla data segment kullanlmasnn da nemli bir anlam yoktur. nk
sembol hangi data segmentte olursa olsun ona 4 bytelk bir offset ile eriebiliriz. Yine de bu
sistemlerde segment tanmlamalar kullanlmaktadr. Bu tanmlamalar ile belirli program
blmlerinin exe dosya ierisinde sralamas belirlenebilir. Win32de segmentler section
olarak deerlendirilir. Bir section n sayfadan oluur(Bir sayfa 4 Kbtr). Her section bir
zellikle belirtilebilir. rnein bir section read-only yaplabilir. Byle bir section ierisindeki
bir blgeye yazma yaplamaz. Win32 ve UNIX sistemlerinde bir segment 64Kb geebilir.
Bir segmentin 64Kb geip geemeyecei use16 ya da use32 bildirimleriyle belirlenir.
rnein:
_TEXT segment para public use32 CODE
....
_TEXT ends

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

group segment_ismi, segment_ismi2, ..

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

Nihai durumda segment dizilimleri aadaki gibi olsun:


_BSS
_PROCESS
_NUMERIC
_DATA

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. kinci modlde ise


MYGROUP group _BSS

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

Buradaki number1 ve number3 farkl segmentlerde tanmlanm sembollerdir. Normal olarak


bunlarn kullanlabilmesi iin ds registernn deitirilmesi gerekir:
mov
mov
mov
mov
mov
mov

ax, _DATA
ds, ax
ax, number1
ax, _BSS
ds, ax
ax, number3

Bu segmentler ok kk olduklarna gre bir grup oluturabilir. Bu durumda ds registern


bu grubun balang adresiyle yklersek btn sembollere yalnzca offset bilgisiyle
eriebiliriz.

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

segreg:orijin, segreg:orijin, segreg:orijin

rnein:
assume

cs:_TEXT, ds:DGROUP, ss:_STACK

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);
}
}

void DispRec(BYTE recType)


{
int i;
for(i = 0; objRec[i].recName != NULL; ++i) {
if(objRec[i].recType == recType) {

149

printf("%02x\t%s\n", recType, objRec[i].recName);


return;
}
}
printf("%02x\t%s\n", recType, "Unknown Record");
}
void main(int argc, char *argv[])
{
FILE *f;
BYTE recType;
WORD length;
CheckArg(argc);
if((f = fopen(argv[1], "rb")) == NULL) {
fprintf(stderr, "Cannot open file!..", argv[1]);
exit(1);
}
while(fread(&recType, 1, 1, f) > 0) {
DispRec(recType);
fread(&length, sizeof(WORD), 1, f);
fseek(f, length, SEEK_CUR);
}
fclose(f);
}
/*------------------------------------------------*/

Data ve Kod Sembollerinin obj Dosyaya Yazlmas


Bir sembol kullanldnda derleyici o sembol yerine [ ] ierisinde bir offset deeri
geldiini dnr. Bu offset deerini de assume bildirimine gre belirler. Ancak bu offset
bilgisi o modle ilikin greli bir deerdir. nk linker ayn isimli public birletirme
biimine sahip segmentleri birletirdiinde bu offset deerlerini de yeniden dzenlemek
zorunda kalr. rnein: iki modle sahip bir program yazacak olalm. ki modlde de _DATA
isimli public birletirme biimine sahip segment olsun.
M1.asm
_DATA segment para public DATA
db
100
dup(0)
_DATA ends

M2.asm
_DATA segment para public DATA
X1
db
10
X2
db
20
_DATA ends

Burada X1 offseti m2.asm ierisinde 0 deerine ilikin olduu halde


tlink m1 m2
ilemiyle link edilme sonucunda segmentlerin birletirilmesi sonucunda 100 deerine ilikin
olacaktr. imdi bu semboller m2.asm ierisinde yle kullanlm olsun:
_TEXT segment para public CODE
.....
Mov
al, X1
A0 0000
Mov
al, X2
A0 0100

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

PARA PUBLIC Class 'CODE'

00008E COMENT Purge: Yes, List: No , Class: 162 (0A2h)


Linker - Pass Two Marker.
000095 LEDATA Segment: _DATA
Offset: 0000 Length: 0002
0000: 64 C8
d.
00009E LEDATA Segment: _TEXT
Offset: 0000 Length: 0007
0000: A0 00 00 8A 1E 01 00
.......
0000AC FIXUPP
FixUp: 001 Mode: Seg Loc: Offset16 Frame: TARGET Target: SI[1]
FixUp: 005 Mode: Seg Loc: Offset16 Frame: TARGET Target: SI[1]
0000B8 MODEND

/*****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

10, 20, 30, 40, 100 dup (0)

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

byte 0 biiminde gzkecektir. nk mz format ykleyici tarafndan blok olarak


yklenmektedir.
Basitletirilmi Segment Kullanmnda Segment lemleri
Basitletirilmi segment tanmlamalarnda aslnda yine segment tanmlamas
yaplmaktadr. nk omf format segment tanmlamalarn iermek zorundadr.
Basitletirilmi segment tanmlamalarnda nce .model direktifiyle bir bellek modeli
belirlenir. Bundan sonra .CODE, .DATA, .STACK belirlemeleri yaplnda derleyici belirli
segmentlerin tanmlanm olduunu varsayar. Ayrca basitletirilmi segment
tanmlamalarnda DGROUP isimli bir grup da tanmlanmaktadr. Otomatik tanmlanan bu
segment ve gruplarn zellikleri dokman halinde datlmtr.
Relocatable Adresler
Program ierisinde kullandmz offset deerleri yani DATA ve CODE sembolleri
derleyici tarafndan greli bir biimde obj dosyasna linker tarafndan ise nihai olarak exe
dosyaya yazlr. Offset bilgisi programn yklenme adresiyle deiebilecek bir bilgi deildir.
nk segment bellein neresine yklenmi olursa olsun segment register o segmentin
balang adresiyle yklendiinde offsetler doru yerleri gsterirler. Yani offset deerleri
fiziksel RAMde bir adres belirtmezler. Yer aldklar segmente ilikin greli bir adres
belirtirler. Programn ierisinde kullanlan segment ve grup isimleri 2 byte uzunluunda bir
sabit biiminde koda yansr. Bu segment isimleri ilgili segmentlerin fiziksel RAMdeki
paragraf adreslerini belirtmektedir. Segmentlerin paragraf adresleri ancak programn bo olan
RAM blgesine yklenmesiyle kesinlik kazanr. Bu durumda makine komutunun segment
paragraf adresi ieren ksmlar exe dosyas ierisinde nasl olacaktr? te linker bu adresleri
sanki program bellein tepesinden itibaren yklenecekmi gibi oluturur. Baka bir deyile
buradaki paragraf adresleri exe dosyann bandan itibaren greli bir adres belirtirler. Linker
exe dosyann balk ksm ierisinde ismine relocation tablosu denilen bir tablo oluturur. Bu
tabloda btn segment ve grup adresi ieren makine komutlarnda bu adreslerin exe dosyann
neresinde olduu bilgisi vardr. Ykleyici program bellekte bo bulduu alana ykler. Sonra
relocation tablosuna bavurur. Segment ve grup adreslerinin kullanld yerleri tespit eder.
Bu adreslere programn ykleme adresini ekler. Bylece artk btn makine komutlar
programn yklenme yerine bal olan fiziksel RAM deerlerini alm olur. Relocatable adres
kavram pek ok iletim sistemi iin sz konusu bir kavramdr. Konunun zeti udur:
1. alabilen kod ierisindeki baz adresler grelidir. Bazlar fiziksel RAMde adres
belirtir. Fiziksel adreslere relocatable adresler denir.
2. Greli adresler(Intel sisteminde offset adresleri) program RAMde nereye yklenirse
yklensin problem oluturmazlar. Halbuki relocatable adresler programn yklenme
yerine gre deitirilmesi gereken adreslerdir(Intel sisteminde segment ve grup adresleri).
3. Linker relocatable adreslerin kesin deerlerini bilemez. Ancak programn RAMin
tepesine yklenecei varsaymyla bunlarn greli deerlerini bilebilir.
4. Program ierisinde relocatable adreslerin kullanld blgeler alabilen kod zerinde bir
tablo ierisinde belirlenir.
5. Ykleyici program bellein bo blgesine ykler. Relocatable adres tablosuna bakarak
gerek deerlerini hesaplayp yerletirir.

153

Relocatable Adresler ve Relocation Tablosu


Bilindii gibi .EXE dosya bir balk ksmyla balamaktadr. Balk ksmnn sonunda
relocation tablosu bulunur. Ykleyici tm balk ksmn atarak program yklemektedir. EXE
dosya balk ksmnn [06 - 07] offset'lerinde bulunan WORD deeri, relocation tablosu
ierisindeki elemanlarn saysn belirtir. Relocation tablosunun yeri EXE balnn [18
19] ksmndan ekilen WORD deerde sakldr. Relocation tablosunun balang yeri .EXE
dosyasnn bandan itibaren bir offset belirtir. Relocation tablosunda her eleman iin 4 byte
yer ayrlr. Bilindii gibi .EXE dosyann balk ksmnn uzunluu balk ksmnn [08 - 09]
offset'lerinden ekilen WORD deerle tespit edilebilmektedir. Burada balk ksmnn
paragraf uzunluu verilmitir. Yani bu deeri 16 ile arpmak gerekir. Her relocation eleman
4 byte'tr. bu 4 byte'n dk anlaml WORD'u offset, yksek anlaml WORD'u segment
olarak deerlendirilir. Yani yksek anlaml WORD 16 ile arplr, dk anlaml WORD ile
toplanr. Bu deer .EXE bal atlmken ki durumda bir offset belirtmektedir. Bu offset
relocatable bilginin bulunduu yerdir.
zetle ykleyici relocatable adresleri yle dntrr:
1. Ykleyici .EXE dosyann balk ksmn atar. Geri kalan ksm bellekte bo olan
blgeye yklenir.
2. EXE dosyann balk ksmndan relocation tablosunun yeri ve eleman says tespit
edilir.
3. Her relocation eleman iin u ilemler yaplr: Relocation elemannn yksek anlaml
WORD'u 16 ile arplp, dk anlaml WORD'u ile toplanr. Bellekte ykl olan EXE
dosyann bu offset'ine eriilir. Bu offset'te bulunan WORD deere programn
yklenme paragraf adresi toplanr.
4. Programn balang register deerleri .EXE balk dosyasna baklarak verilir.
5. Kontrol CS : IP 'nin belirtildii adrese braklr.
COM Dosyalar
64K'y geemeyen ve bir balk ksm olmayan, bu nedenle ok kolay yklenebilen
dosyalara COM dosyalar denir. Bir COM program ykleyici tarafndan yle yklenir:
1. Ykleyici COM program iin DOS dzeyinde 64K'lk bir alan tahsis eder. 100H
uzunluunda PSP blgesini oluturur. COM program 100H 'tan itibaren bellee
yerletirir.
2. Btn segment register'lar PSP paragraf adresine eitler. IP register'n 100H deerine
eker. Dier tm register'lar sfrlar.
3. Programn akn CS : IP 'ye brakr.
COM program balk ksmna sahip deildir. Bu nedenle balk ksm oluumuna yol
aacak ilemler program ierisinde yaplamaz. Bir COM programda u zelliklerin bulunmas
zorunludur:
1. Program ierisinde relocatable bir adres kullanlamaz. Yani segment ve grup isimleri
kullanlamaz. Bu durum programn segment'siz yazlaca anlamna gelmez. Yalnzca
segment isimleri kullanlamaz. rnein aadaki gibi bir makine komutunu yazamayz:
mov
ax, _DATA
mov
ds, ax

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.

COM Programlarn Yazm


COM programlar tek segment'li ya da ok segment'li yazlabilir. Ancak yukarda
yazlan genel kurallara uyulmak zorundadr.

Tek Segmentli COM Programlarnn Yazlmas


Tek segment'li COM programlarnda yalnzca code segment tanmlanr. Segment'in
yer sayac 100H deerine ekilir. Programn data'lar segment'in code ksmndan sonraya
yerletirilebilir. Ancak en ok uygulanan yntem segment'in bana bir jmp komutu koymak
ve data'lar hemen jmp komutunun altna yerletirmek biimidir. Bu biimdeki tipik bir COM
programnn kalb yledir:
_TEXT segment para public 'CODE'
assume cs:_TEXT, ds:_TEXT, ss:_TEXT, es:_TEXT
org
100h
main proc near
jmp
@1
x1
db
0
x2
db
0
@1: .....
.....

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

Tiny Model Programlar ve COM Dosyalar


Tiny modelde bir C program yazldnda programn stack segmenti yoktur. btn
segmentler bir grup ierisindedir. Programn balang IP deeri de 100htr. Tiny model exe
programlar bu genel yapsndan dolay exe2bin yardmc programyla com formatna
dntrlebilmektedir.
COM Programlarnn nemi
Com programlar bir balk ksmna sahip olmadklar iin kolaylkla bellee
yklenerek altrlabilirler. Com programlar saf makine dilinden olumaktadr. Bu nedenle
saf makine dili gereksinimi olan pek ok alanda kullanlabilir.
COM Programnn Kullanlmasna Tipik Bir rnek: Boot programnn yazlmas
Bilindii gibi bilgisayar aldnda alma CS:FFFF IP:0000 adresinden balar. Intel
ilemcikleri reset edildiinde gerek moddan almaya balar. Yani 1Mb bellekten fazlasn
gremez. Bu durumda reset ilemiyle birlikte ilk alacak komut FFFF0 adresindeki
komuttur. Buras son 64Kb ierisindeki EPROM blmdr.

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

void main(int argc, char *argv[])


{
FILE *f;
char buf[SECTSIZE];
int i, result;
if (argc != 2)
{
fprintf(stderr, "Wrong number of arguments..\n");
exit(1);
}
if ((f = fopen(argv[1], "rb")) == NULL)
{
fprintf(stderr, "Cannot open file %s\n", argv[1]);
exit(1);
}
fread(buf, 1, SECTSIZE, f);
for (i = 0; i < TRYNUM; ++i)
{
result = biosdisk(3, 0, 0, 0, 1, 1, buf);
if (!result)
break;
}
if (result)
{
fprintf(stderr, "Cannot locate boot file..\n");
exit(1);
}
printf("Boot sector successfuly loaded");
}

/*****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

_TEXT segment para public CODE


entry:
call _main
INFINITE:
jmp INFINITE
_TEXT ends
end entry

2. Standart C fonksiyonlarnn pek ou da iletim sistemine baml olacak ekilde


tasarlanmtr. rein malloc, printf fonksiyonlar DOS derleyicilerinde hep int 21h
kesmesini arr. ou kez string.h ierisindeki fonksiyonlar rahatlkla kullanlabilir.
Yani standart C fonksiyonlarn kullanrken bu fonksiyonlarn iletim sistemine baml
olup olmad test edilir.
3. Derleyicinin nihai kts com ya da exe dosyalardr. Com ya da relocation tablosu 0 olan
exe programlar tercih edilebilir.

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

Data sembolleri iin:


extrn sembol:

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

2) near code sembolleri hangi segment ierisinde kullanlacaksa o segment ierisinde


extrn bildirimi yaplmaldr. rnein

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

Grld gibi main fonksiyonunun aranmas startup modul ierisinde arlmasndan


kaynaklanmaktadr. Bu durumda C programnda main olmamasndan dolay oluacak hata
link aamasnda linker'n dier modllerde _main semboln pubdef record ierisinde
bulamamasndan dolay ortaya kacaktr.
Communal Tanmlama
Bir sembol hem public hem de extern olarak bildirilirse public bildirim yapld kabul
edilir. comm bildirimi ile bir sembol belirtildiinde o sembol iin derleme aamasnda yer
ayrlmaz. Yer link aamasnda yakn modellerde C_COMMON, uzak modellerde FAR_BSS
isimli segment ierisinde ayrlr. Bu segment'i linker oluturmaktadr ve DGROUP isimli
gruba dahil etmektedir. COM bildiriminin genel biimi yledir:
comm sembol:uzunluk:miktar

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
.....

para public 'DATA'

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]

ilemi aslnda ss: neki ile onu izleyen


mov

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]

biiminde girilmesine izin vermez.


ss:
mov

ax, [bx]

biiminde girilmesine izin verir.

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

ax, seg block


es, ax
di, block
al, 0
cx, 100
stosb

Small model memset rnei:


void *memset(void *block, char ch, unsigned n);
_memset proc near
push
bp
mov
push
di
mov
mov
mov
mov
mov
cld
rep
stosb
mov
pop
pop
ret
_memset endp

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
}

REP MOVS ilemi de yledir:


while (CX > 0) {
movs
--cx;
}

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

Bo Bal Liste Algoritmas


Bu yntemde bir tahsisat yapldnda malloc fonksiyonu istenen alan kadar byten
yan sra o bloun bilgileri ieren n kadar byte daha tahsis eder. Blok bilgileri en azndan
tahsis edilen bloun uzunluu ve sonraki bo bloun adresini iermelidir.

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.

Bu algoritmada iki blok sz konusudur. Birincisi bo blok(bu blok bal listenin


ierisindedir), ikincisi kullanmda olan blok. Kullanmda olan blok iin pFreeNext gibi bir
gstericiye gerek yoktur.

Peki heap blgesinin balang durumu nasldr? Balangta bo bal listede bir tane eleman
vardr. O da tm heap blgesini kapsar.

169

Bu heap algoritmasn gerekletirirken oluacak problemli durumlar unlardr:


1. Tahsisat yaparken byk bir bo blok ierisinde kk bir blok ekilip alnacaksa (byk
blok kk blok) kadar alan bo bal listeye yazlmaldr.
2. Bo bal listedeki bloklar ne kadar byk olursa o kadar iyidir. Bu yzden free ilemi
srasnda boaltlan alan bo bir bloun altndaysa byk ve tek bir blok halinde yeni bir
blok oluturulmaldr.
3. Minimum bir bo blok uzunluu seilebilir. Bylece bal listede ok kk bloklar
tutulmaz. Ancak bu tasarm bellek verimini drebilir. ,
4. realloc fonksiyonu eski bloun altnda bo alan bulmak iin aratrma yapmaldr.
TINUX Sisteminde Heap Organizasyonu
Birden fazla heap kullanmann bellek blnmesi bakmndan yararlar vardr. rnein
Win32 sistemlerinde programc birden fazla heap kullanabilmektedir. TINUX sisteminde de
sistemin kendi modllerinin ayr birer heap alan olmal ve ayn zamanda programc kendisi
birden fazla heap blgesi yaratabilmelidir. TINUX, UNIX sistemlerini desteklediine gre
klasik olarak processin tek bir heapi olmaldr. Ancak bu sistem hem POSIX standartlarna
destek verecek hem de kendine zg API fonksiyonlar olacaktr. Bu durumda bir process
ierisinde birden fazla heap yaratlabilecek ancak heaplerden birisi process altrlmaya
balaynca yaratlacak. Bu heap processin default heapi olacak. POSIX standardndaki
dinamik bellek fonksiyonlar bu processin default heapini kullanacaktr. TINUX sistemi
aa seviyeli heap API fonksiyonlar unlardr:
HHEAP CreateHeap(DWORD dwHeapSize, DWORD dwProtect);
PVOID AllocMem(HHEAP hHeap, DWORD dwSize);
VOID FreeMem(HHEAP hHeap, PVOID pBlock);
PVOID ReallocMem(HHEAP hHeap, PVOID pBlock, DWORD dwNewSize);
BOOL ReleaseHeap(HHEAP hHeap);
HHEAP GetProcessHeap(VOID);

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

Buradaki fonksiyonlar sistem fonksiyonlar grubundadr. Halbuki iletim sisteminin kendi


modlleri ierisindeki heap yaratlmas iin kk baz ekler yapmak gerekir. CreateHeap
fonksiyonuyla verilen handle hangi alanda olmaldr? Processin alannda olmamaldr. Bunun
iki nedeni vardr:
1. Sistemin gvenlii
2. Processin default heapi ierisinde bu bilgi tutulabilir ki bu da default heape nemli bir
ayrcalk kazandrr.
Genel olarak bir sistem fonksiyonunun verdii handle kernel modlnn heap blgesi
ierisinde olmaldr. Kernel modlnn heap blgesi iin ayr fonksiyonlar tasarlanabilir. Bu
fonksiyonlara handle geirilmesine gerek yoktur. Kernel heap bilgileri(heap blgesinin
balangc, uzunluu, bo bal listenin head gstericisi gibi) kernel modl ierisinde bilinen
bir yerde tutulur ve aadaki fonksiyonlarla idare edilebilir:
PVOID allocKernelMem(DWORD dwSize);
VOID freeKernelMem(PVOID pBlock);
PVOID reallocKernelMem(PVOID pBlock, DWORD dwNewSize);

Kernel Heap Fonksiyonlarnn Tasarm iin Yaplacak lemler


Kernel heap bilgileri iin aadaki global deikenler alnr:
PVOID g_pKernelHeap;
DWORD g_kernelHeapSize;
HEAPLIST *g_pHead;
HEAPLIST *g_pTail;
DWORD g_listSize;
typedef struct _HEAPLIST {
struct _HEAPLIST *pNext;
DWORD blockSize;
BYTE pBlock[MINSIZE];
}HEAPLIST, *pHEAPLIST;

Heap sistemini tasarlayacak grup iin anahtar notlar:


-

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

ilemini yapmaktadr. Komutun almas yledir:


SCASB
CMP

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;

Grld gibi bu komut AL ya da AX register'yla yalnzca ES:DI adresindeki bilgiyi


karlatrr. lemin yinelemeli olarak devam edebilmesi iin bana REP komutunun
getirilmesi gerekir. Aslnda REP komutu bir deil iki tanedir. imdiye kadar kullandmz
REP komutu ayn zamanda REPE ya da REPZ olarak da bilinir. Bunun dnda bir de REPNE
/ REPNZ komutu vardr. REPNE ve REPNZ ayn komuttur.
1) REP REPE = REPZ
2) REPNE = REPNZ
REPNE = REPNZ dier string komutlaryla kullanlmaz. Yalnzca SCAS komutuyla birlikte
kullanlr.
Bu durumda ;
REPE SCAS ilemi bir bloktaki ilk eit olmayan bilgiyi bulmak iin,
REPNE

SCAS ilemiyse bir bloktaki ilk eit bilgiyi bulmak iin kullanlr.

REPNE

SCAS ilemi daha sk kullanlmaktadr.

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*/

Makine dilindeki karl

void *mymemchr(void *pBlock, char ch, unsigned n)


{
char S[] = "Bu bir denemedir.";
char *p;

model small
.code
_mymemchr proc near

p = (char*) mymemchr(s, 'i', strlern(s))


if(p == null) {
printf("Bulunamad!..\n");
else
printf("Bulundu!..\n");
}
}

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

al, [bp +6]


cx, [bp + 8]
SCASB
FOUND

ax, ax
PROC_END

di
ax, di
di
bp

rnek Thread Ktphanesi:


Klasik DOS sistemi thread'li almaya olanak vermez. Ancak WIN32 sistemleri thread'lerle
almay desteklemektedir. Klasik UNIX sistemlerinde de thread'li alma yoktur. Ancak
LINUX sistemlerinde buradaki rnekte olduu gibi bir thread ktphanesi eliinde
thread'lerle alma salanabilmektedir. Buradaki rnek ktphane DOS'ta thread'lerle
almay olas duruma getirmek amacyla tasarlanmtr. Buradaki kodlar tipik bir preemtif
(letin sistemi tarafnda kesilen) iletim sisteminde thread'ler ya da prosesler arasndaki gei
mekanizmasnn nasl yapldn da aklamaktadr. Bu ktphanedeki fonksiyonlarn
isimlendirilmesi ve ilevleri WIN32 sistemlerine benzetilmitir. Kodlama iinde kullanlan
isimlendirme kurallar gevetilmi Macar notasyonudur. Buna ek olarak aadaki zelliklere
dikkat edilmitir.
1) Btn global deikenler 'g_' ile balatlmtr.
2) Darya kapal fonksiyonlar, yani API olmayan fonksiyonlarn ilk szckleri kk harfle
balatlmtr. rnein; addItem() gibi.
3) Sembolik makine dilinde yazlm kodlarn sonuna _ASM eklenmitir.
4) Baka modlden kullanlacak fonksiyonun bana PUBLIC,
fonksiyonlarn nne PRIVATE sembolik sabitleri getirilmitir.

kullanlmayacak

Thread Ktphanesinin kullanm:


InitThreadLib() fonksiyonu:
Bu fonksiyon thread ktphanesini initialize eder. Bu yzden programn banda bir kez
arlmaldr.
Prototipi:
BOOL InitThreadLib(void);

CreateThread() Fonksiyonu:
Bu fonksiyon thread akn yaratr.
Prototipi:
int CreateThread(THRPROC pThrProc, PVOID pParam, WORD stackSize);

Fonksiyonun birinci parametresi thread aknn balatlaca fonksiyonun balang adresidir.


Thread fonksiyonunun prototipi aadaki gibi olmak zorundadr:
int ThreadProc(PVOID pParam);

Fonksiyonun ikinci parametresi thread fonksiyonu almaya baladnda geirilecek


parametredir.

174

Fonksiyonun nc parametresi yaratlacak thread'in stack uzunluudur.


Fonksiyon baarlysa thread'in handle deerine, baarszsa -1 deerine geri dner. Bu deer
THREAD_ERROR sembolik sabiti biiminde tanmlanmtr.
ExitThread() Fonksiyonu:
Bu fonksiyon o anda almakta olan thread'i sonlandrmak amacyla kullanlr. Eer
ExitThread() arlmazsa thread, thread fonksiyonunun sonunda sonlandrlr.
BOOL ExitThread(int exitCode);

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);

Fonksiyonun parametresi thread'in ID deeridir. Geri dn deeri ilemin baars ya da


baarszln belirtir.(BOOL)
EndThreadLib() Fonksiyonu:
Bu fonksiyon thread ktphanesini kapatr. En sonunda bir kez arlmaldr.
void EndThreadLib(void);

Thread Ktphanesinin Kullanlmasnda Dikkat Edilmesi Gereken Noktalar:


DOS'un tasarm multithread bir alma dnlmeden yaplmtr. DOS'un sistem
fonksiyonlarnn ou SS:SP register'larn belirli bir deere ekip stack deitirirler. Bu
durumda thread'lerden birisi DOS fonksiyonunu arrken dieri de arrsa ncekinin stack
datalarn ezer ve problem ortaya kar. Ayn problem DOS'ta memory resident program
yazarken de ortaya kmaktadr. Ayrca DOS'ta kullandmz standart C ktphanesi de
oklu thread yapsn desteklememektedir. nk baz fonksiyonlar statik data
kullanmaktadr. zetle u noktalara dikkat edilmelidir:
1) zellikle stdio.h iinde olan fonksiyonlar bir thread'te kullanlyorsa dier thread'lerde
kullanlmamaldr.

175

2) Dier standart C fonksiyonlar oklu thread'e uygun olup olmad deerlendirildikten


sonra kullanlmaldr.
Aslnda DOS iin tamamen oklu thread'i destekleyen bir C ktphanesi de yazlabilir.
Thread Ktphanesinin sel Tasarm:
izelgeleme algoritmas olarak kullanlan dngsel izelgelemede (Round Robin
Scheduling) herhangi bir ncelik derecesi kullanlmamtr. Ancak algoritma ncelik
derecelendirmesini destekleyecek biimde deitirilebilir.
Her threadin bilgilerinin sakland yapya thread database denir. Thread database
aadaki gibi bir yapdr:
typedef struct _THRDB {
WORD r_sp, r_ss;
....
....
WORD stackSize;
void *pStack;
void *pParam;
int exitCode;
int status;
int next;
int prev;
}THRDB;

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;

Ktphanedeki getFreeItem, addItem ve deleteItem fonksiyonlar kuyruk ilemlerini yapmak


iin tasarlanmtr. nextThr fonksiyonu yalnzca g_curThr ve g_pCurThr global

176

deikenlerinin sonraki thread bilgilerini gstermesini salamaktadr. InitThreadLib


fonksiyonu ana thread olarak sfrnc slotu kuyrua ekler. Ayrca kuyrukta bulunan
threadlerin says g_itemCount global deikeninde de tutulmaktadr.
Ktphanede registerlara dorudan erimesi gereken kodlar sembolik makine dilinde
yazlmtr. rnein cswitch_asm isimli fonksiyon o anda almakta olan threadin bilgilerini
geri yazarak yeni threadin bilgilerini registerlara ykler. InitThreadLib fonksiyonu
ierisinde INT 8 vektr hook edilmitir. Artk her INT 8 olutuunda cswitch_asm
fonksiyonu altrlacaktr. cswitch_asm fonksiyonu altrlacaktr.
Cde Inline Sembolik Makine Dili
C derleyicilerinin ou C ierisinde sembolik makine dili yazmn desteklemektedir.
Ancak tabii yalnzca makine komutlar bu biimde yazlabilir. Sembolik makine diline zg
anahtar szckler yazlamaz. Bunun iin Borland derleyicilerinde asm, Microsoft
derleyicilerinde _asm anahtar szckleri kullanlr. Makine komutu bir satra gelecek ekilde
bu anahtar szcklerden sonra yazlr. rnein:
asm

MOV

ax, bx

Birden fazla asm komutu blok ierisine alnabilir.


asm {
MOV
PUSH

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

DOS Sisteminde Heap Ynetimi


DOSta bir program altrldnda DOS botaki tm bellei process iin tahsis eder.
rnein exe dosya 50Kb olsa, 250Kb bo bellek olsa process iin 50Kb deil, 250Kbn
tamam tahsis edilecektir. te heap organizasyonu derleyicinin balang kodu tarafndan
process dzeyinde yaplan bir ilemdir. DOSun heap retimine ilikin bir sistem fonksiyonu
yoktur. Heap ynetimi tamamen processin kendisinin yapt bir dzenlemedir. Genellikle
derleyiciler tarafndan yaplr. Derleyicilerin balang kodlar ierisinde stack birletirme
biimine ilikin 256 byte uzunluundan bir segment tanmlanmtr. Ancak bu segment
balang modl tarafndan dikkate alnmaz. Derleyicilerin balang kodu main fonksiyonu
arlmadan nce SS ve SP registerlarn, segment registerlar ayarlar ve heap alann
dzenler. Bellek modellerine gre heap durumu yledir:
Tiny Model

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

You might also like