You are on page 1of 177

1

NEDEN SEMBOLK MAKNA DL RENLMELDR? .............................. 7 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 MKROLEMCLERN ALIMA BMLER ........................................................... 7 TPK BR RAMN YAPISI ................................................................................... 8 CPU LE RAM ARASINDAK BALANTI ............................................................... 8 MAKNA KOMUTU KAVRAMI ............................................................................... 9 MAKNA KOMUTLARININ GENEL BM .............................................................. 9 80X86 MKROLEMCSNN ALIMA MODLARI ................................................ 10 8086 LEMCSNN YAZMA YAPISI .................................................................. 10 80386 VE YUKARI MODELLERN REGSTER YAPISI ............................................. 12

MAKNE KOMUTLARINDAK BELLEK OPERANDLARI............................ 13 2.1 16 BT ALIMADA BELLEK OPERANDININ OLUTURULMASI ............................. 14 2.2 16 BT ADRESLEME LEM ................................................................................ 16 2.3 32 BT ADRESLEME LEM ................................................................................ 17 2.4 32 BT BELLEK OPERANDININ OLUTURULMASI................................................. 17 2.5 16 BT ALIMADA FLAG REGSTERI ................................................................ 18 2.6 TURBO DEBUGGER ............................................................................................ 20 2.7 CS VE IP REGSTERLARININ NEM .................................................................. 20 2.8 MAKNE KOMUTLARININ NCELENMES.............................................................. 20 2.8.1 MOV Komutu ............................................................................................ 21 2.8.2 ADD Komutu ............................................................................................ 21 2.8.3 ADC Komutu ............................................................................................ 22 2.9 KOMUTLARIN OPERAND UYUMU ....................................................................... 22 2.9.1 SUB Komutu ............................................................................................. 24 2.9.2 CMP Komutu ............................................................................................ 25 2.9.3 SBB Komutu (Subtract with Barrow)......................................................... 25 2.9.4 MUL Komutu ............................................................................................ 26 2.9.5 DIV Komutu.............................................................................................. 27 2.10 BT DZEYNDE LEM YAPAN KOMUTLAR ........................................................ 28 2.10.1 AND Komutu ............................................................................................ 28 2.10.2 TEST Komutu ........................................................................................... 28 2.10.3 OR Komutu ............................................................................................... 29 2.10.4 XOR Komutu............................................................................................. 29 2.10.5 SHL ve SHR Komutlar ............................................................................. 30 2.10.6 SAR ve SAL Komutlar .............................................................................. 30 2.10.7 Dndrme Komutlar ................................................................................ 30 2.10.8 teleme Ve Dndrme Komutlarnn Biimleri ......................................... 31 2.10.9 Stack Kullanm ........................................................................................ 31 2.10.10 POP Komutu ......................................................................................... 32 2.10.11 Stack Kullanmnn Amac ..................................................................... 33 2.10.12 PUSHA ve POPA Komutlar ................................................................. 34 2.10.13 INC ve DEC Komutlar ......................................................................... 34 2.10.14 XCHG Komutu ...................................................................................... 34 2.10.15 CBW(convert byte to word) ve CWD(convert word to double word) Komutlar 35 2.11 DALLANMA KOMUTLARI ................................................................................... 35 2.11.1 Yer Deitirme(displacement) Kavram .................................................... 36 2.11.2 JMP 1000 ................................................................................................. 36 2.11.3 Koulsuz JMP Komutu .............................................................................. 36 2.11.4 JMP far [SI] ............................................................................................. 37 2.11.5 Koullu Dallanma Komutlar .................................................................... 38 i

2.12 ETLK KARILATIRMASI ................................................................................ 38 2.12.1 Eitsizlik Karlatrmas .......................................................................... 38 2.12.2 aretsiz Saylarn Karlatrlmas .......................................................... 39 2.12.3 aretli Saylarn Karlatrlmas ............................................................ 39 2.12.4 Dier Koullu JMP Komutlar .................................................................. 40 2.13 ALT PROGRAMLARIN AIRILMASI.................................................................... 40 2.14 ALT PROGRAMDAN GERYE DN ................................................................... 42 2.15 BAYRAKLAR ZERNDE ZEL LEM YAPAN KOMUTLAR ................................... 43 2.16 SEMBOLK MAKNE DL NEDR? ....................................................................... 43 2.17 EXE DOSYANIN YAPISI VE YKLENMES ............................................................ 43 2.18 TPK BR SEMBOLK MAKNE DL PROGRAMI ................................................... 44 2.19 CODE, DATA VE STACK BLMLERNN BELRLENMES ..................................... 45 2.20 SEMBOLLER ...................................................................................................... 45 2.21 DATA SEMBOLLERNN TANIMLANMASI ............................................................. 46 2.22 PROGRAM YKLENDNDE REGSTERLARIN DURUMLARI................................. 47 2.23 PROGRAMIN SONLANDIRILMASI ......................................................................... 48 2.24 CODE SEMBOLLER ............................................................................................ 48 2.25 PROC BLDRM ................................................................................................. 48 2.26 GEREK VE SAHTE KODLAR(REAL/PSEUDO) ....................................................... 49 2.27 SABTLER .......................................................................................................... 49 2.28 SABTLERN ETL TABANLARDA GSTERMLER ............................................ 49 2.29 ALFABETK SABTLER(STRNGLER) ................................................................... 50 2.30 GEREK SAYI SABTLER ................................................................................... 50 2.31 BCD TRDEN SABTLER.................................................................................... 50 2.32 YER SAYACI(LOCATON COUNTER) .................................................................... 51 2.33 ASM LSTNG DOSYASI ..................................................................................... 51 2.34 DZLER ZERNDE LEMLER ............................................................................ 51 2.35 LEA(LOAD EFFECTVE ADDRESS) KOMUTU ........................................................ 52 2.36 SEMBOLK MAKNE DLNDE FOR DNGLERNN OLUTURULMASI ................... 52 2.37 KOD SEMBOLLER ............................................................................................. 53 3 ALT PROGRAMLARLA ALIMA ................................................................... 54 3.1 FONKSYONLARIN GER DN DEERLERNN OLUTURULMASI....................... 59 3.2 FONKSYON AIRMALARINA LKN ETL RNEKLER ................................. 59 3.3 SEMBOLK MAKNE DLNDE YAZILAN FONKSYONLARI CDEN AIRILMASI..... 60 3.4 BRLETRME SIRASINDA IKACAK PROBLEMLER ................................................ 61 3.5 E DNGLER.............................................................................................. 62 3.6 SEMBOLK MAKNE DLNDE CDECL ARIMINA UYGUN FONKSYON YAZIMINA RNEKLER.................................................................................................................... 64 3.7 C DERLEYCLERN SEMBOLK MAKNE DL IKTILARI...................................... 67 3.8 OFFSET VE SEG OPERATRLER ...................................................................... 68 3.9 EXE DOSYA FORMATI ....................................................................................... 68 3.10 PSP(PROGRAM SEGMENT PREFX)...................................................................... 71 3.11 YKLEME SONRASINDA REGSTERLARIN LK KONUMLARI ................................ 71 3.12 DERLEYCLERN BALANGI KODLARI(STARTUP MODULE) .............................. 72 3.13 CDE CHAR PARAMETRELERN VE GER DN DEERLERNN SEYREK KULLANILMASI ............................................................................................................. 73 3.14 KESMELER(NTERRUPTS)................................................................................ 73 3.15 INT MAKNE KOMUTU VE KESMELERE DALLANILMASI...................................... 74 3.16 IRET MAKNE KOMUTU ..................................................................................... 75 3.17 KESMENN HOOK EDLMES ............................................................................... 75 3.18 KESME KODUNUN YAZILMASI ........................................................................... 76 ii

3.19 SEMBOLK MAKNE DLNDE DOLAYLI JMP VE CALL LEMLER ...................... 77 3.20 BELLEK ERMLERNDE SEGMENT YKLEME DURUMLARI ................................ 77 3.21 KESMELERN FONKSYONLARI VE ALT FONKSYONLARI ..................................... 78 3.22 KESMENN PARAMETRELER VE GER DN DEERLER ................................... 78 3.23 DOS VE BIOS KESMELER ................................................................................ 78 3.24 10H VDEO KESMES .......................................................................................... 79 3.24.1 21h Kesmesi .............................................................................................. 82 3.24.2 INT 21h F:2 .............................................................................................. 83 3.24.3 INT 21h F:7 ve F:8 ................................................................................... 83 3.24.4 INT 21h F:0Ah (buffered keyboard input) ................................................. 83 3.24.5 INT 21h F:25h(set interrupt vector) .......................................................... 84 3.24.6 INT 21h F:35h(get interrupt vector) .......................................................... 84 3.24.7 INT 21h F:39h(create sub directory)......................................................... 84 3.24.8 INT 21h F:9h ............................................................................................ 85 4 MAKRO KULLANIMI ......................................................................................... 86 4.1 4.2 5 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 5.13 5.14 5.15 5.16 5.17 5.18 5.19 5.20 5.21 5.22 5.23 INCLUDE LEM ................................................................................................ 87 LOCAL KOMUTU ............................................................................................. 89

MATEMATK LEMCNN KULLANILMASI ............................................... 90 MATEMATK LEMC NEDR? ............................................................................ 90 NORMAL LEMC LE MATEMATK LEMCNN BRLKTE ALIMASI ................. 90 MATEMATK LEMCNN REGSTER YAPISI ........................................................ 91 NOKTALI SAYILARIN BELLEKTE TUTULMA BMLER ....................................... 91 NOKTALI SAYI FORMATLARI ............................................................................. 91 YUVARLAMA HATASI(ROUNDNG ERROR) .......................................................... 92 FLOAT(SHORT REAL) FORMAT ........................................................................... 93 BIAS DEERNN ANLAMI................................................................................. 94 NOKTALI SAYI FORMATINDA ZEL SAYILARI .................................................... 94 DOUBLE(LONG REAL) FORMATI ......................................................................... 94 LONG DOUBLE(EXTENDED REAL) FORMATI ........................................................ 95 MATEMATK LEMCDE NOKTALI SAYILARLA LEMLER ................................... 95 FLD KOMUTU ................................................................................................... 96 FST VE FSTP KOMUTLARI ................................................................................ 96 TAM SAYILARA LKN PUSH VE POP KOMUTLARI .......................................... 96 FADD, FADDP KOMUTLARI ............................................................................ 97 CDE GEREK SAYI TRLERNE GER DNEN FONKSYONLARI........................... 98 FMUL VE FMULP KOMUTLARI ........................................................................ 99 FDIV VE FDIVP KOMUTLARI............................................................................ 99 FSIN, FCOS, FTAN, FSQRT KOMUTLARI ........................................................ 99 BORLAND DERLEYCLERN MATEMATK LEMC SEENEKLER.................... 100 GEREK SAYI EMLASYONU ........................................................................... 100 SEMBOLK MAKNE DLNDE GEREK SAYILARI TUTAN SEMBOLLERN TANIMLANMASI: ......................................................................................................... 100 5.24 PPELNE LEM.............................................................................................. 101 5.25 NORMAL LEMCYLE MATEMATK LEMCNN SENKRONZASYONU ................ 101 5.26 WAT KOMUTUNUN ALIMA BM: ............................................................... 102 5.27 GEREK SAYILARIN KARILATIRILMASI : ....................................................... 103 5.28 STATUS REGSTER(STATUS WORD) ................................................................... 103 5.29 FSTSW WORD PTR MEM .................................................................................. 103 5.30 FSTSW AX .................................................................................................... 104 5.31 NORMAL LEMCLERDE BAYRAK REGSTERI ZERNDE LEMLER ................. 104 iii

5.32 5.33 5.34 6

C0, C2 VE C3 STATUS REGSTER BTLERNN KARILATIRMADAK ANLAMLARI 105 PROGRAMLAMA DLLERNDEK YEREL DEKENLERN KULLANILMASI ........... 105 ETL RNEKLER ......................................................................................... 107

HZALAMA(ALGNMENT) .............................................................................. 112 6.1 WORD HZALAMASI(WORD ALGNMENT) .......................................................... 112 6.2 DWORD HZALAMASI(DWORD ALGNMENT)...................................................... 113 6.3 HZALAMA PROBLEMLER ................................................................................ 113 6.4 C++TA BR SINIFIN YE FONKSYONLARININ SEMBOLK MAKNE DLNDE AIRILMASI .............................................................................................................. 116 6.5 CDE DEKEN SAYIDA PARAMETRE ALAN FONKSYONLARIN SEMBOLK MAKNE DLNDE YAZIMI ......................................................................................................... 117 6.6 C'DE DEKEN SAYIDA PARAMETRE ALAN FONKSYONLARIN YAZIMI: .............. 119 6.7 C'DE DEKEN SAYIDA PARAMETRE ALAN FONKSYONLARA RNEKLER ........ 121

UZAK GSTERCLERN YKLENMES ..................................................... 123 7.1 C DERLEYCLER UZAK GSTERCN LEMLERN ELE ALI BM ................ 124 7.2 CPU'NUN DURUMUNUN SAKLANMASI ............................................................. 124 7.3 CPU KONUMUNUN SAKLANIP GER YAZILMASI SIRASINDA DKKAT EDLECEK DURUMLAR ................................................................................................................ 125 7.4 C'DE YEREL OLMAYAN DALLANMALAR........................................................... 127 7.5 SETJMP FONKSYONU ....................................................................................... 127 7.6 LONGJMP FONKSYONU .................................................................................... 128 7.7 NEDEN LONGJMP KULLANILIR? ........................................................................ 128 7.8 SETJMP VE LONGJMP FONKSYONLARININ SEMBOLK MAKNE DLNDE YAZIMI 129 7.9 DOSTA UZAK MODELLERDE LEMLER .......................................................... 131 7.10 UZAK MODELLERDE DATA GSTERCLERYLE LEMLER ................................ 131 7.11 WN32/UNIX FLAT MODEL SSTEM ............................................................... 132

AYRINTILI SEGMENT TANIMLARI .............................................................. 133 8.1 SEGMENT TANIMLAMA LEMNN GENEL BM ............................................. 133 8.2 SEGMENTLER EXE KOD ERSNDEK DZLM SIRASI .................................... 136 8.2.1 Segment Tanmlamasnda Kullanlan Snf sminin Segment Sralamasna Etkisi 137 8.2.2 C Derleyicileri ve Segmentler ................................................................ 138 8.2.3 Tiny model .............................................................................................. 139 8.2.4 Small model ............................................................................................ 139 8.2.5 Medium model ........................................................................................ 139 8.2.6 Compact model ....................................................................................... 139 8.2.7 Large model............................................................................................ 139 8.2.8 Huge model ............................................................................................ 139 8.2.9 Segment Kavramnn nemi.................................................................... 139 8.3 AYRINTILI SEGMENT TANIMLAMALARI VE BELLEK MODEL ............................. 140 8.4 BRDEN FAZLA DATA SEGMENT LE ALIMAK.............................................. 141 8.5 BRDEN FAZLA KOD SEGMENT LE ALIMAK ............................................... 141 8.6 WN32/UNIX FLAT MODELLERDE SEGMENT LEMLER .................................. 141 8.7 GRUP KULLANIMI............................................................................................ 143 8.8 ASSUME BLDRM .......................................................................................... 143

OMF FORMATI .................................................................................................. 144 9.1 OMF FORMATINI GENEL YAPISI ...................................................................... 145 iv

DATA VE KOD SEMBOLLERNN OBJ DOSYAYA YAZILMASI ............................... 147 MAKNE KODLARININ VE STATK DATALARIN OBJ MODLE YAZILMASI ........... 149 BASTLETRLM SEGMENT KULLANIMINDA SEGMENT LEMLER .................. 149 RELOCATABLE ADRESLER ............................................................................... 150 RELOCATABLE ADRESLER VE RELOCATON TABLOSU ...................................... 150 COM DOSYALAR ............................................................................................ 151 ORG KOMUTU ................................................................................................ 152 COM PROGRAMLARIN YAZIMI ........................................................................ 152 TEK SEGMENTL COM PROGRAMLARININ YAZILMASI .................................... 152 OK SEGMENTL COM PROGRAMININ YAZILMASI .......................................... 153 TNY MODEL PROGRAMLAR VE COM DOSYALARI ........................................... 153 COM PROGRAMLARININ NEM ...................................................................... 154 COM PROGRAMININ KULLANILMASINA TPK BR RNEK: BOOT PROGRAMININ YAZILMASI.................................................................................................................. 154 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 9.10 9.11 9.12 9.13 9.14 10 LETM SSTEM YAZIMINDA ZLENECEK YNTEM ....................... 156 10.1 LETM SSTEMNN SSTEM FONKSYONLARININ AIRILMASI N KULLANILAN YNTEMLER ............................................................................................................... 157 10.2 MODLLERLE ALIMA................................................................................... 157 10.3 COMMUNAL TANIMLAMA ................................................................................ 160 10.4 STRNG KOMUTLARI ........................................................................................ 160 10.4.1 Komutlarda nek(prefix) ........................................................................ 160 10.4.2 Segment nekleri .................................................................................... 161 10.4.3 REP neki .............................................................................................. 162 10.4.4 LODS Komutu ........................................................................................ 162 10.4.5 LODSB Komutu ...................................................................................... 162 10.4.6 LODSW Komutu ..................................................................................... 162 10.4.7 STOS Komutu ......................................................................................... 163 10.4.8 REP nekinin levi ................................................................................ 163 10.4.9 STOSB .................................................................................................... 163 10.4.10 STOSW ............................................................................................... 163 10.5 SMALL MODEL MEMSET RNE: ...................................................................... 164 10.5.1 MOVS Komutu ........................................................................................ 164 10.5.2 MOVSB................................................................................................... 164 10.5.3 MOVSW .................................................................................................. 164 11 HEAP ALGORTMASI ................................................................................... 165 11.1 BO BALI LSTE ALGORTMASI ...................................................................... 165 11.2 TINUX SSTEMNDE HEAP ORGANZASYONU................................................... 167 11.3 KERNEL HEAP FONKSYONLARININ TASARIMI N YAPILACAK LEMLER ........ 168 11.4 SCAS KOMUTU: ............................................................................................. 168 11.5 RNEK THREAD KTPHANES: ...................................................................... 170 11.6 THREAD KTPHANESNN KULLANIMI: ........................................................... 171 11.6.1 InitThreadLib() fonksiyonu: .................................................................... 171 11.6.2 CreateThread() Fonksiyonu: ................................................................... 171 11.6.3 ExitThread() Fonksiyonu: ....................................................................... 172 11.6.4 GetThreadExitCode() Fonksiyonu: ......................................................... 172 11.6.5 CloseHandle() Fonksiyonu: .................................................................... 172 11.6.6 Thread Ktphanesinin Kullanlmasnda Dikkat Edilmesi Gereken Noktalar: 172 11.7 THREAD KTPHANESNN SEL TASARIMI: ................................................... 173 11.8 CDE INLNE SEMBOLK MAKNE DL .............................................................. 174 v

11.9

DOS SSTEMNDE HEAP YNETM .................................................................. 175

vi

Neden Sembolik Makina Dili renilmelidir?

Kaynaklar: Peter Abel 80x86 Assembly Language The Art of Assembly Language Microsoft Macro Assembler 5.0 ve 6.0 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. 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. 1.1 Mikroilemcilerin alma Biimleri Mikroilemci, bellekle 3 grup u yoluyla baldr. ..........
Adres yolu (Address Bus)

C P U

Data yolu (Data Bus) Kontrol yolu (Control

R A M

Bus)

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

durumda ilemci komutu altrrken bellekten yine okuma ve yazma yapmak zorundadr. Yani mikroilemci yalnzca komutu elde etmek iin deil, komut ierisindeki operantlar elde etmek iin de bellee eriir. 1.2 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 saysdr. 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. 1.3 CPU ile RAM Arasndaki Balant

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 kullanab ilirler. 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 8

8080 ilemcileri 8, 8086 ve 80286 ilemcileri 16, 386 ve 486 i lemcileri 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). 1.4 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 ailesi mikroilemcilerde, RISC ailesi mikroilemcilerine gre daha fazla ve eitlidir. 1.5 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. Opera ndlardan 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 : 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 1.6 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 ilemcisi gerek mod ve korumal modlarda alabilmektedir. 80386 ve sonras bu modu desteklemektedir. 80X86 ilemciler gerek modda ok kk farkllklar dna hzl bir 8086 gibi almaktadr. DOS iletim sistemi gerek modda alabilecek biimde tasalanmtr. 8086 ilemcisi 1 MB bellek kullanabilen 16 bit bir mikroilemcidir. 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 nk 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 sz konusu olur. 1.7 8086 lemcisinin Yazma Yaps 8086 mikroilemcisi toplam 14 yazmaca sahiptir. 4 adet genel amal yazma vardr AX(Accumlator Register), BX(Base Register) CX(Count Register) DX(Data Register) 10

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

Inc ax Sonu operand zerine yazlr 1.8 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.

12

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: Mov ax, [100]

13

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.

2.1

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 indeks registerlar denir. Keli parantez ierisinde bu registerlar tek balarna bulunabilir ya da base ve indeks register toplam biiminde bulunabilir. ki base register toplam ve iki indeks register toplam yasaklanmtr. 16 bit almada btn bellek operandlar aadaki gibi oluturulab ilir. disp8 disp16 8 bitlik bir sabit say 16 bitlik bir sabit say

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

[disp16] [BX], [BP], [SI], [DI] [BX + disp8], [BP +disp8], [SI+ disp8], [DI +disp8] [BX + disp16], [BP +disp16], [SI+ disp16], [DI +disp16] [BX + SI], [BX + DI], [BP + SI], [BP + DI] [BX + SI + disp8], [BX + DI + disp8], [BP + SI + disp8], [BP + DI + disp8] [BX + SI + disp16], [BX + DI + disp16], [BP + SI + disp16], [BP + DI + disp16]

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 4. BX, BP, SI, DI registerlar disp16 toplamyla keli parantez ierisinde 5. Bir base ve bir indeks register toplam keli parantez ierisinde 6. Bir base, bir indeks ve disp8 toplam keli parantez ierisinde 14

7. Bir base, bir indeks 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 Assembler karl

Cde
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, indeks 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] rnein bir komut ierisinde aadaki gibi kullanlabilir:
MOV AX, ES:[BX]

15

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. 2.2 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 d k 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 ierisindeki offseti ayarlamak yetmez. lgili segment registern ierisinde de uygun deerin olmas gerekir. rnein: SS = 138F BP = 1000 ise 16

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 segment-offset ifti yazlabilir. 2. Segment deeri bir segment registerna yazlr. Offset deeri keli parantez ierisinde bellek operand biiminde oluturulur. 2.3 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 b it 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. 2.4 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: 17

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] 2.5 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 b it 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 BL: F2
ADD AL, BL

Burada bir toplama yaplmtr. Ancak sonu 1 byte amtr. Bu durumda ilemci CF bitini set eder. 18

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

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

2.7

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.

2.8

Makine Komutlarnn ncelenmesi 20

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

Segment register Register Register veya memory Sabit bir say

yerine
MOV AX, 1234 MOV SS, AX

yaplabilir. MOV makin komutu hibir flag registern etkilemez. Bellekte istenilen bir blgeyi grntlemek 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. 2.8.2 ADD Komutu Biimleri: 1. reg reg/mem 2. reg/mem sabit rnekler:
MOV AX, BX MOV AX, [SI]

21

Bu komut AF, CF, OF, PF, SF ve ZF flagleri zerinde etkili olmaktadr. 2.8.3 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
MOV AX, [200] ADD AX, [204] MOV [208], AX MOV AX, [202] ADC AX, [206] MOV [20A], AX

12345678 87654321

78 56 34 12 21 43 65 87

200 201 202 203 204 205 206 207 208 209 20A 20B

Bellein istediimiz bir blgesine bir deer girmek iin mouse bellek blgesin e getirilip, istenilen blgede click yaplr ve istenilen saylar klavyeyle girilir. 2.9 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. 22

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 yapldn anlamna gelir. Offset genilii ise bellek operandnn ka byte offset ierdiini anlatr.

23

zetle register bellek ve bellek sabit ilemlerinde ilem genilii ve offset geniliine ilikin btn kombinasyonlar geerlidir. Ancak DOS altnda 4 byte offset genili ini 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 MOV EAX, [ESI]
ADD EAX, [SI] MOV AX, [ESI] MOV AX, [SI] MOV AL, [SI] MOV AL, [ESI]

Gerek mod

Korumal mod

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. 2.9.1 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) 1C 0001 1100 24 0001 1100 0010 1111 1101 0001

-2F ED

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 2.9.2 CMP Komutu

aretsiz254 aretsiz1 aretli255

aretli-2 aretli1 aretsiz-1

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

25

MOV [1FCA], AX MOV EAX, [1FC0] 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. 2.9.4 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 s z 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

26

int trnn 32 bit olduu sistemlerde byle bir ilem dorudan 32 bit yazmalarla yaplabilir. 16 bit sistemlerde bir grup arpma ilemi yle yaplr.
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

2.9.5 DIV Komutu Komutun biimler i 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

27

MUL ve DIV komutlar iaretsiz arpma ve blme ilemleri yaparlar. Yani rnein: 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. 2.10 Bit Dzeyinde lem Yapan Komutlar Bu komutlar iki operandldr. Saylarn karlkl bitleri zerinde ilemler yaparlar. 2.10.1 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. 2.10.2 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 olmas yla belirlenebilir. Bunu anlamann en iyi yntemi sayy 1 ile AND ilemine sokup ZF bayrana bakmaktr. rnein:
TEST AX, 1

28

Ayn teknik etkin bir kod retimi iin Cde de uygulanabilir. rnein aadaki kod
if (x % 2 == 0) { }

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

2.10.3 OR Komutu Biimleri: 1. OR reg reg/mem 2. OR reg/mem sabit Karlkl bitleri OR ilemine sokar. 2.10.4 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

29

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 XOR ve OR komutlarnn etkiledii bayraklar PF, SF, ZFdir. CF ve OF her zaman sfrlanr. AF belirsizdir. 2.10.5 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. 2.10.6 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 btn bitler bir saa kaydrlr ancak en soldan iaret biti 0 ise 0 ile , 1 ise 1 ile besleme yaplr. 2.10.7 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. 30

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

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

2.10.8 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

(80186 ve sonras iin)

ROL AX,5 ROR word ptr [SI][BX], CL


SAR byte ptr [SI+10],1

80186 ve sonras iin doru Doru Doru

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

1. 2.

PUSH (POP) reg/mem 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 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 tarafn dan otomatik olarak tespit edilemez. Stack blgesini byklne programc karar verir ancak program baladnda SP reg. konumlandrlmasn ykleyici yapar. 2.10.10POP Komutu Bu ilemde SP register ile belirtilen blgeden 2 byte alnr (korumal modda ESPnin gsterdii yerden 4 byte) ve SP 2 byte artrlr.

32

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

2.10.11Stack 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: 33

PUSH AX POPF

komutlar; bilgi almak iin:


PUSHF POP AX

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. 2.10.12PUSHA 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. 2.10.13INC 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). 2.10.14XCHG 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

34

2.10.15CBW(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:
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 iaret ine gre 00 ya da FFlerle doldurulacaktr. lem aadaki gibi yaplabilir:
MOV AX, b CWD IDIV word ptr c MOV a, AX

2.11 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 35

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. 2.11.1 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:
JMP EXIT .... .... EXIT:

Debuggerlarda JMP ilemi iin hedef adres kullanlr. rnein: 2.11.2 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 orijin 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. 2.11.3 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, 36

+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 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 makineyi reset etmek iin 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: 2.11.4 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.

37

2.11.5 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. 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. 2.12 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. 2.12.1 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

38

@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 @1: ifade1 @2:

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

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

if (x >= y) ifade1; else ifade2;

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

2.12.4 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) 2.13 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:

40

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. 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 int ersegment 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]

41

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

42

2.15 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 STD CMC clear CF set CF clear IF set IF clear DF set DF complement CF

2.16 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 genell ikle 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 tlink.exe ya da link.exe programlaryla komut satrndan link edilerek exe dosya elde edilir. TLINK programnn tipik kullanm yledir: TLINK <obj dosya ismi>; 2.17 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:

43

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

2.18 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 44

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

2.20 Semboller Bir code ya da dataya ilikin offset adresi belirten alfabetik isimlere sembol denir. Yani semboller Cdeki deikenler gibidir. Sembollere sembolik makine dilinde variable 45

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

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

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

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

47

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.

2.23 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

2.24 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 2.25 proc Bildirimi Genel biimi:
sembol proc [near/far] ..... sembol endp

48

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. 2.26 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----------*/ 2.27 Sabitler Sabitler makine komutlarnda ya da data sembollerine ilk deer vermekte kullanlabilirler. 2.28 Sabitlerin eitli Tabanlarda Gsterimleri Sabitler dorudan yazldnda 10luk sistemle yazld kabul edilir. rnein: 49

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

Sabitler 16lk sistemde saynn sonuna h getirilerek ayrt edilirler. 16lk sistemdeki sabitler saysal karakterlerle balyorsa bana 0 getirmek gerekir. 2.29 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.

2.30 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. 2.31 BCD Trden Sabitler 50

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

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

MOV AX, BX

Yani komutun yle yazlmas ayn anlama gelir:


EXIT: MOV AX, BX

2.33 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. List ing dosyasn oluturabilmek iin derleme ilemi TASM ile yaplrken komut satr ; ile kapatlmaz, /L argman verilir. Listing dosyasnn ismi program ismiyle ayn, uzants lstdir. 2.34 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 indeks register olmal. Bu indeks register dngye girmeden nce dizinin balang adresiyle ykl olmaldr. Ya da dizi elemanlarna erimek iin [sabit + indeks_reg] yaps kullanlabilir. te bu biimde dngde her yinelenme ile indeks registern deeri gerektii kadar arttrlr ve dizi elemanlarna eriilir. Bu blmde eitli dnglerin oluturulmas, dizilerin taranmas gibi temel ilemler zerinde durulacaktr.

51

2.35 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 SI registerna atanmasna yol aar. [] ierisindeki ifadeler bellekte bir yer belirttiine gre bu komut bir nesnenin adresinin alnmasnda kullanlabilir. 2.36 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

52

Bu dng kalplar tipik bir C for dngsnn almlardr. Burada n defa dnmek ii n azaltml yntemler de kullanlabilir. Kalp
MOV CX, n @1: .... .... .... DEC CX JNZ @1 do { .... .... .... --n; } while(n)

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**********/ 2.37 Kod Sembolleri Programn kod blmnde offset belirten sembollere denir. Kod sembolleri iki biimde oluturulur: 1. Etiket bildirimiyle 2. proc bildirimiyle 53

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. 3 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 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 tesp it 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 ko nusu 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 biimi ne 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 54

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 yazlarak belirtilir. C tarz fonksiyon armada parametreler sadan sola fonksiyonu aran tarafndan stacke PUSH edilir. Sonra fo nksiyon 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

55

Win32 ve UNIX sistemlerindeyse


PUSH EBP MOV EBP, ESP

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

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

ADD SP, n

UNIX ve Win32 sistemlerinde:


ADD ESP, n

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, 57

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

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. 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. 3.1 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. 3.2 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]

59

POP EBP RET _add endp

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

3.3

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.

60

3.4

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 end

/*****dosutil.asm*****/ 61

/*****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*****/ 3.5 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 tasar lanabilir: 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

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

62

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

63

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

64

size_t asm_strlen(const char *str); void main(void) { char s[80]; gets(s); printf("%d\n", asm_strlen(s)); }

/*****test16.c*****/ 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 65

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

66

/*****test16.c*****/ 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 .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 dw dw db db ? ? "%d\n", 0 "%d %d\n", 0

3.7

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 67

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

68

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

Magic number

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 ku llanrlar. 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. 69

Relocation elemanlarnn says Balk ksmnn paragraf uzunluu

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

Ykleme iin gereken minimum ve maksimum paragraf saylar

SS deeri

SP deeri

Checksum

CS ve IP deerleri

Relocation tablosunun yeri Overlay says

3.10 PSP(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 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. 3.11 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.

71

3.12 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 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 fonksiyo nu 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

72

INT 21h POP BP RET _exit endp

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. 3.13 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. 3.14 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 ku llanabilir. INT makine komutu 73

tpk CALL makine komutu gibi program akn kesme koduna geirmektedir. INT makine komutuyla oluturulan kesmeden IRET makine komutuyla geri dnlr. 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. 3.15 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 Kesme vektr 0-3 IP0 CS0 4-7 IP1 CS1 Kesme No 0 1 74

8-B C-F ...

IP2 IP3 ...

CS2 CS3 ...

2 3 ...

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. 3.16 IRET makine komutu
RETF POPF

komutlarna(mantksal olarak) edeerdir. 3.17 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 75

bu kod ierisinde orijinal kesme kodunu aracaksak tpk INT makine komutu uygulanm gibi armalyz. Bu ilem
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

3.18 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

Kesme kodu

76

POP AX

3.19 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 .code JMP CALL dw dd 1234h 12345678h

word ptr dword ptr

adr1 adr2

Burada adr1 ve adr2 sembolleri srasyla dallanlacak segment ii ve segmentler aras adresleri tutmaktadr. 3.20 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;

77

*pIntr = 0x1234;

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. 3.21 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. 3.22 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. 3.23 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 input output 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 78

rnein iletim sisteminin yklenmesi iin 13h kesmesi kullanlmak zorundadr. Ya da bir boot ynetici program klavyeden bilgiyi 16h kesmesiyle almak zorundadr. 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. 3.24 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 mov mov ah, 0ah al, mname bl, 0

79

mov cx, 10 int 10h mov ax, 4c00h 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

80

jmp @2 @1: mov al,xname + si xor ah, ah 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

81

ja @3 and al, 11011111b 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*****/ 3.24.1 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 82

yaptrlabilir. Ayrca bu fonksiyonun nemli bir zellii de udur: eer zel bir tua baslrsa 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*/ }

3.24.2 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. 3.24.3 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 CtrlC 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. 3.24.4 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 ze re girilerin saysdr. Yani buradaki say 10 ise en fazla 9 karakter girebiliriz). 83

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

3.24.5 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

3.24.6 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

3.24.7 INT 21h F:39h(create sub directory) Bu kesme bir alt dizin yaratmak iin kullanlr. Parametreler: AH 39h 84

DS:DX

Yaratlacak dizinin isminin bulunduu yaznn balang adresi

Geri dn deeri: Fonksiyonun geri dn deeri ilemin baarsn anlatr. CF bayrana baklmaldr. CF bayra set edilmi ise hata vardr, deilse ilem baarldr. 3.24.8 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 i in 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

85

end main

/*****21hf39h.asm*****/ 4 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

86

mov ds, ax 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*****/ 4.1 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: 87

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*****/ /*****test.asm*****/
include util.inc

88

.model small .data .code main proc near initprg getche putch al exitprg 0 main endp .stack 100h end main

/*****test.asm*****/ 4.2 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 MOV MOV INT INC @1: CMP JNZ endm byte ptr [BX] 0 @2 AH, 2 DL, [BX] 21h BX

@2:

makrosu
.DATA xname yname .CODE .... .... putstr putstr .... db db ali sere, 0 necati, 0

xname yname

kodunda iki defa kullanld iin derleyici hata verir. LOCAL komutu kod sembolleri iin kullanlr. Kullanm biimi:
LOCAL sembol1, sembol2, sembol3, ...

89

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 MOV MOV INT INC @1: CMP JNZ endm byte ptr [BX] 0 @2 AH, 2 DL, [BX] 21h BX

@2:

eklinde deitirilirse problem ortadan kalkar. 5 5.1 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. 5.2 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 90

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. 5.3 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. 5.4 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. 5.5 Noktal Say Formatlar

Noktal say formatna dnm u admlardan geilerek yaplabilir: 1. 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 2. Format ksmdan olumaktadr: 91

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. 3. Saydan nokta atlr. Bir btn olarak en soldaki 1 kartlarak formatn mantis ksmna yerletirilir. Bu blmde bo kalan bitler 0 ile doldurulur. 4. 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. 5.6 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 alndnd a 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).
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); }

92

5.7
31

Float(short real) Format


30 23 22 0

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 Kesir ksm stel ksm Say 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'); }

1100100.01 6(0110) 1.10010001 10010001 0 1001 0001 0000 0000 0000 000 6+127=133(10000101) 0100 0010 1100 1000 1000 0000 0000 0000(4C88000h)

C kodu kullanlabilir. rnek uygulama: 0.125 saysn float say formatna dntrnz. kilik dzende stel ksm Kesir ksm aret biti Kesir ksm stel ksm Say 0.001 -3 1.0 0 0 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 93

Kesir ksm stel ksm Say 5.8

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 5.9 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. 5.10 Double(long real) Format Sekiz bytelk noktal say formatdr. Float formatna gre saynn stel ksm ve kesir ksm bytlmtr.
63 62 52 51

aret biti BIAS 1023

stel ksm(11 bit)

Kesir ksm(52 bit)

94

5.11 Long Double(extended real) Format

79

78

64 63

aret biti BIAS 16384

stel ksm(15 bit)

Kesir biti(64 bit)

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

95

5.13 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(log e2) PUSH eder. 5.14 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. FSTP/FSTP dword ptr mem Register ierisindeki float bilgiyi bellee almak iin kullanlr. 2. FST/FSTP qword ptr mem 3. FST/FSTP tbyte ptr mem 4. FST/FSTP ST(n) ST(0) stack gstericisinin gsterdii yerdir. ST(1 ) stack gstericisinin gsterdii yerden bir ileridir. Bu komut ST (0)daki bilgiyi ST(n)e atar. 5.15 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;

iin derleyiciler yle bir kod retirler:


FILD word ptr b FSTP qword ptr a

96

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. 5.16 FADD, FADDP Komutla r 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.

FADD mem komutu stack gstericisinin gsterdii yerdeki bilgiyle bellekteki bilgiyi toplar,

stack gstericisinin gsterdii yere yazar. 97

FADD ve FADDP komutlarnn operandsz versionlar da vardr. FADD komut ST(0)ST(0)+ST(1) ilemini yapar. 5.17 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 ile mcinin 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:

Bu fonksiyon yle yazlabilir: /*****fadd00.asm*****/


.model small .code _add proc near PUSH BP MOV BP, SP

98

FLD QWORD PTR [BP + 4] FADD QWORD PTR [BP + 12] POP BP RET _add endp public _add end

/*****fadd00.asm*****/ 5.18 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 5.19 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 5.20 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 end

/*****fsqrt00.asm*****/

99

5.21 BORLAND derleyicilerin Matematik lemci Seenekleri BORLAND derleyicilerinde Options Compiler Advanced Code Generation Floating Point mnsnde 4 seenek vardr: 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 uyu mlu komutlar kullanlarak yaplr. 80287/80387 Derleyici her zaman 80287 ya da 80387 uyumlu matematik ilemci uyumlu kod retir. None 5.22 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. 5.23 Sembolik makine dilinde gerek saylar tutan sembollerin tanmlanmas: Gerek saylar "dd", "dq" ya da "dt" sembolleriyle belirtilir. Bu belirleyiciler kullanlarak 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

lk deer olarak verilen saynn sonuna "r" getirilebilir. "r" getirme ilemi say ". " iermedii zaman daha anlamldr. rnein iki gerek saynn toplanmas yle yaplr: 100

.DATA x dd y dd z dd .CODE fld fadd fstp 100.2 500.3 ?

x y z

Not: TD programnda matematik ilemcinin register'lar "View-->Numeric Processor" seeneiyle grntlenir. Bu grntde ST(0), ST(1), ST(2), ... o anda stack gstericisinin gsterdii data register 'dan balayarak register belirtir. ST(0), matematik ilemcisinin stack gstericisinin gsterdii register'dr. Bunun gerekte ka numaral data register olduu debuggerda ST alannda yazmaktadr. 5.24 PipeLine lemi PipeLine , mikroilemci bir makine komutu zerinde alrken sonraki makine komutlarnn eitle 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. 5.25 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 komutundan sonra altrlmak zorundadr. Yukardaki rnekte normal ilemcinin matematik ilemci komutundan sonra matematik ilemcinin komutu tamamlanarak bekletilmesi gerekir. Bu 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 101

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 senkro nizasyon 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 durum 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 matematik 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. Sembolik makine dili derleyicisinin bu durumda wait komutunu oto matik eklemesinin nedeni bu komutun dier ilemcilerde gerekmeyebilecei iindir. Konunun zeti: Biz matematik ilemci komutlarnda sonra normal ilemci komutu geliyorsa wait komutunu yerletirmeliyiz. Ancak normal ilemci komutunda sonra matematik ilemci komutu geliyorsa wait komutunu yerletirmemeliyiz. 5.26 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 bir sre logic 1 durumuna eker. Sonra yeniden bu ucu logic0 durumuna drr. Bylece normal ilemciyi wait komutundan aslnda matematik ilemci sayesinde kmaktadr. 102

5.27 Gerek Saylarn Karlatrlmas : Normal olarak iki noktal saynn tam eitliinin karlatrlmas anlaml bir durum deildir. Benzer 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. 5.28 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: 5.29 FSTSW word ptr mem
FSTSW reg

(80287 ve sonras)

Status register ierisindeki bitler yledir:


15 B 14 C3 13 12 SP 11 10 C2 9 C1 8 C0 7 IR 6 ? 5 PE 4 UE 3 OE 2 ZE 1 DE 0 IE

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) 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 (ST ile ST(1) saylarn karlatrr) 103

2. FCOM ST(n) 3. FCOM mem

(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 5.30 FSTSW AX ile, 8087 iin iki aamada
FSTSW word ptr mem16 MOV AX, mem16

ile yaplabilir. 5.31 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: 15 14 C3 13 12 11 10 C2 9 C1 8 C0

7 TF

6 ZF

4 AF 104

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. 5.32 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. B u 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:

C kodu
double a, b; if (a <= b) ifade1; else ifade2;

Assembler karl
FLD a FCOMP b FSTSW AX WAIT SAHF JBE @1 fade2 JMP @2 @1: ifade1 @2:

5.33 Programlama Dillerindeki Yerel Deikenlerin Kullanlmas Programlama dillerinde yerel deikenler tpk parametre deiken leri gibi stack blgesini kullanmaktadr. Intel mimarisinde C derleyicileri fonksiyonun hangi blounda 105

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 er iilebilir. 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 yerleim yaplmaktadr. Yukarda belirtilen func fonksiyonu iin giri kodu aadaki gibi olacaktr:
PUSH BP MOV BP, SP SUB SP, 8

106

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.

5.34 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
int add(int a, int b) { int result; result = a + b; return result; }

Assembler karl
_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

/*****yerel001.c*****/ C Kodu
void swap(int *p1, int *p2) { int temp;

/*****yerel001.asm*****/ Assembler karl


_swap proc near push bp mov bp, sp

107

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

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

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

108

} 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); } } 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
void main(void) { char s[4]; s[0] = a; s[1] = l; s[2] = i; s[3] = \0; puts(s); }

Assembler karl
_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

/*****yerel003.c*****/ C kodu

/*****yerel003.asm*****/ Assembler karl 109

void main(void) { int a = 10; int *p; p = &a; *p = a; }

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

Stringler derleyici tarafndan .data alanna yerletirilir. Sonra balang adresiyle kullanlrlar. C kodu
void main(void) { char *p; p = Ankara; puts(p); }

Assembler karl
.data s@ 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.c*****/

/*****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
void func(void) { int a[] = {1, 2, 3, 4, 5}; }

Assembler karl
.data a@ 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@

110

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

/*****yerel006.c*****/

/*****yerel006.asm*****/

Nokta(.) operatryle bir yap elemanna eriilmek istendiinde derleyici dorudan eriilecek elemann offsetini bularak eriimi gerekletirebilir. rnein: C Kodu
struct SAMPLE { int a; long b; char c; }; 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); }

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

/*****yerel007.c*****/

/*****yerel007.asm*****/

aretli tamsay trn daha uzun iaretli tamsay trne dntren makine komutlar: 111

1. 2. 3. 4. 6

CBW CWD CWDE CDA

ALAX AXDX:AX AXEAX EAXEDX:EAX

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 byte tan 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. 6.1 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;

112

}; 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. 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 alignment seilir. Default durum byte hizalama biimidir. 6.2 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. 6.3 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;

113

WORD maxcolor; DWORD totalcolor; } XFORMAT; XFORMAT x; ... fseek(f, 0, 0); fread(&x, sizeof(XFORMAT), 1, f);

x.maxcolor = ? Bu kod word hizalama seeneinde derlenip altrlrsa yap elemanlaryla dosyadaki deerler akamayacaktr. Problemi zmek iin derlemenin byte hizalamasnda yaplmas gerekir. Tabii dosya formatn tasarlayan byle bir problem ksn istemiyorsa btn elemanlar ift uzunlukta tanmlayarak hizalama problemini daha tasarm aamasnda ortadan kaldrabilir. 2. Bazen farkl bir hizalama biimi kullanlarak eitli fonksiyonlar derlenerek ktphaneye yerletirilmi olabilir. Bu fonksiyonlar zellikle bir yap deikeninin adresini parametre olarak alyorsa hizalama problemi ortaya kabilir. rnein ktphaneye yerletirilmi olan fonksiyon word hizalamas kullanlarak derlenmi olabilir. Biz o fonksiyonu byte hizalamas kullanlan bir koddan armaya alrsak problem ortaya kar. Bu durumda tasarmc olarak bir yap kullanan fonksiyonu ktphaneye yerletireceksek yapnn elemanlarn char yerine int trnden ifade etmeliyiz. nk int tr mikroilemcinin bir register uzunluu kadar seilir ve hizalama problemi oluturmaz. ANSI C standartlarnda hizalama konusunda belirleyici bir ifade kullanlmamtr. Yalnzca yaplarn ele alnd blmde hizalama yznden yap elemanlar arasnda boluklarn olabileceinden bahsedilmitir. Hizalama kurallar tamamen derleyiciyi yazanlara braklmtr. Bu yzden farkl derleyicilerin farkl hizalama kurallar olabilir. Bu durumda bir derleyicide yazlm ve derlenmi modln byte hizalamas dnda bir hizalama kullanlmsa probleme yol aabilecei unutulmamaldr. Yap gstericisi kullanarak yap elemanlarna ok operatryle ulamak aadaki gibi olmaktadr. C kodu
struct SAMPLE { int a; long b; char c; }; void Set(struct SAMPLE *p) { p->a = 10; p->b = 20; p->c = a; } void main(void) { struct SAMPLE x; Set(&x);

Assembler karl(16 bit)


_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 _main proc near push bp mov bp, sp sub sp, 7

114

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

/*****yerel008.asm*****/ 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


void func(void) { } void main(void) { void (*p)(void); p = func; p(); }

Assembler karl
_func proc near ret _func endp _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

NOT:Kod sembolleri de bir bellek blgesine mov komutuyla doru dan atanabilir. Kod

sembolleri [] ierisinde deil, dorudan bir say belirtmektedir.

115

6.4

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 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
class Date { public: void Disp(void) const; void Verify(void) const; void Set(int d, int m, int y); private: int day, month, year; }; 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(); }

Assembler karl
.data s@ db %d/%d/%d, 10, 0 .code @Date@Set proc near push bp mov bp,sp push si mov si,word ptr [bp+4] mov ax,word ptr [bp+6] mov word ptr [si],ax mov ax,word ptr [bp+8] mov word ptr [si+2],ax mov ax,word ptr [bp+10] mov word ptr [si+4],ax push si call @Date@Verify pop cx pop si pop bp ret @Date@Set endp @Date@Disp proc near push bp mov bp,sp push si mov si,word ptr [bp+4] push word ptr [si+4] push word ptr [si+2] push word ptr [si] mov ax,offset s@ push ax call near ptr _printf add sp,8 pop si pop bp ret @Date@Disp endp @Date@Verify proc near ret @Date@Disp endp _main proc near

116

push bp mov bp,sp sub sp,6 mov ax,2001 push ax mov ax,1 push ax 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*****/ 6.5

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

117

call _printf add sp, 6

Programn ak printf fonksiyonuna girip stack frame dzenlendikte n sonra stack blgesinin grnts yle olacaktr: SP 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 ola n 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 bir fonksiyon tasarlayalm: Fonksiyonun birinci parametresi ka say girildiini gstersin, fonksiyon dier parametrelerin toplamna geri dnsn. Bu fonksiyonun makine dilinde yazlm yle olabilir:

118

.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 Bazen deiken sayda parametre alan fonksiyonlarda birinci parametre ka parametreyle arld bilgisini iermez. fonksiyon son parametrenin zel bir deer olmasndan hareketle tasarlanr. rnein yukardaki kodu birinci parametrenin anlamn deitirip son parametre 0 oluncaya kadar saylarn toplam biiminde ifade edebiliriz. Yukardaki sum() fonksiyonunu son parametrenin yerini 0 ile tespit ederek yeniden tasarlaynz. C'de deiken sayda parametre alan saylarn en az bir parametresi olmak zorundadr. Bu yzden fonksiyonun prototipi yine; int sum(int n,...); biiminde belirtilmelidir. 6.6 C'de deiken sayda parametre alan fonksiyonlarn yazm:

C'de deiken sayda parametre alan fonksiyonlar standart makrolarla yazlmaktadr. Bu makrolar kullanlrsa kod sistem bamsz olarak alabilir. Aslnda biz sistemi iyi yanyorsak birinci parametrenin adresini alarak stack zincirini takip edebiliriz. Ancak byle bir zm tanabilir deildir.

rnek:

119

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

Burada kullanlan "size" baka bir makrodur. Birinci parametrenin 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 parametresiyle 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 makronun birinci parametresiyle belirtilmi olan nesneyi sonraki parametre iin gnceller. #define va_arg(ap,type) size(type))) ((char *)(ap) += size(type), *(type)((char *)(ap)120

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.i mdi normalde gsterilmesi istediimiz parametrenin 1 tesinde (parametrenin kendi boyu kadar ) Ama geriye nceki adres deerindeki bilgiyle dner, ama point'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. 30 Ocak 2001 Sal (Assembler) 6.7 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.

121

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

122

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. 7 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 anlaml 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, large ya da huge ise far anahtar szc kullanlmasa bile gstericiler uzak gstericilerdir. Bir uzak gstericiyi kullanabilmek iin dk anlaml 2 byte'n indeks register'a, yksek anlaml 2 byte'n ise segment register'a yerletirmek gerekir. Uzak gstericilerle ilem yaparken hangi segment register' semeliyiz. C S 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 lgs reg,mem reg,mem reg,mem 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 komutta belirtilen segment register'a yklerler. Bylece uzak gstericiler tek hamlede yklenmi olurlar. Komutun operand 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 ver ilebilmektedir.

123

7.1

C Derleyicileri Uzak Gstericini lemlerini Ele Al Biimi 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

_main proc push mov sub push mov mov les mov pop mov pop ret _main endp 7.2

CPU'nun Durumunun Saklanmas

Birden fazla kodun paralel 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 program altrlaca zaman bir sistem fonksiyonu kullanlr. rnein bu fonksiyonun WINDOWS sistemlerindeki ismi CreateProcess() 'dir. 2) Program bellee yklendiinde ismi artk proses olur. Prosesi yaratan fonksiyon 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, 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'lar na 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. 124

7.3

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 @1: pop mem2 Bazen saklanacak IP deeri ileride baka bir blgeye ilikin olmas istenebilir. Bunun iin aadaki gibi bir yntem izlenebilir: mov call @1: add ----@2: Burada IP iin saklanan deer @2 pozisyonudur. CS ve IP deerlerinin geri yklenmesi aadaki gibi yaplamaz: mov push ret cs,mem1 mem2 ax,offset @2-offset @1 mem1,cs @1 mem1,cs @1

nk; mov cs,mem1 ileminden sonra artk CPU baka yerden komut almaya balayacaktr. CS ve IP register'larnn ayn anda yklenmesi gerekir. Bunun bir ka yntemi vardr. a) push push retf

mem1(CS) mem2(IP)

b) IP ve CS deerleri 4 byte'lk bir alana yazlr ve bu alan kullanlarak "segmentler aras dolayl jump" komutu uygulanr.

125

mov mov mov mov jmp

ax,mem2 dest,ax ax,mem1 dest+2,ax dword ptr dest

CS, IP yklemeleri register 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 mov mem1,sp mem2,ss

Gerekten saklama ilemi byle yaplabilir. Ancak geriye ykleme ilemi aadaki gibi yaplabilir mi? mov mov ss,mem1 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 cli mov mov sti ss,mem1 sp,mem2 mem1,ss mem2,sp Ancak 80286 ve sonrasnda bu ileme gerek yoktur. nk mikroilemci SS segment register'na ykleme yapldnda sonraki komut sonlanana kadar otomatik olarak kesme kabul etmemektedir. Tabii SS register'na ykleme komuttan sonra hemen SP register'na ykleme yapmak gerekir.

Bir kesme olutuunda kesmenin SS ve SP deerlerini deitirerek kendi stack'ini kullanmas problemli olabilir. Bu tr durumlarda i ie kesme armalarnda sistem kilitlenebilir. rnein DOS'un INT21h kesmesinin fonksiyonlar SS ve SP deerlerini nceden belirlenmi sabit bir yere ekerler. bu durumda i ie DOS kesmesi arldnda iteki kesmeden 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 126

edilir. Her INT8 olutuunda INT8 o bayraa yeniden bakar. Bayrak 0'a dnce aktivasyonu INT8 yapar. 3) Dier Register'larn saklanmas ve yklenmesi: Dier register'larn yklenmesi srasnda pek ok kombinasyon bozucu etki yaratabilir. rnein DS yklendii zaman artk SI ve DI ndex register'lar farkl bir yeri gsterecektir. 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]

7.4

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] , parametrelere 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. 7.5 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: 127

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); } 7.6 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. 7.7 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>

128

#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*****/ 7.8 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:

129

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 ger iye dn yapldnda SPnin durumu setjmp fonksiyonunun arlmadan nceki durumu olmaldr.

Bylece longjmp ile geri dnldnde artk ak setjmpdan sonraya dmtr. altrlacak kod derleyicinin stack dengeleme komutudur. Yani setjmp knda derleyici
add sp, 2

130

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 komut lar uygulanabilir. rneimizde RETF tercih edilmitir. /****longjmp1.asm*****/ /****longjmp2.prj*****/ /****longjmp3.c*****/ 7.9 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. 1. Tiny Model Bu modelde tm segment registerlar ayn deerdedir. Bu durumda programda CS = DS = SS olduu iin toplam kod, data ve stack 64Kb geemez. 2. Small Model Bu modelde CS bamsz bir 64Kb gsterir. DS = SS biimindedir. Program kodu 64Kb geemez, toplam statik data ve stack 64Kb geemez. 3. 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. 4. 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 ierisindedir. Fonksiyon armalar default near call biimindedir. Ancak gstericiler default uzak gsterici olmak zorundadr. 5. 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. 6. 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. 7.10 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*****/ 131

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 _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*****/ 7.11 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 132

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). 8 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. 8.1 Segment Tanmlama leminin Genel Biimi

<segment ismi> segment [hizalama biimi] [birletirme biimi] [snf biimi] .... .... .... <segment ismi> ends

rnein:
_MYSEG segment ..... ..... _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

133

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 s okulmaz. 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
myseg segment para public .... (1) .... myseg ends yourseg segment para public .... (2) .... yourseg ends myseg segment para public .... (3) .... myseg ends

b.asm
myseg segment para public .... (4) .... 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 134

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

135

8.2

Segmentleri Exe Kod erisindeki Dizilim Sras

Bilindii gibi exe dosya bir balk ksm iermektedir. Bu balk ksm y kleyici 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 typ e) 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 dosyasn da 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 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 136

snf ismi kullanlmadan segmentlerin exe ierisindeki nihai yerletirilmelerine ilikin rnekler vereceiz: a.asm X1 segment public X1 ends Y1 segment public Y1 ends b.asm Y1 segment public Y1 ends X1 segment public X1 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. 8.2.1 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:
Myseg segment para public CODE .... Myseg ends

c.asm Z1 segment public Z1 ends Y2 segment public Y2 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 Y1 segment public DATA Y1 ends Z1 segment public CODE Z1 ends b.asm Y1 segment public DATA Y1 ends Z2 segment public DATA Z2 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 137

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

138

8.2.3 Tiny model

8.2.4 Small model

8.2.5 Medium model

8.2.6 Compact model

8.2.7 Large model

8.2.8 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

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

139

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 program kodunun bulunduu segmentleri tehis etmesi iin dnlmtr. Ayrntl segment tanmlamalaryla program yazarken .model bildirimi programn banda kullanlmaz. 8.3 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 140

program yazarken bu belirlemeleri biz istediimiz gibi yapabiliriz. Yani bellek modeli kavramyla bir ilgimiz yoktur. 8.4 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

8.5

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

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 rnein:
DGROUP group _DATA, _BSS

group segment_ismi, segment_ismi2, ..

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

142

tanmlamas yaplm olsun. Yaplan ilem sonucunda MYGROUP isimli grupta _DATA ve _BSS isimli iki segment vardr. Bir grubu oluturan segmentlerin nihai durumda 64Kb gememesi manuel olarak salanmak zorundadr. Bunu salamak iin bu segmentlerin snf isimlerini ayn yapmak bir katk salayabilir. 8.7 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 number1dw 0 number2dw 1 _DATA ends _BSS segment para public DATA number3dw ? number4dw ? _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.
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. 8.8 Assume Bildirimi 143

Assume sembolik makine dili derleyicisinin bir data ya da kod semboln grdnde hangi orijine gre offset reteceini belirlemekte kullanlr. Assume ileminin defaultu yoktur. Yani assume bildirimini yapmak gerekir(Masm 6.1 derleyicisinde assume yaplmazsa default olarak semboller iin kendi segmentlerinin ba orijin alnarak offset retilir). Basitletirilmi segment tanmlamalaryla program yazarken assume kullanlmaz. Assume bildirimi bellek modeline baklarak default deerlerle derleyici belirlenir. Assume bildirimi yle yaplr: assume rnein:
assume cs:_TEXT, ds:DGROUP, ss:_STACK

segreg:orijin, segreg:orijin, segreg:orijin

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 kullanlan sembol assume edilmi grup 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 kullanamadan DS'nin yklenmesi 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 segmenti iinde tanmlanm olsun. DS ise DGROUP ile assume edilmi olsun.
mov ax,offset X1

DS, DGROUP ile assume edildii 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 kullanlan .obj dosya formatna OMF Format denir. OMF Format 1978'de Intel tarafndan tanmlanmtr ve Microsoft tarafndan gelitirilmitir. OMF Formatnn 32 bitlik bir versiyonu da vardr. Intel ilemcilerinin kullanld UNIX sistemlerinin ounda 32 bit OMF format kullanlmaktadr. WIN32 sistemlerinde alan 144

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. 9.1 OMF Formatn Genel Yaps

.obj dosya format farkl modllerin birletirilmesi konusunda nemli bilgiler ieren bir yapya sahiptir. OMF format sembolik makine dili programnn binary bir dosya biimine dntrlm hali gibidir. rnein iinde makine kodlar segment tanmlamalar, sembol tanmlamalar, extern ve public gibi deiken tanmlamalar vardr. OMF format Borland firmasnn TDUMP.EXE, Microsoft firmasnn DUMPBIN.EXE programlaryla incelenebilir. Bu programlar dosyann uzantsna bakarak .exe, .obj, .lib gibi dosyalar da inceleyebilir. 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 format 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 kullanlan 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 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 */

145

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

146

DispRec(recType); fread(&length, sizeof(WORD), 1, f); fseek(f, length, SEEK_CUR); } fclose(f); } /*------------------------------------------------*/

9.2

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

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

148

000075 LNAMES Name 4: '_TEXT' Name 5: 'CODE' 000084 SEGDEF 2 : _TEXT

PARA PUBLIC Class 'CODE'

Length: 0007

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. 9.3 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 byte 0 biiminde gzkecektir. nk mz format ykleyici tarafndan blok olarak yklenmektedir. 9.4 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. 149

9.5

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 tablo su 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. 9.6 Relocatable Adresler ve Relocation Tablosu

Bilindii gibi .EXE dosya bir balk ksmyla balamaktadr. Balk ksmnn sonunda relocation tablosu bulu nur. 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 150

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

151

9.8

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.

9.9

COM Programlarn Yazm

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

9.10 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 bi imidir. 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: ..... ..... 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

152

jmp msg @1: mov mov int mov int main endp _TEXT ends end main

db

@1 "This is a COM program", '$' ah, 9 dx, offset msg 21h ax, 4c00h 21h

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 9.11 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*****/ 9.12 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.

153

9.13 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. 9.14 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: /*****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

154

@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. /*****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;

155

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*****/ 10 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:
_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 ile tim 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. 156

10.1 letim Sisteminin Sistem Fonksiyonlarnn arlmas iin Kullanlan Yntemler letim sistemi yklenirken sistem fonksiyonlarnn bulunduu dosya bellein istenilen bir blgesine yklenir. Bu dosyann banda sistem fonksiyonlarnn adreslerini tutan bir tablo olmaldr. Sistem fonksiyonlarnn yalnzca adreslerinin tutulmas yeterlidir. Ayrca isimlerinin tutulmas gerekmemekle birlikte bazen tercih edilebilir. Sistem fonksiyonunun arlmas iin bir ktphane dosyas kullanlr. Yani programlar bu ktphane dosyasyla birlikte link edilir. Bu ktphanenin ierisinde btn sistem fonksiyonlar bulunmaktadr. Ancak sistem fonksiyonlarnn kendisi bulunmaz. Aslnda ktphane ierisindeki fonksiyonlar dummy fonksiyonlardr. Grevleri gerek sistem fonksiyonlarnn arlmasdr.

1
Fonksiyon adres tablosu

Sistem fonksiyonlarnn bulunduu modl void func(void) 1 { 2 asm { 3 mov si, table adr 4 call dword ptr[si + n] . } } . n func1(.....) { } func2(.....) { }

kinci yntem Win32 sistemlerinde uygulanan DLL yntemidir. Bu yntemde program dummy fonksiyonlarn bulunduu bir ktphaneyle link edilmez. .EXE dosya format import bilgilerini ierecek biimde tasarla nmaldr. Sistem fonksiyonlarnn arlmas import tablosunda yaplm dolayl call komutlar biimindedir. Ykleyici import tablosunu doldurmakla grevlidir. 10.2 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 157

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 ieris ine 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
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

158

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
_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 edilmes inin komut satr karl yledir (small modelde derlendii varsaylmtr): 159

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

10.4 String Komutlar Sembo lik 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.

10.4.1 Komutlarda nek(prefix)

160

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

para public 'DATA'

Default durum use16'dr. Eer kaynak kodun bana .386, .386p, .486, .486p eklenirse o zaman default durum use32 olur.

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

161

biiminde girilmesine izin vermez.


ss: mov ax, [bx]

biiminde girilmesine izin verir.

10.4.3 REP neki Bu nek string komutlaryla birlikte kullanlmaktadr. Bu neki bir string komutu izlemelidir. String komutlarnn BYTE ve WORD versiyonlar vardr.

10.4.4 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. 10.4.5 LODSB Komutu
AL = DS:SI if (DF == 0) SI = SI + 1 else SI = SI 1

10.4.6 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 250, al

162

dec jnz

cx AGAIN

10.4.7 STOS Komutu Bu komutun BYTE versiyonu STOSB, WORD versiyonu STOSW biimindedir. Komut REP nekiyle kullanlabilir. 10.4.8 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. 10.4.9 STOSB
ES:DI = AL if (DF == 0) DI = DI + 1 else DI = DI 1

10.4.10STOSW
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 do ldurulmas 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 ax, seg block es, ax

163

les cld mov mov rep

di, block al, 0 cx, 100 stosb

10.5 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

10.5.1 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: 10.5.2 MOVSB
ES:DI = DS:SI if (DF == 0) { SI = SI + 1 DI = DI + 1 } else { SI = SI - 1 DI = DI - 1 }

10.5.3 MOVSW
ES:DI = DS:SI if (DF == 0) { SI = SI + 2 DI = DI + 2 } else { SI = SI - 2 DI = DI - 2

164

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

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

165

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.

166

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. 11.2 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 heaplerde n 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);

167

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

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

11.4 SCAS Komutu: Bu komutun byte biimi SCASB, word biimi SCASW biimindedir. Bu komut aslnda 168

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 REPNE SCAS ilemiyse bir bloktaki ilk eit bilgiyi bulmak iin kullanlr. SCAS ilemi daha sk kullanlmaktadr.

LOST_A DB .... MOV MOV CLD MOV MOV LEA REPNE JZ NOTFOUND:

100 DUP(*)

AX,DS ES,AX AL,'A' CX,100 DI,LOST_A SCASB FOUND

169

.... .... .... FOUND: DEC

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*/ void *mymemchr(void *pBlock, char ch, unsigned n) { char S[] = "Bu bir denemedir."; char *p; p = (char*) mymemchr(s, 'i', strlern(s)) if(p == null) { printf("Bulunamad!..\n"); else printf("Bulundu!..\n"); } } Makine dilindeki karl model small .code _mymemchr proc near push mov push mov mov mov cld mov mov REPNE jz NOTFOUND: xor jmp FOUND: dec mov PROC_END: pop pop ret _mymemchr endp public _mymemchr end bp bp, sp di ax, ds es, ax di, [bp + 4] al, [bp +6] cx, [bp + 8] SCASB FOUND

ax, ax PROC_END

di ax, di di bp

11.5 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 170

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, kullanlmayacak fonksiyonlarn nne PRIVATE sembolik sabitleri getirilmitir. 11.6 Thread Ktphanesinin kullanm: 11.6.1 InitThreadLib() fonksiyonu: Bu fonksiyon thread ktphanesini initialize eder. Bu yzden programn banda bir kez arlmaldr. Prototipi:
BOOL InitThreadLib(void);

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

11.6.3 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. 11.6.4 GetThreadExitCode() Fonksiyonu: Bu fonksiyon sonlandrlm fakat handle alan silinmemi bir thread'in exit code 'unun alnmas iin kullanlr.
int GetThreadExitCode(int thrID);

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

11.6.6 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 nce kinin 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.

172

2) Dier standart C fonksiyonlar oklu thread'e uygun olup olmad deerlendir ildikten sonra kullanlmaldr. Aslnda DOS iin tamamen oklu thread'i destekleyen bir C ktphanesi de yazlabilir. 11.7 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 Slot bo Thread sonlandrlm ama slot boaltlmam, exit codeu alnabilir. CloseHandle fonksiyonu status elemann THREAD_STATUS_EXITten THREAD_STATUS_FREE durumuna getirir. Thread alyor.

THREAD_STATUS_RUNNING

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 deikenlerinin sonraki thread bilgilerini gstermesini salamaktadr. InitThreadLib 173

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

174

11.9 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

Compact Model 175

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

176

Huge modelde heap blgesi yine en aadadr. Ancak birden fazla code ve data segment bulunabilir.

177

You might also like