80x86 processor

  • Upload
    ozrsdk

  • View
    295

  • Download
    6

Embed Size (px)

Citation preview

  • 8/14/2019 80x86 processor

    1/131

    X86 Assembly Programlamaya Giri

    X86 NEDR ?

    X86 Intelin ilk mikroilemcilerinden olan 8086 ile ilgili programlama kurallarn ifadeeden bir tanmlamadr. Intelin nemli zelliklerinden biri olan "geriye dnk yazlmuyumluluu" byle bir tanmlamann olumasn salam.

    yle ki; 8086 mikroilemcisi olan bir bilgisayar sisteminde hazrladnz herhangibir assembly program X86 uyumlu tm bilgisayarlarda alr. 80286, 386, 486 SXveya DX, Pentium, Pentium III, AMD nin 286, 386 ilemcilerinde veya Nexgen,Cyrixin ayn tr ilemcilerinde ve dierlerinde bu program alacaktr. Bu demekoluyor ki yukarda saydmz tm mikroilemciler ve uyumlu olan dierlerinin ortakbir yn var. Bu ortak ynler ortak program kodlarn olmas ve mikroilemcilerinintemel mimarileri birbirinin ayn olmasdr.

    Yeni bir mikroilemci retildiinde, eski mikroilemcilere uyumlu olmas byk biravantajdr. yle olmasayd bugn dnyada %90 orannda PC, X86 uyumlu ilemcikullanyor olmazd. Bu yzden mikroilemci pazarnn bu byk dilimini birka firmapaylayor, aslan payn Intel, daha sonra AMD geliyor, Cyrix ve Nexgen gibi diermikroilemci reten firmalarn isimlerini pek duymuyoruz.

    X86 tabanl sistemlerin mimarisi birbirine benzer. Birde X86 tabanl olmayansistemler vardr. Apple firmasnn iMAC bilgisayarlar, yada SUN Microsystemsfirmasnn sistemleri X86 tabanl mikroilemciler kullanmadklar iin bu trbilgisayarda alan programlar X86 tabanl sistemlerde almazlar.

    unu unutmayalm; dnyada yaklak %90 orannda X86 uyumlu PC sistemikullanlyor. Bu yzden bu X86 assembly dili dier assembly dillerinden daha geerlibir programlama dilidir.ASSEMBLY PROGRAMA DL VE DERLER ?

    Assembly programlama dilini 3 kelime ile tanmlayacak olursak bunlar; GL,HIZLI ve KISA olurdu. Bu demek oluyor ki ayn program assembly dili ile ve C++programlama dili ile yaparsak, iki programn boyutlarna baktmzda assembly ileyazlan daha ksa olduunu grrz, ayn zamanda mikroilemciyi ve hafzay dahaverimli kulland iin assembly dilinde yazlan program dierlerine nazaran dahagl olacaktr, son olarak assembly dilinde yazlan program dierine oranla okdaha hzl alr.

    Son zamanlarda mikroilemcilerin hzlar GHzler (giga hertz - ciga herz diyeokunur) mertebesine ktndan assembly dilinin en byk zellii olan hzll artkpek popler deildir. Kullancya, 2GHz hzndaki bir CPU da hemen hemen heruygulama ayn hzda alyor gibi grnr. Buna ramen C gibi yksek dzeyprogramlama dilleri ile hazrlanan byk projelerde ilemciyi ok fazla meguledecek olan kod blmleri assembly rutinleri arlarak yaplmaktadr.

  • 8/14/2019 80x86 processor

    2/131

    NEDEN ASSEMBLY?

    X86 Assembly dilini renmek kolaydr ama bu dilde proje hazrlamak insan iledenkartabilir. Bu yzden gnmzde X86 assembly dili yerine, daha ok endstriyelalanda kullanlan microcontroller chiplerin assembly dili kullanlmaktadr. Birprogramc assembly dilinde byk uygulamalar hazrlamaz (genellikle). Bunun

    nedeni st dzey programlama dilleri olan delphi, C, C++, Pascala gre dahadikkat gerektirir ve kod yazm daha zordur. Programc assembly dilinde projehazrlayacaksa kulland sistemin mikroilemcisini ve hafza haritasnn yannda,sistemin donanmnda iyi bilmesi gerekir. Her eyden nemlisi zamandr ki sadeceassembly dili ile PC uygulamalar gelitirmek ine ile kuyu amaya benzer.Assembly alt dzey bir programlama dilidir yalnz alt dzey kelimesini yanlanlamayn, bu kelime bu dilin ilemciye ve hafzaya olan yaknln belirtir, stdzey diller ise daha ok programcya yani insana yakndr.

    Bu yzden assembly dilinin zel kullanm alanlar vardr. Ksaca bunlar sylesralayabiliriz.

    1- Bilgisayar sistemini yakndan tanmak iin,2- Device driver (cihaz srcleri) yazmak iin,3- Chiplere program yklemek iin (PIC, microcontroller gibi...)4- letim sistemlerinin yapmnda (OS),5- ifre krma ve Hacking ilemleri iin,6- Virs programlar yazmak iin,7- Elektronik tablolama (Excel gibi) programlarnda.

    LK X86 ASSEMBLY KODLARIMIZ

    PC platformunda dorudan hafzaya sembolik kod kullanmadan yazacamz bu programck iinherhangi bir editr ve derleyici download etmenize gerek yok. DOS veya Windows iletim sistemine

    sahip bir PC kullanmanz kafidir. Srasyla unlar yapn;

    1- Balat mensnden altr tklayp cmd programn altrn. ayet Windows 98 kullanyorsanzbalat mensnden MSDOS komut istemini altrmanz gerekiyor. Hala DOS iletim sisteminikullanyorsanz bilgisayarnzn power butonuna basmanz yeterlidir :) yani halihazrda komut istemindeolan bir trex siniz.

    2- Komut istemindeyken cd\ yazn ve root dizinine gein burada kendinize md asm yazarak asmadnda bir klasr oluturun ve cd asm komutu ile klasrn iine girin. Tabi ki klasr oluturmak iin bukadar eziyet ekmenize gerek yok, amacmz biraz nostalji. Maksat projemiz bir klasrde olusun.

  • 8/14/2019 80x86 processor

    3/131

    3- Debug yazp enter tuuna basn. Resimdeki grld gibi debug program altrldnda ekrannsolunda bir - simgesi grlr ve bu programla harikalar yapabilirsiniz :)

    4- E 0100 yazp enter tuuna basnz.

  • 8/14/2019 80x86 processor

    4/131

    5- b4 yazp boluk tuuna (space bar) basn, 09 yazp boluk tuuna basn, ba 0b 01 cd 21 b4 4c cd 214d 45 52 48 41 42 41 20 41 53 53 45 4d 42 4c 59 24 deerleri iinde ayn ilemi tekrar edin :) ayetarada bir yerlerde hata yaparsanz klavyeden enter tuuna basp 4. admdan itibaren yenidenbalayn. lem bitince ekran grnts aadaki gibi olacaktr.

    6- Klavyeden Enter tuuna basn ve ekran grnts 3. admdaki gibi olunca g tuuna basp ardndanson olarak enter tuuna tekrar basn.

  • 8/14/2019 80x86 processor

    5/131

    Yukardaki ekran ktsnda grld gibi konsol ekranna MERHABA ASSEMBLY yazdrdk ve debugprogramndan kp komut istemine geri dndk. Hala hevesiniz krlmadysa :) neler yaptmz tek-tek aklayalm.

    Debug program Microsoftun tm iletim sistemlerinde bulunan, hafza ve CPUnun iindekilerigrmemizi, dzenlememizi salayan bir programdr. ok ilkel bir program olmasna ramen beynimizinderinliklerine PCnin yapsn kazyacak olan ve bir assembly programcsnn bilgisayara ne ekildebakmas gerektii konusunda yardmc olacak yegane programlardandr. En fazla 2 makale sonra

    Debug programn kullanmay brakp daha jan-jan l debuger programlar kullanacaz, imdilik byleidare edelim.

    Biraz nce Debug programnn kendisi iinde kullanacamz e (enter) ve g (go) komutlarn kullandk.e komutu hafzaya kod girii yapmamz salar ve g komutu ise CPUya u sihirli kelimeyi sylememizisalar; "Ey CPU yazdm bu kodlar srasyla altr bakaym". CPU programcnn sadk klesiolduundan aynen denileni yapar.

    E komutu ile hafzaya giri yaptmz syledik, komut isteminin en solunda 152F:0100 gibi bazrakamlar grdnz, buradaki 152F sizin bilgisayarnzda farkl olabilir, ama 0100 ayndr. ite : simgesiile ikiye ayrlm bu 8 rakam hafzann adresidir. Kodlar hafzaya yazlr, silinir, deitirilir fakat busrete deimeyen tek ey hafza adresidir. Adresler her zaman bizim onlar doldurmamz veya

    erimemiz iin hali hazrda beklerler, bunu evinizin adresine benzetebilirsiniz. Eve anne gelir baba gelirarkada gelir bazen tatilde bo kalr yani evin iindekiler deikendir ama ama ev adresi her zamansabit kalr, ta ki ev yklana kadar :)

    E komutu ile bu rnekte hafzann 152F:0100 adresi ile 152F:011B adresleri arasn makine kodlar iledoldurduk. Bunu yaparken kod yazacamz adreste hali hazrda hangi kodun olduunu grme gibi birlkse de sahiptik, tesadfen hepsi 00d. Makine kodlar CPUnun anlayaca yegane kodlardr ve 2lik(binary) yada 16lk (hexadecimal) gsterimle ifade edilirler. Zamanla binary gsterim biraz fazla yerkapladndan hexadecimal gsterim benimsenmitir. Daha sonra hexadecimal gsterimin anlalmaszor olduundan sembolik kodlar ile yazlan Assembly programlama dili gelitirilmitir. nsan olurahatna pek dkn olduundan :) daha sonra, kod yazmas ve anlalmas daha kolay olan BProgramlama dilini gelitirmi bu da yetmemi C dilini gelitirmitir. (Bu sralamada Assemblyprogramlama dilide A oluyor tabi ki) Programlama dilleri ABC diye devam derken C harfini ok sevenprogramclar buna ++ ve # gibi aksesuarlar takarak deiik varyasyonlar denemiler ve okta baarl

  • 8/14/2019 80x86 processor

    6/131

    olmulardr :) Neyse laf fazla uzatmadan ve "ey programc gemiini bilmeyen geleceinden birhaberdardr" diyerek konumuz geri dnelim.

    X86 PClerin hafzas byte adreslenebilir diye bir programc ata sz vardr. Bu sz her adrese en fazla1 bytelk kod yazabileceinizi anlatr. Bizde burada yle yaptk zaten, toplam 28 hafza konumuna

    (memory location) kod yazdk ve greceksiniz biraz sonra program derleyip dosya haline getirincedosya boyutu 28 byte olacak.

    Debugn g komutu ise mehur fetch-decode-execute srecini yani hafzadan al getir - kodunu z -icra et srecini balatr. te biz buna halk dilinde program alyor diyoruz. Program mikroilemci(CPU) altrr ve programc tarafndan ksmen kullanlabilir. Bu sre programclar fazla ilgilendirmez,daha ok donanmla alakaldr, bu yzden ayrntya girmiyorum. Ama ok istek gelirse bu arkydasizler iin syleyebilirim :)

    BU KODLARI OK SEVDYSENZ GELN BUNLARI SAKLAMAK N BR PROGRAM DOSYASIOLUTURALIM

    Bu ilemi yapmak iin ncelikle programda ne kadar kod kullandmz bilmemiz yani programn bytecinsinden uzunluunu bilmemiz gerekir. Kodlar kendi elimizle teker teker girdiimizden uzunluunun28 byte olduunu biliyoruz. Emin olmak iin 5. admdaki ekilden faydalannz. Dosya oluturma ilemiiin ilk nce CPUnun CX kaydedicisine (CX ne yahu, kaydedicide ne demek kardeim dediinizi duyargibiyim merak etmeyin bu terimler ileride hi aznzdan dmeyecek) 28in hex. karl olan 1Cyiyazacaz. Daha sonra debugn N komutu ile dosyaya isim vereceiz ve son olarak W komutu ileharddiskimize kayt yapacaz. Son olarak debugtan kp komut istemine geri dneceiz veoluturduumuz program altracaz. Ltfen aadaki ekli inceleyiniz. (Yalnz komut istemi

    penceresini kapattysanz iiniz ya 1.adma geri dnmeniz gerekiyor nk kodlar hafzadan silinmiolabilir)

    Mehur DOS komutlarndan olan "dir" ile tekrar bir nostalji yapp dosyamz grelim :)

  • 8/14/2019 80x86 processor

    7/131

    Grld zere 28 bytelk merhaba.com adl dosyamz oluturuldu ve altrlmaya hazr, o zamanhemen altralm.

    Programmz konsol ekranna MERHABA ASSEMBLY yazd ve iletim sistemi tarafndan sonlandrld.Programmz bir dosya haline getirdik, Microsoftun iletim sistemlerinde 2 tr program dosyasmevcuttur ve bunlar dosya ismini takip eden EXE ve COM uzantlar (file extensions) ile tannrlar. Birburada COM olanndan oluturduk, endielenmeye gerek yok EXE uzantl dosyada oluturacaz veCOM ile EXE arasnda ne gibi farklar var onlar da greceiz fakat bunlar bizim iin henz ok ilerikonular, sabretmek lazm :)

    Bu program bir sonraki makalemize kadar silmeyin, nk bir sonraki makalemizde bu dosyadanfaydalanp sembolik kodlardan oluan assembly diline gei yapacaz ve eksik kalan noktalartamamlayacaz. Siz bu arada bo durmayp bu kodlar zerinde oynamalar yapabilirsiniz zellikle 12.koddan itibaren son koda kadar olanlar deitirin (son kod hari) nk bunlar MERHABA ASSEMBLY

  • 8/14/2019 80x86 processor

    8/131

    yazsnn ASCII kod karldr. Bunun iin ASCII kod tablosundan faydalanabilirsiniz. Baka birprogramlama dili biliyorsanz ayn yazy yazan program o programa dili ile yazp dosya boyutunuburadaki ile karlatrnz. Ayrca Debug programnn dier komutlarn grmek iin - iaretiningrld modda ? yazp enter tuuna basnz.

    Sembolik kodlar ve X86 Assembly Dili

    Geen makalemizde debug programn tanm ve makine kodlar ile kk bir programhazrlamtk. Sonra bu program yine debug ile bir dosya haline getirmitik. imdi budosya ile biraz daha yakndan ilgilenelim. Yine komut istemine gei yapp debugprogramn ekildeki gibi altralm.

    Not:Geen makalemizdeki dosyay kaybettiysenizburadan indirin ve C:\ dizininde asmadnda bir klasr oluturun ve bu dosyay oraya kopyalayn.

    ekil 1 - Debug ile program ykleme

    Ekrann solunda bir - iareti greceksiniz ve baka hibir ey olmam grnecek amaaslnda merhaba.com adl program dosyasn oluturan makine kodlarn oktan hafzayayklediniz bile. Makine kodlarn grmeden nce sizlere kk bir tavsiye vermekistiyorum. Assembly programlama dilinde ayrntlar ok nemlidir ve her bir ayrnt kendiapnda bir aratrma konusu olabilir, rnein burada yaptnz program ykleme ileminiwindows kullanclar, programn simgesine mouse ile tklayarak yapyorlar ve hatta buekilde program hafzaya yklendikten sonra birde iletim sistemi tarafndan altrlyor.imdi aklnza u soru gelmeli; program simgesinin zerine gelip mouse ile tk-tk

  • 8/14/2019 80x86 processor

    9/131

    yapld andan itibaren, programn yklenip altrlmasna kadar sistemde neler ve naslyaplyor? yle deil mi? Nelerin yapldn geen makalemizi takip ettiyseniz tahminedebilirsiniz ama nasl yapldna gelince o i biraz sistem programclna giriyor yanibizim iin biraz erken. Neyse biz konumuza geri dnelim, program u anda hafzada ve0100h offset adresinden itibaren yklenmi durumda. Hemen kodlar grelim o zaman.

    ekil 2 - Debug n "d" komutu

    Debug n d komutu "dump" anlamna gelip programlama aleminde kodlar ekrana yadakada dkmek gibi bir anlam vardr. Bizde burada kodlar ekranda gsterdik. Neden0100h adresinden itibaren hafzaya yerleti? sorusunun yant program dosyasnn .comuzantl olmasndan kaynaklanr ve geen makalemizde akladmz gibi sonrakimakalelerde ele alnacak bir konudur. Burada nemli olan husus sizin 0100 offset adresiile 010B offset adresleri arasnda kalan makine kodlarndan bazlarnn komut kodlarbazlarnn ise data (veri) kodlar olduunu bilmenizdir. Tabi ki ekrana yazdrlacak olanMERHABA ASSEMBLY burada data snfna giriyor peki komutlar nerede?

  • 8/14/2019 80x86 processor

    10/131

    ekil 3 - Datalarmz...

    Krmz ile iaretli olan ksmdan ncekiler (dikkat bu ksmdan sonraki kodlar biziilgilendirmiyor) yani 0100h ile 010Ah adresleri arasnda kalan ksm naizane komutkodlarmzdr. Tabi ki bu ekli ile bize pek bir ey artrmyorlar ayet bunlar bizlerinanlayabilecei dile biraz yakn olsayd anlardk.

    ekil 4 - Makine ve Assembly Dili Yan yana

    Yukardaki ekilde makine kodlarn sar assembly kodlarn krmz erevedegrebilirsiniz. Tabi ki assembly dili bizlere daha yakn bir dildir. Assembly dilindeki bu

  • 8/14/2019 80x86 processor

    11/131

    gsterim ayn zamanda sembolik kodlar olarak ta bilinir. Kodlar assembly dilinde grmekiin debug n "u" (unassembly) komutunu kullandk, u dan sonra gelen 0100 010A isehafza araldr, yani biz burada 0100h-010Ah offset adresleri arasnndaki makinekodlarn assembly dilinde grm olduk. imdi yukardaki ekilde grdmz makineve assembly kodlarn karlatralm;

    B409 MOV AH,09

    Assembly dilindeki MOV AH,09 un makine dilindeki karlnn B409 olduu grlyor veassembly programclar "B409" ile gsterilen makine dilindeki bu ifadeyi iki ksmaayrrlar. Bunlar opcode ve operand alanlardr.

    Opcode Operand

    B4 09

    Tablo 1 : Opcode ve Operand

    Buradaki B4 opcode u ilenecek olan asl emirdir ve ancak mikroilemci (CPU)tarafndan kodu zldkten sonra 09 operanda komut ileme srecine katlr. Buradasadece opcode ile operand ayrmanz yeterlidir assembly dilindeki ifadeleri ne anlamageldiini imdilik nemsemeyin. Intel in opcode uzunluu 1 yada 2 byte lktr. 2byte lk olan opcode lar 0F ile balar. Biz imdilik hep 1 byte lk opcodelar ilealacaz. Operandlar ise herzaman opcode lardan sonra gelir ve X86 mimarisinde1,2,4 veya 8 byte lk olabilir. Bylece ortaya karma kark bir komut seti kar, buyzdende Intel in x86 ailesi CISC (Complex Instruction Set Computers) olarak anlrlar.

    BA0B01 MOV DX,010B

    Burda 3 byte lk bir komut satr, opcode 1 byte lk operand 2 byte lk. Ama imdikafamzda 2 tane soru iareti var, birincisi neden MOV komutunun makine dilinde 2 tanefarkl opcode u var? (yani B4 ve BA dan bahsediyoruz ve aslnda MOV komutununmakine kod karl 2 den de fazladr) ve ikinci soru neden MOV DX,010B iin operandksm makine dilinde 0B01 olarak ters bir biimdedir?

    Opcode Operand

    BA 0B 01

    Tablo 2 : Opcode ve Operand

    Bu sorlarn cevab X86 uyumlu mikroilemci mimarisini anlayarak bulabilirsiniz. lk olarakB4 veya BA MOV un karl gibi grnse de yle deildir, B4= MOV AH n BA=MOVDX in opcode karldr. Yani ikisi de farkl assembly ifadeleridir ve farklopcode larnn olmas son derece normaldir. kinci sorunun cevab ise x86 ailesindekiilemcilerin hafzaya erime ekillerinin ters sral olmasndan kaynaklanr. Tabi ki birdedz olarak byte lar yerletirme olay var, bunlar kitaplarda little endian byte ordering vebig endian byte ordering olarak geer. Aslnda byte dzenleri ok ok ileri seviyedenemli konulardr ayrca opcode lar gsterirken seilen bu hexadecimal deerlerde (B4ve BA gibi) rastgele seilmi deerler deildir. Bu tr konular rencilik yllarmdaykenaratrmtm, gerekten epey zevkli konular, genellikle yksek lisans ve doktorasnflarnda instruction anatomy (komut anatomisi) bal altnda incelenen konulardr.

  • 8/14/2019 80x86 processor

    12/131

    Programclk asndan ise sadece byte dzeni nemlidir. Bu yzden burada sadece buniki kavram aklayacam.

    Little Endian Byte Ordering: Hafzda yklenecek olan byte lar dk deerlikli ksmndanitibaren yazlr. rnein 1234 gibi iki byte lk bir veriyi hafzaya 0100 offset adresindenitibaren yazdnz dnelim, bu ilem bitip hafzaya baktnzda greceiniz ey

    0100=34, 0101=12 olacaktr.

    ekil 5 - Little endian byte dzeni

    Burada debug n "a" (assembly) komutunu vererek assembly dilinde program yazmamoduna getik ve dw talimat ile hafzaya 1234 deerini girdik ve hafzaya, nce busaynn dk deerlikli byte sonrada yksek deerlikli byte yazld.

    Big Endian Byte Ordering: Hafzaya yklenecek byte lar en yksek deerlikli ksmndanitibaren yazlr aynen bizim kat stne saylar yazdmz gibi. Sizlere burada bir tanedebig endian rnei vermek isterdim fakat u anda elimde bir Apple PowerPC olmasnaramen MAC OSX iletim sistemi iin debugger yok :( Aadaki tablo hangi sistemlerinhangi byte dzenini kullandn gsteriyor.

    lemci Tr letim Sistemi ByteDzeni

    Digital Alpha AXP Tru64 UNIX little-endian

    Hewlett Packard PA-RISC HP-UX big-endian

    IBM RS/6000 AIX big-endian

    Linux little-endian

    Intel x86

    Windows little-endian

  • 8/14/2019 80x86 processor

    13/131

    Solaris x86 little-endian

    Motorola PowerPC Macintosh OS X big-endian

    SunOS big-endian

    Sun SPARC Solaris big-endian

    SGI R4000 Irix big-endian

    Tablo 3 : reticilerin ou big-endian tercih ederken dnyada en ok kullanlan little-endianbyte dzeni :)

    CD21 INT 21B44C MOV AH,4CCD21 INT 21

    INT 21 de bir byte lk opcode u ve bir byte lk operand olan baka bir komut satr.Bu arada MOV AH,4C nin opcode u ile yukarda akladmz MOV AH,09 unopcode larnn ayn olduuna dikkatinizi ekerim.

    Buraya kadar ;

    1- Neo nun Matrix i grd gibi bizlerde hafzaya baktmzda orada grdmzbyte lar nasl yorumlayacamz grdk, bu yolda kendinizi gelitirmeye kalkarsanzsizde belki bir gn Matrix i grebilirsiniz :) Yllardan beri ben hafza dkmlerinebakarm onlarda ekrandan doru bana bakarlar ama program boyutu 10Kb geinceinsan halslasyonlar grmeye balyor onuda belirteyim :)

    2- Makine kodlar ile assembly kodlar arasndaki banty grdk, Borland gibi birderleyici (compiler) yazan bir firma kurmak isterseniz, bu alanda en az bir doktora tezivermeniz gerekir. Yani for (int i=0 ; i

  • 8/14/2019 80x86 processor

    14/131

    ekil 6 - Programmzn paralar

    Yukardaki ekilde algoritmanzn assembly koduna dnm halini gryorsunuz.Tamam, geen hafta bu program yazarken algoritma falan hazrlamadk ama nceekrana yazdr sonra k mantn iin de algoritma yazlmaz herhalde :)

    Bu program DOS un mehur kesmelerinden (interrupt) 2 tanesini ard aslnda,birincisi 9. fonksiyon olan "Display String", ikincisi fonksiyon numaras 4C olan

    "Terminate Program". Bunlar syledikten sonra ne desem kafanz karacak bu yzdenbu olay daha iyi anlamanz iin aadaki diyalogu hazrladm. Buradaki acemi assemblyprogramc (AAP) azck assembly bilgisi olan birini, tecrbeli assembly programcs (TAP)yeterli derecede bilgisi olan bir programcy ima ediyor.

    Acemi programcnn kafasnn iinden geenler;

    AAP- Assembly dilinde ekrana bir ey yazdracam!AAP- Hafzaya datalar girer sonrada bunlar ekran kartna gnderirim nasl olsa ekrankart daha sonraki ilemleri kendisi halleder,AAP- Ama gnderme ilemini nasl yapacam, hmmm ben en iyisi bir bilene soraym.AAP- Merhaba TAP, sana bir sorum olacak ekrana MERHABA ASSEMBLY yazdrmak

    istiyorum ama ekran kartna byte lar nasl gndereceimi bilmiyorum, bana anlatrmsnltfen?TAP- Hangi iletim sistemini kullanyorsun?AAP- Windows!TAP- Byte lar ekran kartna gndermene gerek yok, onu senin yerine iletim sistemiyapar zaten.AAP- Peki nasl olacak?TAP- INT 21 in 9. fonksiyonu senin iin birebir, ilemcinin AH kaydedicisine 09, DXkaydedicisine karakterlerin balang adresini yaz, sonrada 21. interrupt servisini ar.Ha bu arada son karakterden sonra hafzaya bir $ iareti koy ki interrupt servisi yazlacakkarakterlerin bittiini anlasn. Anladn m?AAP- Anlar gibi oldum? Ama ben bu ii kendim yapamaz mym?

    TAP- Yaparsn tabi ama ok ekmek yemen lazm :)AAP- Nasl yani?(bu arada TAP n glne de kzar tabi)TAP- Bak AAP karde, Windows gibi iletim sistemini yazan programclar senin gibi

  • 8/14/2019 80x86 processor

    15/131

    programclarn ekrana bir ey yazmak isteyeceini, veya klavyeden bir bilgi alacanyada yazcdan kt almak isteyeceini dnerek baz kk programlar yazp iletimsistemlerine gmmlerdir. Sende bu hizmetlerden faydalanr ve Amerika y yenidenkefetmeye gerek duymazsn.AAP- Evet ok akllca dnmler dorusu...TAP- letim sistemi de bu demektir zaten AAP, programcya, kullancya bilgisayar

    kolayca kullandrabilmek.AAP- Teekkr ederim TAP sonra grrz.TAP- (AAP nin sonra tekrar gelip baka interrupt servislerini de soracandanendielenerek) Hey AAP, bak buradan dier interrupt servislerine de bakabilirsin, hanilazm olur diye sylyorum...AAP- Teekkrler TAP.

    Daha sonra AAP bilgisayarnn bana gider yukardaki ekildeki programn ilk satrnyazar ve altrr, tabi ki ekranda MERHABA ASSEMBLY grnr ama komut istemindekipenceresini kilitlenir, nk ekrana yazdrma ileminden sonra programsonlandrmamtr. Bunun zerine program sonlandrmak iin tekrar interrupt servisleriniaratrmaya koyulur ve interrupt 21 in 4C fonksiyonunu kefeder. MOV AH,4C ve INT 21

    satrlarn da programna ekledikten sonra program kusursuz alr.

    Interruplar hakknda imdilik bu bilgiler umarm sizi tatmin etmitir. lerleyenmakalelerimizde interruptlar daha yakndan ele alacaz, bu konular gerektende okzevkli.

    Yukardaki diyalog ta kaydediciler (register) diye bir kavram geti, bunlar imdilikmikroilemci iindeki hafza konumlarna (memory location) benzeyen yaplar olarakdnn. Kaydedicilerin listesini grmek iin debug programn kullanabilirsiniz.

    ekil 7 - Kaydedicileri debug ile grmek iin r (registers) komutunu kullanabilirsiniz.

    X86 kaydedicilerinin AX, BX, CX, DX, SP, BP... diye adlar vardr ve bunlarn hepsinindeiik ilevleri mevcuttur. Program yazarken elbette bunlar kullanacaz ama imdilik

    zmn yiyin ban sormayn, nk ban yerini sylersem ve sizde gider o baabakarsanz itahnz kaabilir. Kafalar fazla karmadan yeni bir uygulama yapalm.

  • 8/14/2019 80x86 processor

    16/131

    10 defa Merhaba Assembly Yazdryoruz

    Tabi byle bir ii yaptrmann deiik yollar mevcut ( bir .bat uzantl script dosyashazrlayp ilk programmz 10 defa altrmak bunlara dahil deil tabi :) ) imdiyazacamz programda ilk programmzn ilk satrn 10 defa altrp sonra programsonlandracaz. C dilindeki for dngs gibi. Aadaki ilemleri takip edin.

    ekil 8 - 10 defa alt alta MERHABA ASSEMBLY yazan program

    Program yukardaki gibi hafzaya girdikten sonra bir nceki makalemizden faydalanp buprogram dosya haline getirin, byte lar saymada sizler iin pratik olur. Burada CXkaydedicisine (0A)16=(10)10 deerini saya olarak yklyoruz. LOOP komutu CX indeeri kadar operand ile belirtilen adrese dallanr, burada dallanlacak adres 0103 offsetadresidir ve bu ilem sayesinde ekrana 10 defa MERHABA ASSEMBLY yazlr. Daha sonraprogrammz fonksiyon:4C interrupt 21 ile sonlanyor. Buradaki string e dikkat, debugile assembly modunda hafzaya bir dizi karakter girmek iin DB (Define Byte) talimatnkullanyoruz. Talimatlar (daha sonra ayrntl bir ekilde greceiz) derleyiciye verilir yaniopcode olarak dntrlmezler, ayn C deki int, double, string veri tipleri gibi. DB densonra ayet byte lar karakter olarak girmek isterseniz " " arasna yazmalsnz. Bu ilemikarakterlerin hexadecimal kodlarn yazarak ta yapabilirsiniz bu sefer her bir karakterden

    sonra "," koymanz gerekir. Burada her iki teknikte kullanlmtr. ASCII kod tablosunabakacak olursanz 0A=LF yani Line Feed (bir satr aa) 0D=CR yani Carriage Return(Kursr satr bana) olduunu grrsnz, zaten CR ve LF kontrol karakterleriolduundan dolay standart ASCII kod tablosunda A,C,P,Z gibi normal karakter olarakkarlklar yoktur mecburen hex. kod karlklarn kullanmak zorunda kaldk. INT 21fonksiyon 9 ile yazdracanz karakter dizilerinin sonunda mutlaka 24=$ bulunmal yoksabu interrupt servisi hafzada 24 deerini bulana kadar ekrana yazma ilemine devameder.

    Bu programn kodlar ile oynayarak konuyu daha iyi kavrayabilirsiniz, rnein 0Dkarakterini kodlardan kartn yada CX e yklenen deeri deitirin.

    Son olarak debug ile bu program adm adm altrabilirsiniz, bunun iin program yazmailemi bitince P (Proceed) komutunu kullann T (Trace) komutu ile programnz iindenarlan interrupt servislerine de girebilirsiniz (ama kabilirmisiniz orasn bilemem)

  • 8/14/2019 80x86 processor

    17/131

    Debug tan kmadan bir daha programnz altrmak iin "r ip" komutunu kullanarak ipkaydedicisini 0100 yapn, bylece programn balang adresini doru ayarlamolursunuz.

    ekil 9 - Adm adm program ilemek

    Temel Assembler Bilgisi

    Assembly programlama dili, kullanlan bilgisayar sisteminin yapsna ve iletim sistemigibi platformlara sk-skya baml bir dildir. Bu yzden biri gelirde "ben assembly dilinibiliyorum" derse sakn inanmayn :) nk ok fazla ey bilmi oluyor.

    Assembly dili diye bir ey yok!

    Ama o kii X86 PC Assembly dili, Power PC Assembly dili veya 8051 Assembly dili

    biliyorum deseydi o zaman i deiirdi. X86 PC Assembly dili, Power PC Assembly dili gibibir snflandrma bile tam olarak her eyi ifade etmez. rnein X86 PC Assembly dilidonanm platformunu tanmlar ve bu donanm altracak iletim sistemi Windows,Linux, Solaris olabilir, her bir iletim sisteminin hafzay ele al ekli baka olduundanprogramclar iletim sisteminin hafza organizasyonunu gz nne almakmecburiyetindedirler. Ayrca kodlarnz derlerken kullandnz program olanAssemblerda ie ayr bir snrlama koyar. rnein donanm X86 bir PC, iletim sistemiWindows olsun, bu durumda assembler olarak Netwide kullanrsanz farkl Turboassembler kullanrsanz farkl talimatlarla program kodu yazmak zorunda kalrsnz ve bukodlar ad geen assembler programlar tarafndan makine koduna evrilirler. Sonuolarak assembly dilinin programclk asndan en byk dezavataj budur. Fakatassemblyyi hzl ve zelliklede salam bir dil yapan unsurlarda bu dezavantajn

    sonucudur.

  • 8/14/2019 80x86 processor

    18/131

    Bunca donanm ve iletim sistemi iinde acaba hangisi en ok kullanlyor? Intelinilemcileri ve Microsoftun iletim sistemleri tabi ki. te bizde Intel uyumlu veMicrosoftun MSDOS ve Windows iletim sistemlerine uygun bir assembly dilizerine makalelerimizi yazyoruz. Yani, "Bu programa dilini zor mudur?" sorusuna,

    programa dilini brak ad bile zordiyebilirsiniz. Bu yzden assembly denildikten sonragenelde "hangi assembly?" kelimesi de konuulur. Konularn iinde boulup kalmamak

    iin biz bu programlama dilinin neresindeyiz ve bundan sonra hangi rotay izlememizgerekiyor gibi sorular sanrm yukardaki paragrafta aklam olduk.

    Umarm bundan sonra makalelerimizde assembly dili kelimesini getiinde neyianlamanz gerektiini anlamsnzdr. Bundan sonraki makalelerde izleyeceimizassembly dilinin tek bir eksik yan kald ite o da hangi assembler kullanacamz.

    Hangi ASSEMBLER?

    Assembler bir eit programdr ve assembly kodlarn makine kodlarna evirir.

    ekil 1 - Assembly dilinden Makine diline

    X86 uyumlu (eski tabiri ile IBM uyumlu) PCler iin en popler assemblerlar TASM, MASMve NASM dr.

    Assembler Tam Ad retici

    TASM TurboAssembler

    Borland

    MASM

    Microsoft

    MacroAssembler Microsoft

    NASM NetwideAssembler LGPL

    Tablo 1 : En Popler Assemblerler

    X86 ailesi iin daha baka assemblerlarda mevcut fakat en ok kullanlanlar yukardasaydklarmzdr. MASM ve TASM .asm uzantl bir dosyann iindeki assembly ifadelerinive direktiflerini okur ve bunlar makine kodlarna dntrr. NASM ise TASM ile MASMnbu yaptna ek olarak Linux ve Unix ortamlarnda da alr. TASM ve MASM kardeassemblerlardr. Yazm kurallar hemen hemen ayndr. Peki hangi assembler semeli?

    Aslnda bu yapacanz projeye bal tabiki, rnein Visual Studio IDEsi ile C++uygulamalar gelitiriyorsanz MASM kullanmanz daha akllca olur, en azndan MSDNdedestei mevcut. Biz makalelerimizde hem TASM hemde MASM kullanacaz.

  • 8/14/2019 80x86 processor

    19/131

  • 8/14/2019 80x86 processor

    20/131

    ekil 4 - Her derde deva Notepad ile programlarnz ANSI olarak kaydetmeniz gerekiyor.

    Peki bu yazy yazan editrn editr seimi nedir? :) Ben sizlere GVIMi tavsiye ediyorum.GVIM hemen hemen tm popler assembler sz dizimini (syntax) destekledii gibi tmpopler programlama dillerinin de sz dizimini destekleyen sper bir editr. TASM, MASMve GVIM bu makalenin sonundaki download ksmndan edebilirsiniz.

  • 8/14/2019 80x86 processor

    21/131

    ekil 5 - Gvim ile assembly kodlarn yazmak daha kolay, program altrdktan sanrayazma moduna gemek iin klavyeden i tuuna basmanz gerekiyor.

    Editr programlarn ksaca tanttk dan sonra artk gvim ile rnek bir assembly programyazabiliriz.

    Nihayet Assembly

    imdi geen makalemizde yazdmz program tekrar yazacaz ama bu sefer kaynakkodlarmz .asm uzantl bir dosyada olacak. GVIMi altrdktan sonra klavyeden ituuna basp aadaki kodlar yaznz yada kaynak kod dosyasn buradan downloadediniz.

  • 8/14/2019 80x86 processor

    22/131

    ;########################################;# Bu program ekranda Merhaba Assembly yazsn gsterir #;# Son Gncelleme: 14/02/05 #;# Yazan --> Eren ERENER #;########################################

    .MODEL SMALL

    .STACK 32

    .DATA

    Dizi DB "Merhaba Assembly",0Ah,0Dh,24h

    .CODE

    ANA PROC

    MOV AX, @DATA ;Data segmentMOV DS, AX ;ayarlanyor.

    MOV CX, 0Ah ;Saya=10.ONDEFA:MOV AH, 9 ;Ekrana,

    MOV DX, OFFSET Dizi ;string,INT 21h ;yazdrlyor.LOOP ONDEFA ;Bu ilem 10 defa tekrarlanacak.

    MOV AH,4CH ;DOSaINT 21H ;dn

    ANA ENDP

    END ANA

    Assembly dili yazm kurallar ile program bu ekilde yazlyor, nasl daha nceyazdklarmzdan biraz farkl deil mi? Tm bu farkllklar sadece assembler iin.Assembler bu dosyay satr satr okuyacak ve makine koduna evrilecek ksmlar alglaypbunlar 1 ve 0lara evirecek. Vakit kaybetmeden bu kodlar program dosyas halinegetirelim. Bunun iin ilk nce assembler programna sahip olmamz gerekiyor. Assemblerprogramlarndan dilediinizi buradan download ettikten sonra aadaki admlar sraylatakip ediniz.

    MASM ile derleme ilemi

    1- masm.zip dosyasnn ieriini C srcsne (yada istediiniz herhangi bir srcyemesela burada E:\ srcs rnek olarak verilmitir) anz,2- merhaba.asm dosyasn da bu klasre kopyalaynz,

  • 8/14/2019 80x86 processor

    23/131

    ekil 6 - almalarnz bir klasr iinde olsun

    3- ml/c dosyaadi.asm eklinde kaynak kodunuzu assembly ediniz,

    4- Bu ilemin sonunda assembler merhaba.obj adnda bir obje dosyas oluturur,5- Program dosyas oluturmak iin .obj uzantl dosyay link16 merhaba.objkomutu ilelink etmeniz gerekiyor. Bundan sonraki admlar enter tulayarak gein.

    ekil 7 - MASM ile assembly ve link ilemleri

    6- Programnz dosya adn yazarak altrabilirsiniz.

  • 8/14/2019 80x86 processor

    24/131

    ekil 8 - Program altrmak iin dosya adn yazp enter tuuna basmalsnz :)

    TASM ile derleme ilemi

    1- tasm.zip dosyasnn ieriini C srcsne (yada istediiniz herhangi bir srcyemesela burada E:\ srcs rnek olarak verilmitir) anz,2- merhaba.asm dosyasn da bu klasre kopyalaynz,

    ekil 9 - almalarnz bir klasr iinde olsun

    3- tasm dosyaadi.asm eklinde kaynak kodunuzu assembly ediniz,4- Bu ilemin sonunda assembler merhaba.obj adnda bir obje dosyas oluturur,5- program dosyas oluturmak iin .obj uzantl dosyay tlink merhaba.objkomutu ile linketmeniz gerekiyor.

  • 8/14/2019 80x86 processor

    25/131

    ekil 10 - TASM ile assembly ve link ilemleri

    6- Programnz dosya adn yazarak altrabilirsiniz.

    ekil 11 - Baardk programmz alyor

    Dikkat ederseniz her iki assemblerda ayn kaynak kodunu derledi ve sonunda .exeuzantl bir program dosyas oluturdu bu assemblerlar deiik parametrelerle kullanp.com trnden dosyalarda oluturabiliriz. Aslnda ben bu kaynak kodunu TASM iinyazmtm ama nceden de dediim gibi iki assemblern da ok fazla ortak yan vardrfakat bu ayn olduklar anlamna gelmez ve her zamanda ayn kaynak kodunuderlemeyebilirler. Buradaki basit bir program olduundan sorun kmad ve biz uzun birsre byle basit programcklar yazacaz. Bu yzden u anda derleme aamasnda hangiassembler kullandnzn pek bir nemi yok.

  • 8/14/2019 80x86 processor

    26/131

    Burada download ettiiniz assembler ve linker programlar TASM ve MASM paketininiinden alnm dosyalardr. Daha sonra tm paketi vereceim imdilik bu kadar yeterli.

    imdi kaynak kodlarmz bir daha gzden geirelim ve dikkatimizi rakamlarn sonundakih harfine odaklayalm. h harfi burada rakamn veya saynn hexadecimal (16lk saysistemi) olduunu gsterir. Biz debug ile program yazarken bunu belirtmemitik nk

    debug her yazlan sayy hex. olarak (daha dorusu binary olarak) kabul eder. Bumakalemize say sistemlerine ksaca inceleyerek son vereceiz. Kaynak kodumuzu satrsatr anlatmam bekliyor olabilirsiniz ama bu ilemci kaydedicileri ve x86 hafza yapsnrenmeden bu i biraz zor.

    Bilgisayar Aritmetii

    Genelde programclk derslerinin ilk ve skc konularndandr say sistemleri, bunu nedeni;bu say sistemlerinin ne iin kullanldnn tam kavranamamasndan kaynaklanr. Aslndailemci saylardan falan anlamaz, sadece elektrik akmn var yada yok olmas temelinegre alrlar. Hani duymusunuzdur pentium ilemcinin iinde bilmem ka milyon tanetransistr var diye ite elektrik akmlar bu transistrler aracl ile kontrol edilir.Transistr yar iletken bir elektronik devre elemandr ve her modern elektronik cihazniinde bulunur. Birok kullanm alan olan transistrler bilgisayarlarda anahtarlamaeleman olarak kullanlrlar.

    ekil 12 - 1ler ve 0lar anahtarn ak yada kapal olmasn temsil ederler

    Elektrik akmlarnn gremeyeceimizden dolay bizler bu tr olaylar sembolize ederekanlayabiliriz. Elektrik akmnn olmayn 0 var olmasn ise 1 olarak kabul edince ortayadoal olarak 2 tane rakam olan bir say sistemi kar. Bizler 10 rakaml say sisteminikullanyoruz bilgisayar ise 2 rakaml say sistemini. Bu yzden bilgisayarda ilemesokacamz her veriyi ikilik (binary) olarak gstermemiz gerekir. Binary say sistemihacim olarak kat zerinde veya ekranda fazla yer kaplar bu yzden binary saysisteminin bir trevi olan 16lk say sistemi daha ok kullanlr. Burada say sistemleriarasnda nasl dnm yapldn anlatmayacam nk az ok programlama ileuraanlar bunlar zaten bilirler yada bu dnmleri hesap makinesi kullanarak yaparlar

    :) Yinede ok isteyen olursa anlatabilirim bunun iin bu makaleye yazacanz yorumlardabunu belirtin.

    Aadaki tablo 1den 15e kadar decimal (onluk tabandaki) saylarn hex. ve binarykarlklarn veriyor. Rakamlara bakacak olursanz assemblerin bunlar nasl ayrt edeceiproblemini anlarsnz. Btn rakamlar benzer sembolleri kullanyorlar bu yzdenassembly dilinde program yazarken say binary ise sonuna b hexadecimal ise h vedecimal ise d (yada hibirey) getirilir. Aadaki tabloda binary ksm 8 haneligsterilmitir nk x86 hafzas byte adreslenebilir yapdadr yani hafzada en kkrakamlar depolamak iin bile 8 hane (digit) kullanlr. Hexadecimal deerler de binarydeerlerin sanki sktrlm halidir. Herhangi bir hex. deerin 1 basama 4 bite denkgelir (nibble).

  • 8/14/2019 80x86 processor

    27/131

    Decimal Binary Hexadecimal

    0 00000000 00

    1 00000001 01

    2 00000010 02

    3 00000011 03

    4 00000100 04

    5 00000101 05

    6 00000110 06

    700000111 07

    8 00001000 08

    9 00001001 09

    10 00001010 0A

    11 00001011 0B

    12 00001100 0C

    13 00001101 0D

    14 00001110 0E

    15 00001111 0F

    Tablo 2 : Rakam karlk tablosu

    Kaynak kodumuzda saylardan sonra kullanlan h harfleri saylarn hex. olduunuassemblera bildirmek iin kullanlmtr. Ama isterseniz siz rnein 21h saysn 33 olarakdorudan yada 0010 0001b olarak yazabilirsiniz. Nasl yazarsanz yazn Assembler bu

    deerleri son olarak binaryye dntrecektir, ite .exe ve .com gibi ilemci tarafndanaltrlabilir program dosyalarna binary file denmesinin nedeni de budur. Ayn binary fileszc dier iletim sistemlerindeki ilemci tarafndan dorudan altrlabilecekdosyalar iinde kullanlr. Hatta linux, unix gibi iletim sistemlerinde bin klasr de iindebinary filelar olan klasr anlamna gelir buna baz ftp sitelerinde rastlayabilirsiniz.

    Assembly dilinde zellikle bir program dosyasnn kodlarn incelerken debuggerprogramlarnda grebileceiniz yegane saylar hexadecimal olduundan dolay bu saysistemini iyi bilmeniz gerekiyor diyorum ve bu makaleyi de burada sonlandryorum.

  • 8/14/2019 80x86 processor

    28/131

    Dosya Ad Aklama Dosya

    tasm.zip Assemblerve Linker Download

    masm.zip Assembler

    ve LinkerDownload

    gvim63.exe Editr Link

    Tablo 3 : Download

    Kaydediciler ve Hafza

    Mikroilemcinin ve hafzann fiziksel yaps ile programcnn bu donanmlara bak biraz

    farkl olabilir. te biz bu makalemizde programc gzyle bu donanmlar inceleyeceiz.Ayrca bu makalemizde yeni bir program yazarak kaydedicilerin nasl altn vemikroilemcinin hafzaya nasl eritiini anlamaya alacaz.

    Assembly programcs sisteme nasl bakyor?

    Mikroilemci bir ok karmak birimden oluur, neyse ki programclar donanmsal olaraksistemleri fazla yakndan bilmek zorunda deillerdir. Bir assembly programcs sadecemikroilemci iindeki birka kaydediciyle ilgilenir. Bunun dndaki birimler geneldeokullarda bilgilendirmek amacyla verilir, rnein CPU iinde bir ALU biriminin olduunubir ok programc bilir ama bu birimin almas ile ilgilenmezler. Bir assemblyprogramcs keskin baklarn mikroilemcinin iinden ekip :) sistemin tamamna

    baktnda bile, donanmlarn ve donanmlar birbirine balayan birimlerin almas ileilgili fazla birey gremez yada grmesine gerek yoktur. Programclk ve elektroniin snrnoktas budur aslnda. Assembly programclar kaydediciler, hafza veya sistemi oluturanbirimlerde dolaan elektron akmlarn 1 ler ve sfrlar olarak grrler ve genelde bu 1 ve0 lardan enaz 8 tanesini yan yana grdklerinde bir eyler anlamaya veya yorumlamayabalarlar.

    X nl gzlerimiz PC zerinde?

  • 8/14/2019 80x86 processor

    29/131

    ekil 1 - PC nin kabaca i organizasyonu

    Bir sisteme bilgisayar diyebilmeniz iin o sistemin en az 1 CPU, memory (RAM-ROM/Hafza) ve I/O (Input-Output/Giri-k) birimin olmas gerekir. Elbette bu birimlebirbirlerine yollar (bus) ile bal olmal ve sistemin alabilmesi iin hafzasnda birfirmware programnn ykl olmas gerekir. Yukardaki ekilde bu birimleri gryorsunuz.Dikkat ederseniz btn yollar CPU ya kyor, dier birimler arsnda dorudan birbalant yok, bunun byle olmas gerekir yoksa iler kontrolden kabilir. Aslnda hermodern bilgisayarda DMA (Direct Memory Access/Dorudan Bellek Eriimi) adnda birtransfer yaps mevcuttur fakat bu zellik kullanc tarafndan kapatlabildiinden dolaybirimler arasndaki en temel balant yukardaki ekildeki gibidir. Ayrca DMA zelliikullanldnda CPU veri transferinden elini ayan tamamen deil ksmen eker, CD-ROMkilitlenmelerinde Ctrl+Alt+Del kombinasyonun zorda olsa almas bundan dolaydr. Ne

    demiler kontrolsz g, g deildir :)

    Konuyu fazla datmadan isterseniz X nl gzlerimizle CPU ya zoom yapalm :)

    X nl gzlerimiz CPU zerinde?

  • 8/14/2019 80x86 processor

    30/131

    ekil 2 - Mikroilemcinin kabaca i yaps

    Sistemi iindeki birimleri birbirine balayan yollar, mikroilemcinin iinde de devam eder.BUS dediimiz bu yaplar birok iletkenden oluur. Kontrol yolunda R/W (oku/yaz) gibikontrol sinyalleri, veri yolundan ilenecek veriler gidip gelir. Adres yolu iste tek ynldrve CPU dan dier birimlere doru sinyal ak olur, rnein hafzaya bir veriyerletirilmeden nce adres yolundan verinin yerletirilecei hafza adresinin bilgisignderilir. Bunu daha iyi anlamak iin aadaki animasyonu izleyebilirsiniz yadaanimasyonu offline izlemek iin download edebilirsiniz.

  • 8/14/2019 80x86 processor

    31/131

    En temel 3 birimden biri olan ALU aritmetik ve mantksal ilemleri yapan bir elektronikdevredir. BIU ise komut kodlarnn icras ile ilgilenir yani emirleri icra eden birim olarakbasite tanmlanabilir. Kontrol nitesi ise sistemdeki birimleri harekete geirmek iinkontrol sinyalleri retir. Bu birime programcnn dorudan mdahalesi sz konusudeildir. Programc sadece CPU iindeki kaydedicilere eriebilir.

    ekil 3 - Kaydediciler ilemcideki, ayn zamanda tm sistemdeki en hzl depolamabirimleridir. Bu ekil 32 bitlik ilemciler (P4 serisi gibi) iin kaydedici yapsn gsteriyor.

    Kaydedicileri tam olarak anlayabilmeniz iin onlar kullanmanz gerekir, yani burada nekadar anlatsak bo bu yzden ksaca yukardaki ekilde grdklerinizi aklayp hemen biruygulama yapalm.

    Genel Amal Kaydediciler

    Bu kaydedicilerin 8,16 ve 32 bitlik kullanm mmkndr. rnein AL ve AHAccumulator n 8 bitlik kullanmn AX 16 bitlik EAX ise 32 bitlik kullanmn simgeler.Genel amal kaydedicilerin hepsi verileri geici olarak zerlerinde barndrabilir fakat bazx86 komutlar buradaki kaydedicilere zeldir. Mesela loop komutu ile CX kaydedicisinindeeri azalr.

    Accumulator (EAX, AX, AH, AL): En sk kullanacanz kaydedicidir. ok genel kullanmalanna sahiptir, daha nceki makalelerimizde yazdmz kodlara bakarsanz ok deiikamalarla kullanldn grebilirsiniz. Bu kaydedici birok giri/k ileminde ve aritmetik

    ilemlerde (arpma, blme ve tama gibi) kullanlr. Ayrca baz komutlar ilenmedennce accumulator den parametre alr veya bu kaydediciye ilemin sonucunu kaydeder.

  • 8/14/2019 80x86 processor

    32/131

    Base (EBX, BX, BH, BL): Accumulator gibi genel amal ve hafza eriiminde indexlerigstermede kullanlr. Bir baka kullanm alanda hesaplamalardr.

    Counter (ECX, CX, CH, CL): zel amalar ve hesaplamalarda kullanlaca gibigenellikle bu kaydediciyi sayc olarak kullanlr, daha nce loop komutunun CXkaydedicisini otomatik olarak deitirdiini sylemitik.

    Data (EDX, DX, DH, DL): Baz giri/k komutlarnda bu kaydedicinin kullanlmasgerekir, ayrca arpma ve blme ilemlerinde accumulator ile birlikte byk sonular bukaydediciden okuruz.

    Segment Kaydedicileri

    Segment kaydedicilerinin hepsi 16 bitliktir ve hafzann segment olarak adlandrlanksmlarn adreslemede kullanlr.

    Code Segment Kaydedicisi (CS): DOS iletim sisteminde programlar oluturan kodlar

    code segment e yklenir. CS kaydedicisi ise IP kaydedicisi ile birlikte programn almasrecinde, programn oluturan kodlarn adreslerini gsterirler.

    Data Segment Kaydedicisi (DS): .exe trndeki bir programda kullanlacak olanveriler data segment denilen hafza blmnde tutulur. DS kaydedicisi ise bu blgedekiverilerin konumlarn gsterir.

    Stack Segment Kaydedicisi (SS): Tm programlar stack segment denilen bir hafzaalann geici depolama alan olarak kullanmak zorundadrlar (rnein dallanmailemlerinde). SS kaydedicisi ise SP kaydedicisi ile birlikte bu verilerin adreslerini referanseder.

    Extra Segment Kaydedicisi (ES): Baz string ilemlerinde DI kaydedicisi ile birliktekarakterlerin bulunduu hafza adreslerini tutarlar.

    FS ve GS Kaydedicileri: 80386 ve sonras CPU larda bulunurlar ve dier segmentkaydedicilerinin yetersiz kald durumlarda kullanlrlar.

    zel kaydediciler

    IP ve EIP kaydedicileri: IP 16 bitlik DOS programlarnn EIP ise 32 bitlik programlarnilenmesi srecinde, ilenecek olan bir sonraki komutun offset adresini gsterir.

    FLAG ve EFLAG kaydedicileri: Flag kaydedicisi 16 Eflag kaydedicisi ise 32 bitten oluur.Bildiiniz gibi mikroilemci matematiksel ilem yapar, bu kaydedicilerde her ilemdensonra o ileme zel sonular gsterirler. lemci durum kaydedicisi olarakta bilinen bukaydediciler sonucun sfr, pozitif veya negatif olduunu veya ilemin sonucunda elderetilip retilmedii gibi birok nemli veriyi bitsel olarak programcya bildirirler.

    Index Kaydedicileri

    Bu kaydedicilerin E ile balayanlar 32 bitlik programlarda, dierleride 16 bitlikprogramlarda kullanlr. Hepsi de verilerin offset adreslerini tutmada kullanlr. SP ve BP,SS kaydedicisi ile birlikte SI ve DI, DS ve ES kaydedicileri ile birlikte hafza adreslerineerimek iin kullanlr.

    Burada aklamadm dier kaydediciler: X86 ailesindeki ilemcilerde bakakaydedicilerde mevcuttur. Bunlardan bazlarn programc kullanamaz bazlar ise

  • 8/14/2019 80x86 processor

    33/131

    ayrcalkl mod, korumal mod diye adlandrlan zel alma modlarnda anlam kazanrhatta bu tr alma modlarnda yukarda saydmz kaydedicilerin birou bambakaamalar iin kullanlrlar.

    lemciyi ksaca anlatmaya altm, sra hafzada.

    HAFIZA

    imdi hafzann fiziksel ve mantksal yapsn anlatacam, fiziksel yaps ile programcfazla ilgilenmez hafzann mantksal yaps ise tm programclara hemen hemen ayngrnr. ok kark bir konu olmasna karn basit bir anlatmla bu konuyu kavramanzumuyorum.

    Hafzann Fiziksel Yaps

    ekil 4 - Hafzan fiziksel yaps.

    Yukardaki gibi bir hafza yaps, 16 bitlik bir veri yolu bulunan ilemciler iin uygundur,rnein 8086 ilemcisi iin. ayet veri yolu 32 bitlik ise daha fazla bank gerekir, zetledata bus n (veri yolu) genilii kullanlacak olan hafza chip ini belirler. Hafza denilinceboyutu 8 bit olan bir dizi hcre ve bu hcrelerin numaras olan adresler akla gelir. Hafzachip leri veri, adres ve kontrol yollarna baldr. Hafzada bulunan veriler hexadecimalformatta gsterilirler, bu binary formata en uygun say sistemidir.

    x86 hafzas ne kadar byte olarak adreslense de programc hafzadan tek bir komut ile 8,16 veya 32 bitlik bir deer ileyebilir. Byle bir durumda hafzann fiziksel yapsn bilmekie yarayabilir. rnein 0. adresten itibaren 16 bitlik (2 byte veya word) bir deerinilemci kaydedicilerine herhangi bir ilem iin ekileceini varsayalm. X86 ailesiilemciler, hafzadan verileri dk deerlikli ksmndan itibaren okurlar (little endian). Burnekte hafzaya eriim ift numaral adresten yapld iin ABFFh verisi data bus a

    doru bir ekilde yerleecektir ve en hzl hafza eriimi bu ekilde yaplr. Birde teknumaral bir adresten rnein 7. adresten okuma yapldn varsayalm. Bu durumda

  • 8/14/2019 80x86 processor

    34/131

    okunmas gereken deer 4676h olmasna ramen data bus a 7646h verisi yerletirilirgibi grnyor deil mi? Hal byle olunca ilemci nce Odd Bank tan daha sonra EvenBank tan okuma yapar ve bu byte lar sraya koyar, bu tr bir hafza eriimi daha uzunzaman alr. zetle ift numaral adreslerden 1 byte tan fazla bir deere eriilirse bunasral eriim (Aligned Memory Access), tek numaral adreslerden okuma yaplrsa bunasrasz hafza eriimi (Unaligned Memory Access) denir. Sral hafza eriimi sraszdan 2

    kat daha hzl olduundan programlamada buna dikkat edilmelidir. Bu tr ayarlamalarassembly dilinde direktiflerle yaplr.

    Hafzann Mantksal Yaps:

    Bir mikroilemcinin ne kadarlk bir hafzaya eriebilecei adres yolu ile doru orantldr.Adres yolu 16 bit olan bir mikroilemci 216 yani 65536 adet hafza konumuna eriebilir.8086 ilemcisi 20 bitlik bir adres yoluna sahiptir ve adresleyebilecei alan 220=1048576yani 1 MB. a denk gelir. 80286 ilemcisinin adres yolu 24 bitlik ti ve 224= 16777216hcreyi, baka bir deyile 16MB. lk bir hafza alann adresleyebilirdir. Gnmzdekullanlan mikroilemcilerin adres yolu ounlukla 32 bitliktir, buda 4 Milyar ksr hafzakonumuna denk gelir. Yava yava 64 bit devri balyor, AMD 64 bitlik ilemcilerini oktan

    piyasaya srd 264 adet hafza konumu gelecein programlarn altrmak iin epeyyeterli. Her ne kadar mikroilemci byle byk hafza alanlarn desteklese de byle biralan kullanabilmemiz hafzay nasl organize edileceine baldr. Hafza organizasyonunayaplan bu yaklama hafzann mantksal yaps diyebiliriz.

    Hafzann mantksal yaps alma moduna gre deiiklik gsterir ve alma moduiletim sistemleri tarafndan belirlenir. X86 uyumlu tm PC ler Real Mod denilen almamodunda alrlar, daha sonra iletim sistemine gre hafza farkl bir ekil alabilir. rneinLinux yada Windows iletim sistemi ykleniyorsa hafza Protected Mod (korumal mod)denilen yapya brnr. DOS iletim sistemi ykleniyorsa (neydi o gnler :)) hafza realmod da kalr. Birde korumal mod altnda DOS programlarn altrmak ve korumalmod ile real mod programlar arasnda gei yapmak iin windows iletim sisteminin

    Virtual Protected Mod u vardr. Tm bu modlar tek bana bir makale konusuolduundan ve u an iin biraz ar konular olduundan fazla ayrntya girmiyorum. imdisadece en basit ve programlarmzda kullanacamz mod olan Real Mode Adressing yenigerek modda hafza y inceleyeceiz.

    Real mod da hafza 64Kb lk segmentlerden oluur ve bu segment iindeki her byte aerimek iin offset adresleri kullanlr. Bu durumda hafzann tamam bir kitap, segmentlersayfalar ve adreslenebilen her byte ise satr olara dnlebilir. Protected mod ok dahakarmaktr. 80286 ve sonras ilemciler protected mod a gei yapabilir. Sayfalama(paging), sanal bellek (virtual memory) ve multitasking (ok grevlilik) korumal modungetirdii byk avantajlardr.

    Mikroilemci hafzann herhangi bir konumuna eriirken segment adresini segmentkaydedicilerinden, offset adresini de ayet eriilecek olan bir komut kodu ise IPkaydedicisinden alr. Eriilecek olan veri (deiken, karakter vs.) ise verinin trne greoffset adresini tutacak olan kaydedici deiir, rnein eriilecek veri stack ta (ynbellekte diyebilirsiniz) ise buradaki verinin offset adresini SP (stack pointer) tutar.

    Segment kaydedicileri 16 bitliktir, real mod da offset adresleri index kaydedicilerinin 16bitlik ksmlarnda (SP,BP,SI,DI) veya 16 bitlik olan IP kaydedicisinde tutulur. Bu durumxxxx:xxxx formatnda gsterilir. rnein 3456:76A3 real modda bir hafza adresinigsterir, burada 3456 segment adresi iken 76A3 ofset adresidir. 3456:76A3 gibi bir adresgsteriminde 3456 y sayfa numaras olarak dnrsek bu sayfada 0000-FFFF arasnda65536 adet offset adresi (satr) mevcuttur diyebiliriz ve bu konumlarn her biri 1 byte a

    denk gelir.

  • 8/14/2019 80x86 processor

    35/131

    Hafzann gerek yapsn gz nne alrsak rnein 8086 ilemcisi en fazla 1MB. lkhafzay adresleyebilir fakat xxxx:xxxx eklinde bir gsterim 4GB lk bir alana denk gelir(FFFF kere FFFF). Hal byle olunca ilemci real modda alrken gerek adresi bulmakiin bir hesaplama yapar nk gerekte hafza real mod da 00000H-FFFFFH arasndaanlamldr.

    ekil 5 - Programc hafzay adresleri olan byte tablosu olarak dnr

    Real mod da gerek adres u formlle bulunur;

    045F:0032 adresi iin, segment adresi 4 bit sola kaydrlr veya baka bir deyile adresinsonuna 4 adet 0 getirilir (0000)2=(0)16 bylece segment adresi 045F0 olur, sonra bunaoffset adresi eklenir ve gerek adres bulunur. 045F0h+0032h=04622h gerek hafzaadresidir.

    Gerek modda bilgisayarnz Pentium 4 bile olsa hafzann sadece 1MB. lk alannadresleyebilirsiniz, ayrca sadece kaydedicilerin 16 bitlik ksmlarn kullanabilirsiniz. Buson model ferrari nizi otobanda 1. viteste srmeye benzer.

    imdi de hafza ve kaydedicileri daha iyi anlamak iin rnek program hazrlayalm.

  • 8/14/2019 80x86 processor

    36/131

  • 8/14/2019 80x86 processor

    37/131

    x86 Adresleme Modlar ve Turbo Debugger

    Bu makalede x86 adresleme modlarn anlatmaya alacam, ayrca sembolikkodlarmz, verilerimizi daha rahat grebileceimiz ve kontrol edebileceimiz bir programolan Turbo Debugger inceleyeceleyeceiz.

    Geen makalemizde x86 kaydedicilerini hafzann yapsn anlatmaya almtm. Bumakaleye kadar ounlukla x86 uyumlu sistemlerin yaps zerinde durdum. Bundansonra yazacam makaleler daha ok assembly programlama dilini kapsayacak.

    ADRESLEME MODLARI

    Bildiiniz gibi programlar oluturan kodlar ve veriler hafzaya yklendikten sonra ilemcitarafndan satr-satr icra edilirler. Ayrca CPU tm giri k ilemlerini de hafzaya

    erierek yapar. Bazen hafzadan dorudan bir kod ya da veri alr, iler. Bazen hafzaya birveri gnderdiinizde birde bakmsnz bu bir yazcdan belge olarak km vs. tebilgisayarn donanm ve yazlm dzeyinde yapt bunca eitli i iin CPU hafzayadeiik yollardan erime ihtiyac duyar. Sizlerde programlarnz yazarken CPU nunhafzaya nasl erieceini yazdnz kodlarla belirtmek zorundasnz. Assembly dilinin ilkbasama olan adresleme modlar da bu konular kapsyor.

    Her mikroilemci reticisi bir mikro ilemci piyasaya srdnde, komut setini veadresleme modlarnda yaynlar. Programclar da bu belgelere gre programlarnyazarlar. Intel 8086 ilemcisini piyasaya srdnde olduka kullanl bir dizi adreslememodu salad. Intel in u ana kadar rettii ilemcilerde bu adresleme modlarnkullanabilirsiniz. Daha sonralar bir devrim niteliinde olan 80386 ilemcisi ile ek

    adresleme modlarda geldi. Bu zel adresleme modlar sadece 386 ve sonras ilemcilerdekullanlabilir. Tabi ki bu ek adresleme modlar ile assembly programlama dili daha esnekbir yapya brnmt. Bizde bu makalemizde adresleme modlarn 386 ncesi ve sonrasolarak ikiye ayracaz.

    u ana kadar yaptmz programlarda ok fazla komut rnei grmediniz amamakalelerimizi takip ettiyseniz MOV komutunu yakndan tanmanz lazm. MOV komutuassembly programlama dilinde en ok kullanlan komutlarn banda gelir. nk birprogram alrken genelde hafzaya yazar yada okur. MOV komutu da bu i iin biilmikaftandr ve bu kadar ok kullanldndan dolay bir ok adresleme modunu destekler,yani bu komut ile hafzaya ok deiik yollardan eriebilirsiniz. Bu yzden bu makaledeadresleme modlarn anlatrken MOV komutunu rnek alacam.

    MOV komutunun genel kullanm ekli;

    MOV hedef, kaynak

    8086 ADRESLEME MODLARI:

    8086 Kaydedici Adresleme:

    Adndan anlalaca gibi kaydediciden kaydediciye yaplan ilemlerde bu adreslememodlar kullanlr. En hzl adresleme modu dur, nk ilem hafzada deil ilemcininiinde gerekleir.

    Genel amal ve indeks kaydedicilerde kaydedici adresleme modlar:

  • 8/14/2019 80x86 processor

    38/131

    mov ax, bx ; BX teki deeri AX e kopyalarmov dl, al ; AL teki deeri DL ye kopyalarmov si, dx ; DX teki deeri SI ya kopyalarmov sp, bp ; SP deki deeri BP ye kopyalarmov dh, cl ; CL deki deeri DH a kopyalarmov ax, ax ; Bu da doru bir kullanmdr!

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

    mov al, bx ;yanl kullanm, derleme annda assembler hata verir.

    Kk boyuttaki kaynaktan byk boyuttaki hedefe de kopyalama yaplamaz.

    mov cx, al ; Yanl kullanm, AL ile CX eit boyutta deil.

    Bunlara ek olarak segment kaydedicilerinin kullanmnda dikkat edilmesi gereken noktalarvardr.

    1- Segment kaydedicileri arasnda bir transfer ilemi ancak genel amal bir kaydedicivastasyla yaplabilir.

    mov ds,cs ; doru kullanlmayan segment kaydedicisi eklinde assemblerhata verir!

    Bu ii yapmak iin,

    mov ax,csmov ds,ax

    komut satrlar kullanlabilir.

    2- CS ve IP kaydedicilerinin deeri kaydedici adresleme ile deitirilemez

    mov cs, ax ; kaynak genel amal kaydedici olmasna ramen bu ilemmmkn deildir!

    Segment kaydedicileri programn icras aamasnda hafzann segment olarak adlandrlanblmlerinin adreslerini tuttuklarndan, bu kaydedicileri verilerinizi saklamak veyatamak iin kullanmanz tavsiye etmem, kullanlmamaldrlar. Bunun yerine genel amalkaydedicileri kullanmanz daha uygun olur.

    8086 Hafza Adresleme Modlar

    a- Acil Adresleme ( Immediate Addressing )

    Herhangi bir genel amal veya indeks kaydedicisine dorudan bir deer ykleye bilirsiniz.Yklenecek olan veri kod segmentten alnacandan bu tr kullanmlar ahsen ben pektavsiye etmem. yi bir program organizasyonu iin, veriler hafzann ayr bir blmnde(mesela data segmentte) deikenler veya sabitler olarak belirtilmelidir.

    mov al, 17 ; AL ye 11h yklenir.

    b- Direkt Adresleme (Displacement Only Addressing )

  • 8/14/2019 80x86 processor

    39/131

    Acil adreslemenin doru kullanlm eklidir. Bu adreslemede segment:ofset adresikullanlarak hafzaya eriilir.

    mov al, ds:12 ; ds:000C adresinden 1 byte AL ye kopyalanr.

    mov ds:12, al ; AL nin ierii ds:000C adresine kopyalanr.mov ax, ds:12 ; ds:000C adresinden 2 byte AX ye kopyalanr.mov ds:12, ax ; AX nin ierii ds:000C adresinden itibaren kopyalanr (2

    byte)

    Aslnda kaynak kod hazrlanrken genelde bu ekilde bir kod yazm yaplmaz. Deikenlerve sabitler sembolik kelimelerle ifade edildiinden buna gerek yoktur. Ne var ki debuggerprogramlarnda da sembolik deiken isimlerini deil adresleri grrz. Aadaki kodparasn inceleyin;

    .datasayi1 db 5

    .codemov ax, @datamov ds, ax

    mov al, sayi ; 5 deerini al ye ykler.mov al, ds:0000 ; ayn ii yapar yani 5 i AL ye ykler.

    ; veriler tanmlanrken sayi1 db 5 eklinde deil de; sadece db 5 yazlsayd, bu komutu kullanmak zorunda

    kalrdk.

    c- Kaydedici Dolayl Adresleme ( Register Indirect Addressing )

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

    mov al, [bx] ; hafzadan AL ye 1 byte tanr. Alnacak verinin offset adresiBX in deeridir.

    mov al, [bx]mov al, [si]mov al, [di]mov al, [bp]

    Yukardaki 4 rnekte AL ye kopyalanacak verilerin offset adresleri ilgili kaydedicininiindeki deerdir. Segment adresleri ise ilk nn DS sonuncusunun SS dir. BP indekskaydedicisi yalnz bana hafza adreslemede kullanlrsa, daima stack segmentin (SS)offset adreslerini gsterir. Fakat BP kaydedicisi de dahil olmak zere bu adreslemesegment kaydedicileri de belirtilerek yaplrsa, o zaman ilgili segment:offset adresineeriilmi olunur.

    BX=0000, BP=0001, SI=0002, DI=0003 olduunu varsayalm;

    mov al, cs:[bx] ; AL ye CS:0000 dan kopyalama yaplrmov al, [bx] ; AL ye DS:0000 dan kopyalama yaplrmov al, ds:[bp] ; AL ye DS:0001 den kopyalama yaplrmov al, [bp] ; AL ye SS:0001 den kopyalama yaplrmov al, ss:[si] ; AL ye SS:0002 den kopyalama yaplr

  • 8/14/2019 80x86 processor

    40/131

    mov al, [si] ; AL ye DS:0002 den kopyalama yaplrmov al, es:[di] ; AL ye ES:0003 den kopyalama yaplrmov al, [di] ; AL ye DS:0002 dan kopyalama yaplr

    d- ndeksli adresleme ( Indexed Addressing )

    Kaydedici dolayl adreslemenin operandna sabit bir deer eklenmi halidir.

    Kullanm ekli;

    mov al, disp[bx]mov al, disp[bp]mov al, disp[si]mov al, disp[di]

    Not : disp ksaltmas ngilizcede displacement kelimesinin karldr. Buradaki anlam isereferans alnan ofset adresidir. Komut setlerinde adresleme modlar aklanrken dispveya mem ksaltmas ile ok sk karlaacanzdan, komutlar yazarken ngilizce ifadeler

    kullanmak durumunda kaldm.

    Mesela BX=2000h olsun, mov dl, 20h[bx] eklinde bir komut kullanldnda, DS:2020hadresindeki 1 byte lk deer dl ye kopyalanacaktr. Ayn ekilde BP=3030h olduunuvarsayalm, mov dh,1020h[bp] gibi bir komut ile, SS:4050h adresindeki 1 byte lk deerdh a kopyalanr.

    Bu adresleme modunda da BP segment kaydedicisi daima SS in ofsetlerini gsterir.Fakat kaydedici dolayl adreslemede de olduu gibi bizzat segment kaydedicisinidebelirterek bu adresleme modunu kullanabiliriz. Bu durumda ofset adresleri komuttabelirtilen segmentin ofseti olur.

    mov al, ss:disp[bx] ; BX normalde DS nin ofsetlerini gsterirken buradaSS in ofseti olmu.mov al, es:disp[bp] ; BP normalde SS nin ofsetlerini gsterirken burada

    ES in ofseti olmu.mov al, cs:disp[si] ; SI normalde DS nin ofsetlerini gsterirken burada

    CS in ofseti olmu.mov al, ss:disp[di] ; DI normalde DS nin ofsetlerini gsterirken burada

    SS in ofseti olmu.

    e- Taban ndeksli adresleme ( Based Indexed Addressing )

    Bu adresleme modu da kaydedici dolayl adreslemeye ok benzer. Kullanm format

    aadaki gibidir;mov al, [bx][si]mov al, [bx][di]mov al, [bp][si]mov al, [bp][di]

    BX in 0500h SI nn 0360h olduunu varsayalm,

    mov al,[bx][si]

    gibi bir komut ilenince AL ye kopyalanacak veri DS:0860 adresinden alnr.

    Ayn ekilde;

  • 8/14/2019 80x86 processor

    41/131

    BP=1598h DI=1004 ve mov ax,[bp+di] gibi bir komut ileniyorsa; AX, SS:259Ch veSS:259Dh adreslerindeki veri ile yklenir.

    SI ve DI kaydedicileri iin Intel in zel komutlar vardr, bu yzden bu kaydedicilergenellikle programlamada indeks deerlerini tutar, arttrr veya azaltrlar.

    f- Taban ndeksli art direkt adresleme (Based Indexed Plus Displacement Addressing)

    Bu adresleme modu taban indeksli adreslemeye 8 yada 16 bitlik sabit bir deerineklenmi halidir.

    mov al, disp[bx][si]mov al, disp[bx+di]mov al, [bp+si+disp]mov al, [bp][di][disp]

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

    mov al,10h[bx+si] ; AL ye DS:2130 adresindeki veri yklenirmov ch,125h[bp+di] ; CH a SS:112A adresindeki veri yklenirmov bx,cs:2[bx][di] ; CS:2007 adresinden itibaten 2 byte lk veri yklenir

    TASM ve MASM n adresleme modlar iin esneklii.

    TASM ve MASM assembler lar indeksli, taban indeksli, ve taban indeksli art direktadresleme iin deiik yazm ekillerini desteklerler;

    ndeksli adresleme iin;

    disp[bx] = [bx][disp] = [bx+disp] = [disp][bx] = [disp+bx]

    Taban indeksli adresleme iin;

    [bx][si] = [bx+si] = [si][bx] = [si+bx] ;

    Taban ndeksli art direkt adresleme iin;

    disp[bx][si] = disp[bx+si] = [disp+bx+si] = [disp+bx][si] = disp[si][bx] =[disp+si][bx] = [disp+si+bx] = [si+disp+bx] = [bx+disp+si]

    Yukarda yazlan bu 3 adresleme modundaki operandlar ayn ii yaparlar. MASM ve TASM

    "[ ]" sembollerine "+" operatr gibi davranr. ( disp[bx][si] = disp[bx+si] rneindeolduu gibi )

    8086 Adresleme Hafza Adresleme Modlarn Hatrlamak in Kolay Bir Yol:

    8086 ilemcisi iin toplam 17 adet adresleme modu mevcuttur. Bunlar disp, [bx], [bp],[si], [di], disp[bx], disp[bp], disp[si], disp[di], [bx][si], [bx][di], [bp][si], [bp][di],disp[bx][si], disp [bx][di], disp[bp][si], and disp[bp][di] adresleme modlardr. Aadakiekil, bu 17 adresleme modunu ezberlemeniz yerine kolayca hatrlamanza yardmcolacaktr.

  • 8/14/2019 80x86 processor

    42/131

    ekil 1 - 8086 adresleme modlar iin yardmc ekil.

    Bu ekil ile 17 adresleme modunu kolayca grebilirsiniz. Her stundaki elemanlar teker-teker seebilirsiniz veya herhangi bir stunu geip dier iki stunun birleimi ile doru biradresleme modu yakalayabilirsiniz.

    rnekler;

    Bir tek eleman sein;

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

    3. stunu yok sayn ve dier elemanlarn birleimini kartn

    disp[bx], disp[bp]

    2. stunu yok sayn ve dier elemanlarn birleimini kartn

    disp[si], disp[di]

    1. stunu yok sayn ve dier elemanlarn birleimini kartn

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

    Son olarak tm stunlarn birleimi ile aadaki geerli adresleme modlarn kolaycakartabilirsiniz.

    disp[bx][si], disp [bx][di], disp[bp][si], disp[bp][di].

    Not:Hafza adresleme modlarnda ayet hesaplanan etkin adres 0FFFFh deerinden bykolursa, CPU bu hesaplama sonucu oluan tamay gz ard eder ve FFFFh e ekleneni 0dan itibaren ekler. rnein BX=10h olsun ve mov al,0FFFFh[bx] komutu ilensin. Budurunda AL kaydedicisine ds:1000Fh adresindeki veri deil ds:000Fh adresindeki veri

    yklenir. (FFFFh+1h=0000, FFFFh+2h=0001, .. FFFFh+16h=000Fh)

    Sonu:

    8086 adresleme modlarn 2 blmde inceledik, ilk olarak kaydedici adresleme modlarnanlatmaya altm. Kaydedici adresleme de segment kaydedicilerini kendi amalardnda kullanmanz tavsiye edilmez, bu i iin yeterince genel amal ve indekskaydedicisi var zaten.

    Kark olan ksm ise hafza adresleme modlardr. Hafza adresleme modlarnda belirtilenoperand daima bir offset adresini iaret eder, buna etkin adres hesaplama da denir.

    Hafza adresleme modlarn unutmamanz iin sizlere kolay bir yol gstermeye altm.Adresleme modlarnn isimlerinden ziyade kullanm formatlar nemlidir. Her komut her

  • 8/14/2019 80x86 processor

    43/131

    adresleme modunu desteklemez. Hangi komutun hangi adresleme modunda kullanlacakomut setlerinden faydalanlarak bulunur.

    Bugne kadar gerek internetten gerekse Trke assembly kitaplarndan yaptmaratrmalarda, Trke olarak yaynlanm ayrntl bir komut seti bulamadm bu yzdenngilizce komut setlerinden faydalanyorum.

    8086 instruction set veya x86 instruction set anahtar kelimelerini internettenaratacak olursanz karnza ynla komut seti gelecektir. Genelde komut seti klavuzlaraadaki tablo gibidirler.

    MOV - Move Byte or WordUsage: MOV dest,src

    Operands Clocks SizeBytes

    286386486reg, reg 2 2 1 2mem, reg 3 2 1 2-4reg, mem 5 4 1 2-4mem,imm 3 2 1 3-6

    reg, imm 2 2 1 2-3segreg,reg16 2 2 3 2

    segreg,mem16 5 5 9 2-4

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

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

    ... ... ... ... ...Tablo 1 - MOV komutu iin rnek tablo

    Bu tabloda birinci stun MOV komutu ile kullanlacak operandn hangi adreslememodlarn desteklediini gsteriyor. rnein mem,imm (displacement,immediate) aciladresleme yi desteklediini gsterir. reg,reg (register,register) kaydedici adreslemeninyaplabileceini, segreg,reg16 (segment register, register 16 bit ) bir segmentkaydedicisine 16 bitlik bir kaydediciden kopyalama ileminin yaplabileceini gsterir.

    Clocks stunu bu komutlarn ilemci tarafndan ka admda ilendiini (ilemcinintipine ve hzna gre bu zaman birimi deiebilir), size bytes stunu ise hafzadamakine kodlarnn byte olarak kaplad alan gsterir. ou zaman assemblyprogramclar programlarnn, ilenme srecindeki nano saniyeleri ve hafzada kapladalann byte dzeyinde nemi yoksa bu ksmlarla ilgilenmezler. Yani 1. derecede operands stunu nemlidir ve ilgili komutu bu stunda belirtilen formatlarn dndakullanamazsnz.

    Son olarak x86 uyumlu hibir ilemci mem,mem eklinde yani hafzadan hafzayadorudan bir adresleme modunu desteklemez, aslnda bu gne kadar bunu destekleyenhi bir ilemci grmedim, zaten byle bir adresleme modunun desteklenmesi durumundao sistem iin yaplan programlarn kme olasl ok byktr.

    80386 ADRESLEME MODLARI

  • 8/14/2019 80x86 processor

    44/131

    80386 Kaydedici Adresleme (80386 Register Addressing)

    80386 den itibaren, gnmzde kullandmz Pentium ilemcilerin 32 bitlik kaydedicilerivardr. 8086 adresleme modlarna ek olarak bu ilemcilere de kaydedici adreslemeyaparken bu 32 bitlik kaydedicileri de kullanabilirsiniz. Bu kaydediciler geenmakalemizde bahsettiimiz;

    eax, ebx, ecx, edx, esi, edi, ebp, ve esp kaydedicileridir.

    kullanm format;

    mov eax, ebx

    Not: ayet programnzda 32 bitlik kaydedicileri kullanacaksanz kaynak dosyashazrlarken .386 talimatn kullanmanz gerekir.

    80386 Hafza Adresleme (80386 Memory Addressing)

    a- 80386 Kaydedici Dolayl Adresleme ( Register Indirect Addressing )

    16 bitlik Gerek moda (Real Mode) 80386 ve st ilemcilerde programlama yapmanzoffset adreslerinin 32 bit olaca anlamna gelmez. Segmentlerin her zaman gerek moda64Kb. olduunu unutmamak gerekir, bu yzden offset adresleri gerek modda 0...0FFFFharasn gsterir. Yani 64Kb. geecek ofset adreslerini gerek moda deil ancakkorumal moda (Protected mode) kullanabilirsiniz. Fakat gerek moda 32 bitlikkaydedicileri hesaplamalarda kullanmanzda bir engel yoktur. 80386 kaydedici dolayladreslemede kullanabileceiniz tm geerli adresleme format aadaki gibidir.

    mov al, [eax] ; DS in ofsetleri iin

    mov al, [ebx] ; DS in ofsetleri iinmov al, [ecx] ; DS in ofsetleri iinmov al, [edx] ; DS in ofsetleri iinmov al, [esi] ; DS in ofsetleri iinmov al, [edi] ; DS in ofsetleri iinmov al, [ebp] ; SS in ofsetleri iinmov al, [esp] ; SS in ofsetleri iin

    b- 80386 ndeksli, Taban/ndeksli, ve Taban/ndeksli/Direkt Adresleme modlar ( 80386Indexed, Base/Indexed, and Base/Indexed/Disp Addressing )

    80386 ndeksli adresleme modu 32 bitlik bir kaydedici ile sabit bir deerin birleiminden

    meydana gelir. Taban indeksli adresleme modu iki adet 32 bitlik kaydedicininbirleiminden ve taban indeksli art direkt adresleme modu ise bir sabit deer ile iki tane32 bitlik kaydedicinin birleiminden meydana gelir. Hibir zaman unutmamalsnz ki buadresleme modlar ne kadar 32 bitlik olsa da, ayet 16 bitlik gerek moda kullanlrlarsaeriebilecekleri ofset adresleri 16 bit i geemez.

    80386 taban indeksli hafza adresleme modlarnda taban adres ve indeks adresi diye ikitane terim kullanlr. Taban adresini ilk operand iken indeks adresini son operandgsterir. Bu kural kaydedici ismi ne olursa olsun geerlidir. Fakat 8086 indeksli veyataban indeksli hafza adresleme modlarnda, taban adresini sadece BX veya sabit birdeer gsterebilirken, indeks adreslerinide SI, DI, BP ve BX gsterebiliyordu. 80386 vesonras ilemcilerde bulunan bu esneklik phesiz ki programclarn iini kolaylatrr.

    Aada 80386 indeksli hafza adresleme modlar iin birka rnek grlyor;

  • 8/14/2019 80x86 processor

    45/131

    mov al, disp[eax] ;ndeksli adreslememov al, [ebx+disp] ;modlar.mov al, [ecx][disp]mov al, disp[edx]mov al, disp[esi]mov al, disp[edi]

    mov al, disp[ebp] ;SS in ofsetleri iinmov al, disp[esp] ;iin.

    Aadaki rneklerde ise 80386 taban indeksli adresleme modlar iin eitli rneklergrnyor. Bu rneklerde ilk kaydedici taban adresini gsterirken, ikinci kaydedici iseindeks adresini gsterir. Tabi ki sonuta bu iki kaydedicinin iindeki deerler toplanaraketkin olan hafza adresini iaret edecekler. Kaydedicilerin 32 bitlik olduunu dnecekolursanz 4GB lk hafzann istediiniz bir konumuna eriebilineceini de grebilirsiniz(tabi ki korumal modda). Burada taban adresi olarak esp ve ebp kullanldnda SS dekibir ofset adresini gstereceini unutmayn. Bununla birlikte indeks adreslerini gsterenkaydedicilerin tr verinin hangi segmentten alnacana etkisi olmaz.

    mov al, [eax][ebx] ;Taban indeksli adreslememov al, [ebx+ebx] ;modlar.mov al, [ecx][edx]mov al, [edx][ebp] ;DS deki ofsetleri gsterirler.mov al, [esi][edi]mov al, [edi][esi]mov al, [ebp+ebx] ;SS deki ofsetleri gsterirler.mov al, [esp][ecx] ;SS deki ofsetleri gsterirler.

    Yukardaki adresleme modlarna sabit bir deer eklerseniz 80386 taban indeksli artdirekt adresleme yapm olursunuz.

    mov al, disp[eax][ebx] ;Taban indeksli art direkt adreslememov al, disp[ebx+ebx] ;modlar.mov al, [ecx+edx+disp]mov al, disp[edx+ebp] ;DS deki ofsetleri gsterirler.mov al, [esi][edi][disp]mov al, [edi][disp][esi]mov al, disp[ebp+ebx] ;SS deki ofsetleri gsterirler.mov al, [esp+ecx][disp] ;SS deki ofsetleri gsterirler.

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

    c- 80386 lekli ndeksli Adresleme Modu (80386 Scaled Indexed Addressing Modes)

    Programclkla az ok uraan arkadalar diziler konusu bilirler. Yukarda anlattm 3adresleme modu ile dizilerin elemanlarna rahata eriebilirsiniz. Fakat zellikle diziilemler iin bir adresleme modu aryorsanz 80386 lekli indeksli adresleme modunukullanmak daha akllca olur. Bu adresleme modu ile indeks kaydedicisini 1, 2, 4 veya 8ile arparak dizilerin elemanlarna erimede daha esnek bir yap salar.

    Kullanm;

    disp[index*n][base][index*n]

  • 8/14/2019 80x86 processor

    46/131

    veya

    disp[base][index*n]

    "base" ve "index" 80386 nn herhangi bir genel amal kaydedicisi olabilir. "n" ise 1, 2, 4

    ve 8 deerlerini alabilir.

    ebx = 1000h ve esi = 4, iin aadaki rnekleri inceleyelim;

    mov al,8[ebx][esi*4] ;ds:1018h daki veriyi dan AL ye kopyalar.mov al,1000h[ebx][ebx*2] ;ds:4000h daki veriyi dan AL yekopyalar.mov al,1000h[esi*8] ;ds:1020h deki veriyi dan AL ye kopyalar.

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

    dnebilirsiniz

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

    MASM ve TASM 80386 nn tm bu hafza adresleme modlarnn yazmnda deiikvaryasyonlar kabul eder. Aadaki tm operandlar ayn ii yaparlar.

    disp[bx][si*2], [bx+disp][si*2], [bx+si*2+disp], [si*2+bx][disp], disp[si*2][bx],[si*2+disp][bx], [disp+bx][si*2]

    Sonu:

    80386 adresleme modlar 8086 adresleme modlarna nazaran programcya daha okolanak saladndan daha ok tercih edilirler. Benim ahsi grm X86 uyumlu PC lergerek gcn 80386 ilemcisi ile birlikte gelen bu olanaklardan almlardr. Zaten CPUtarihinde 80386 bir devrin kapanp dier bir devrin balad nokta olarak kabul edilir. Nevar ki 8086 adresleme modlar 80386 adresleme modlarna nazaran daha hzl alrlar.Bu yzden sz konusu olan hz ise (mikro saniyelerden bahsediyoruz ki bunlar bazenbirleip dakikalar oluyor) adresleme modu seilirken ok dikkat edilmesi gerekir.

    80386 taban indeksli ve taban indeksli art direkt adresleme modlar, lei 1 olan (n=1)

    80386 lekli ndeksli Adresleme Modu olarak dnlebilir ve bu hafza adreslememodlarnda gsterilen ilk kaydedici taban ikinci kaydedici indeks adresini gsterir. Tabanadresini gsteren kaydedici ebp veya esp ise bu adresleme SS deki bir ofset adresinedier kaydediciler taban adresi olarak seildiinde DS deki bir ofset adreslenmi olunur.lk yazlan kaydedici lekli olarak gsterilirse ("*n") bu bir taban adresi olmaktan karbir indeks adresi olur. Ayrca operanda segment kaydedicisini de gstererek adreslememodunu zorlayabilirsiniz.

    [ebx][ebp] ;DS nin ofsetini gsterir.[ebp][ebx] ;SS nin ofsetini gsterir.[ebp*1][ebx] ;DS nin ofsetini gsterir.

    [ebx][ebp*1] ;DS nin ofsetini gsterir.[ebp][ebx*1] ;SS nin ofsetini gsterir.

  • 8/14/2019 80x86 processor

    47/131

    [ebx*1][ebp] ;SS nin ofsetini gsterir.es:[ebx][ebp*1] ;Zorlanm,ES nin ofsetini gsterir.

    imdi sra uygulamada. Bu uygulama ile hem adresleme modlarn hem de Turbo

    Debugger programnn kullanmn aklamaya alacam.

    TITLE Adresleme Modlar (admod.asm);########################################;# Bu program 8086 ve 80386 adresleme modlarnn #;# iyi kavranmas iin yazlmtr. #;# Son Gncelleme: 17/04/05 #;# Yazan --> Eren ERENER #;########################################

    .MODEL SMALL

    .STACK 32.DATA

    VerilerByte DB 5h, 17h, 8Dh, 0AFhVerilerWord DW 1234h, 7h, 0C01DhVerilerDoubleWord DD 3DF0178Ah, 11223344h,

    12345678h

    .CODE

    ANA PROC

    MOV AX, @DATA ; Data segmentMOV DS, AX ; ayarlanyor.

    MOV AX, 5566h ; Acil adresleme.MOV BX, AX ; Kaydedici adresleme.

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

    MOV DX, DS:0000h ; Direkt adresleme.

    MOV BX, 0000hMOV AL, [BX] ; Kaydedici dolayl

    adresleme, DS:0000h adresindeki 5h deeri AL ye kopyalanr.

    MOV AL, 3[BX] ; ndeksli adresleme,DS:0003h adresindeki AFh AL ye yklenir

    MOV AL, 3[VerilerByte] ; Yukardaki ile ayn iiyapar,

    ; zaten assembler VerilerBytedeiken ismini ds:0000h olarak evirecektir.

    MOV SI, 0 ; SI = 0 oldu.=

  • 8/14/2019 80x86 processor

    48/131

    AL ye kopyalanacak deer DS:0000h daki 05h tr.INC SI ; SI y 1 arttrdk,MOV AL, [BX][SI] ; imdi AL ye

    kopyalanacak deer DS:0001h daki 17h tr.INC SI ; SI y,INC SI ; 2 arttrdk, imdi SI=3

    oldu.MOV AL, [BX][SI] ; imdi AL ye

    kopyalanacak deer DS:0003h daki AFh tr.; Burada BX taban SI indeks

    kaydedicisi oldu.MOV AL, [BP][SI] ; DS deil SS in

    offsetlerini adresler, u anda Stack Segment in iinde neolduunu bilmiyoruz!!!

    ;Taban indeksli art direkt adreslemeMOV SI, 0 ; SI=0 oldu.MOV AX, 4[bx+si] ; BX i

    deitirmediimizden hala sfr ve AX e getirilecek 2 byte lkveri ds:0004h adresinden alnacak,

    ; nk 4+0+0 = 4 tr. Buadres VerilerWord deikenin adresidir ve bu adreste 1234hvardr.

    INC SI ; SI,INC SI ; 2 kere arttrlyor ve,MOV AX, 4[bx+si] ; VerilerWord dizisinin 2.

    elemanna eriiliyor.; nk 4+0+2 = 6 dr. Bu

    adreste 0007h vardr.

    ;----------------------------------------;80386 Hafza Adresleme Modlarna rnekler;----------------------------------------

    .386 ; 80386 adreslememodlarn ve 32 bitlik kaydedicileri kullanmak iin bu direktifinyazlmas gerekir!!!

    MOV ESI, 0 ; ndeks i 1 olarakayarland.

    SUB EBX, EBX ; ebx = 0 yapld. SUB(Subtract) yani kartma komutu,

    ; burada "MOV ebx, 0" ileayn ii fakat daha hzl yapar.MOV AX, 4[ebx][esi*2] ; 80386 lekli indeksli

    adresleme modu ile VerilerWord dizisinin 1. eleman (1234h)AX e kopyaland.

    INC ESIMOV AX, 4[ebx][esi*2] ; 80386 lekli indeksli

    adresleme modu ile VerilerWord dizisinin 2. eleman (0007h)AX e kopyaland.

    LEA EAX, VerilerDoubleWord ; LEA komutu (LoadEffective Address) VerilerDoubleWord dizisinin balang adresini

    EAX e kopyalyor,

  • 8/14/2019 80x86 processor

    49/131

  • 8/14/2019 80x86 processor

    50/131

    ekil 2 - Turbo Debugger ekran.

    Turbo Debugger ekran 5 blmden oluuyor. ekildeki 1, 2 ve 3 nolu ksmlar hafzayincelemek iin kullanlrlar. 4. ksm mikroilemci kaydedicilerini ve 5. ksmdada yinemikroilemci kaydedicilerinden olan flag register bitsel olarak grebilirsiniz. Genellikle1. blge program oluturan kodlar, 2. blgede verilerin incelenmesi iin kullanlr. 3.blgeyi yn hafzay gzlemlemek iin kullanabilirsiniz.

    Turbo Debugger aldktan sonra "File" mensnden derlediiniz program dosyasn ap

    kodlarn inceleyebilirsiniz. Program dosyanz atktan sonra "Program has no symboltable" diye bir mesaj gelebilir. Bu mesaj penceresinde "OK" e tklayp almayabalayabilirsiniz.

    ekil 3 - Turbo Debugger ile dosya ama.

  • 8/14/2019 80x86 processor

    51/131

  • 8/14/2019 80x86 processor

    52/131

    ekil 2 - Program adm-adm ileniyor.

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

    ekil 2 - Turbo Debugger ile hafza pencerelerini kullanma.

    Yalnz .exe tipindeki program dosyalarnda verilerinizi grebilmek iin mov ax,@data vemov ds,ax satrlarnn ilenmi olmas gerekir.

    Programnz satr-satr ilenme srecinde, adresleme yaplan bir komutun ilenmesiannda kod penceresinin sa st kesinde hafzann hangi blgesine eriildii grlebilir.

    Bu makalemizdeki program incelerken bu zellii ska kullanmanz gerekecek.

  • 8/14/2019 80x86 processor

    53/131

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

    Mesela yukardaki ekilde mov al, [BX] komutu ileniyor ve kaydedici dolayl hafzaadresleme yaplyor. Burada AL kaydedicisine kopyalanacak olan veriyi "ds:0000 = 05"eklinde grebilirsiniz.

    32 bitlik kaydedicileri grmek iinse kaydedicileri gsteren ksma (4. ksm) sa tklayp"Registers 32 bit" i seebilirsiniz.

    Turbo Debugger n daha bir ok zellii var ama u anda bizlere bu kadar yeter. imdisizler Turbo Debugger ile bu makaledeki program inceleyerek pratik yapn, ayrca bugne kadar yazdmz programlar da Turbo Debugger ile inceleyerek programkullanmasn daha iyi kavrayn.

    Bir sonraki makalemizde veri tipleri ve x86 komutlarn inceleyeceiz. Daha sonraprosedr ve makrolarda grdkten sonra nihayet kendi programlarnz yazabilir seviyeyegeleceksiniz. Genelde sizlerden makalelerin daha sk aralklarla yaynlanmas ile ilgilimailler alyorum. Fakat bir makale hazrlamak en az 1 haftam alyor ve niversitedekiderslerden ve ilerden dolay ok az vaktim oluyor. Bu yzden makalelerimin yaynlanmaaral birden 20 gne srayabiliyor. Hal byleyken sizlerin aray soutmamak iin bakakaynaklardan faydalanmasn tavsiye ediyorum. Bu ekilde alan baz arkadalarinternetten kaynak kod bulup, derleyip takldklar yerlerde bana mail atyorlar, bunlaracevap vermesi daha az zamanm alyor ve sizler iinde ok faydal olacandan eminim.ayet ngilizce okuduunuzu anlyorsanz sizlere Art of Assembly yi tavsiye ederim.nternetten okuyabileceiniz bedava bir kitap. Mesela bu makaleyi yazarken bukaynaktan ok yararlandm ve sizlere de tavsiye ederim.

    Evet yine geldi ayrlk vakti. Sizlere bol assembly li gnler dileyerek huzurlarnzdanayrlyor ve bir sonraki makalede grmek dileiyle esen kaln diyorum. (TV programsunucusu olabilirdim aslnda :))

  • 8/14/2019 80x86 processor

    54/131

    X86 Assembly Dilinde Deiken Bildirimi 1

    Daha nce st seviye programlama dilleri ile uratysanz deikenler hakknda bilginizmuhakkak vardr. x86 assembly dilinde de programclar programlarnda kullanacaklarbaz verileri, deiken olarak tanmlarlar. Aslnda bunlar byte yada bytelardan oluandizilerdir. Hafzadaki bu veriler, programnzdaki kullanm ekline gre deiik halleralabilir.

    DEKENLER DEKLARE ETMEK

    rnein 2 sayy toplayan program yazmay dnelim. Bunu 2 deiik ekilde yapabiliriz.Birincisi acil adresleme modu ile;

    MOV AL,5

    ADD AL,4

    Bu rnekte hibir deiken tanmlanmamtr ve bu program paras sadece 5 ile 4 toplar ve sonucu ilemcinin iindeki AL kaydedicisinde saklar. Tabi bu programn ne kadarkullanl olduunu artk siz tahmin edin. Oysa bu saylar birer deiken olaraktanmlasaydk daha esnek bir program hazrlam olurduk.

    .DATAsayi1 DB 5sayi2 DB 4toplam DB ?.

    .

    .

    .CODE

    .

    .MOV AL,sayi1ADD AL,sayi2MOV toplam,AL

    Yukardaki program parasnda 3 adet bir byte lk deiken tanmlanmtr. Bunlar sayi1,sayi2 ve toplam deikenleridir. Aslnda bu yazdmz satrlar assembler a bir demeeklindedir. Assembler programmz derlerken, hafzada bizim kullanmamz iin 3

    byte lk alan ayracak ve bu alanlardan birine 5 dierine 4 deerlerini yerletirecektir.Toplam deikeninin deeri program altnda nemli olacandan dolay, onun deerihenz atanmam fakat undan da emin olun ki o adreste muhakkak bir deer mevcuttur.

    Grdnz gibi deikenlerini isimleri, trleri ve deerleri mevcut. Deiken ismi (sayi1gibi) aslnda bir offset adresidir ve kullanm seimliktir. ayet deiken tanmlarken isimkullanmazsanz assembler yine hafzada deikenin trne gre yer ayrr. Fakat byle birdurumda deikeni programnzn iinde kullanmak iin adresini (ds:0000 gibi) bilmenizgerekir. ok sayda deiken tanmlarken bu adresleri hesaplamak g olacandan dolaydeikenlere isim vermemek pek tavsiye edilmez. Deikenin tr ise boyutu ile alakldr,rnein DB ile deikenimizin 1 byte lk olacan belirtiyoruz. Son olarak deikenindeeri tabi ki bir rakam yada say olmak durumunda. ayet balangta deer nemli

    deilse ? operatrn kullanabilirsiniz.

  • 8/14/2019 80x86 processor

    55/131

    Kaynak kodda deikenleri bu ekilde yazarak assemblera hafzada yer tahsis etmesinisylemi, bir baka deyile deiken deklare etmi oluyoruz.

    aret Karmaas

    1 byte lk bir hafza alanna ne sar? Toplam 256 adet farkl deer 1 byte iletanmlanabilir. Bunlar onluk dzende 0-255 aras saylar veya -128 den 127 ye kadarolan iaretli saylar olabilir. Kafanz karmasn bu deerleri aslnda binary olarakdnmek lazm, nk 0...255 ve -128...127 aras saylar toplam 512 adet ediyor.Aslnda, bunlar sadece 1 lerin ve 0 larn kombinasyonlardr. Yani 1 byte 0000 00002 ile1111 11112 arasnda deien kombinasyonlardan oluur.

    Gnlk hayatmzda iaretli bir sayy tanmlamak ne kadarda kolay deil mi? Bana -iaretini getirdiimiz zaman ilem tamamdr. Fakat bilgisayarlarda 1 ve 0 dan bakakullanacanz bir deer yok. aretli veya iaretsiz saylar, harfler, metinler, resimler,mp3 ler ve Tomb Raider :) tamamen 1 ve 0 lardan oluur. te bu 1 ve 0 lar programiinde yorumlamak nemlidir, ancak o zaman anlam kazanrlar.

    Aslnda ilemci (CPU) sadece matematiksel, mantksal ve veri tama ilemleri yapar. Bubalamda bizim iin alt seviyede nemli olan 1 ve 0 lardr. O zaman iaretli ve iaretsizsaylar neye gre belirlenecek? Boyutlar ve ilemci durum kaydedicisi (flag register)burada imdadmza yetiiyor. rnein 1111 1111 deeri onluk dzende 255 mi yoksa -1 mi.

    255 tir, nk 1111 11112 = 20+21+22+23+24+25+26+27 = 255

    -1 dir, nk 1 ile toplandnda 1 byte lk alanda 0000 00002 deeri elde edilir ve eldebiti oluur.

    ekil 1 - 1 byte lk bir deer 1 byte lk baka bir deerle toplannca sonu 1 byte lk olmak zorundadr.

    1 byte lk bir deer 1 byte lk baka bir deerle toplannca sonu bir byte lk olmak

    zorundadr, nk ayrlan fiziksel alan bu kadardr. Bu ilemde artan 1 bitlik deer ilkokulmatematiinden bildiimiz elde dir ve bu elde ilemci durum kaydedicisinin C (carry)bitinde saklanr. Daha nce ilemci durum kaydedicisinin bitsel olarak nemli olduundanbahsetmitim.

    Bu kargaa tamamen boyutlarn snrl olmasndan kaynaklanyor. Ayrca bilgisayarn buhesap mant ile pozitif bir say bir baka pozitif say ile toplandnda negatif bir deerde elde edilebilir. Bunu tam tersi de olabilir. Biz bunlar ilerleyen makalelerimizde, ilemcidurum kaydedicisini anlatrken iaret ve boyut tamas olarak inceleyeceiz. imdilik sizmatematiksel hesaplamalar yaparken alanlarn kstl olduunu gz ard etmeyin. Yani 2sayy toplayan program yerine, sonu olarak maksimum 255 deerini gsteren programdemek u anda daha doru olur :)

    BAST DEKENLER

  • 8/14/2019 80x86 processor

    56/131

    Byte Deikenleri

    Bir byte boyutunda deerleri deklare etmek istiyorsak genellikle DB direktifinikullanyoruz. DB ngilizce de Define Byte yani byte tanmla anlamna gelir. Bu direktif ilehafzada 1 byte lk bir alan tahsis eder ve bu alana adresi ile eriebilirsiniz. MASM ile DBdirektifi yerine byte yada sbyte direktiflerini de kullanabilirsiniz, fakat sonuta

    assembler n yapaca i ayndr.

    i db 0

    j byte 255 ;MASM iin alternatif direktif

    k sbyte -1 ;MASM iin alternatif direktif

    Yukardaki tanmlama farkl gibi gzkse de assembly dili yazm deikenleritanmlarken boyut dnda bir snr koymaz. rnein k deikenine sonradan "mov k,125" komutu ile pozitif bir deer atayabiliriz. Yaplamayacak olan ise "mov i, 300" veya"mov j, -150" gibi 1 byte a smayacak deerleri bu deikenlere atamaktr.

    DB direktifi ile;

    Ayrlan Hafza Alan : 1 ByteTanmlanabilecek Deer Aral: -128...255

    Word Deikenler

    DW 8086 dan 80286 ilemcisine kadar offset adresleri, iaretli ve iaretsiz tamsaylartanmlamak iin kullanlan en geni veri tipiydi.

    -32768...65535 arasndaki tam saylar DW direktifi ile deklare edebiliriz. MASM iin wordve sword direktifleri de ayn ii grr. Word deikenler hafzada 16 bit yani 2 byte lk

    alan kaplarlar.

    sayi1 dw ?

    sayi2 dw ?

    isayi1 dw ?

    sayi_0 dw 0

    sayi_eksi dw -1

    sayi_enbuyukdw 65535

    pointer dw sayi1

    zetle DW direktifi ile;

    Ayrlan Hafza Alan : 2 ByteTanmlanabilecek Deer Aral: -32768...65535

    Double Word Deikenler

    4 byte lk deikenler tanmlamak iin kullanlr. DD direktifi ile bu trdeki deikeleritanmlayabilirsiniz. MASM ile dword, sdword direktiflerini de kullanabilirsiniz.

    sayi1 dd ?

    sayi2 dd ?

  • 8/14/2019 80x86 processor

    57/131

    isayi1 dd ?

    sayi_0 dd 0

    sayi_eksi dd -1

    sayi_enbuyukdd 4000000000

    pointer dd sayi2

    DD direktifi ile;

    Ayrlan Hafza Alan : 4 ByteTanmlanabilecek Deer Aral: -2,147,483,648...4,294,967,295

    6, 8 ve 10 Byte lk Deikenler

    DF direktifi ile 6, DQ direktifi ile 8 ve DT direktifi ile 10 byte lk deikenler tanmlanr.Fakat bu direktifler aslnda kayar noktal BCD (ikilik dzende kodlanm onluk saylar)saylar iin kullanlr. Bu 3 direktifin asl kullanm amalar aada aklanyor.

    DF: 80386 ve st ilemcilerde, 32 bitlik korumal modda, 48 bitlik pointer (indekslemeamacyla, offset adreslerini gstermek iin kullanlan bir iareti) olarak kullanlr. Budirektif ile 6 byte lk deikenlerin tanmlanmas mmkn olsa da 80386 ve sonrasilemcilerde pointer olarak kullanlr.

    DQ: 64 bitlik kayar noktal saylar 64 bitlik tamsaylar deklare etmek iin kullanlr. Dahaok kayar noktal saylar deklare etmek iin kullanlr, nk x86 ailesinin henz 64 bitlikgenel amal bir kaydedicisi yoktur. Yani bu direktif ile 64 bitlik bir tam say deklareettiinizde, bu say ile dorudan ilem yapamazsnz nk en byk kaydedici 32bitliktir.

    DT: Daha hassas (80 bitlik) kayar noktal saylar ve 10 byte lk BCD deerleri deklareetmek iin kullanlr.

    Yukardaki direktiflerle ilgili ayrntl bilgileri kayar noktal saylarla ilemler bal altndailerleyen makalelerimizde vereceim.

    Pointer Veri Tipleri

    Pointer iareti anlamna gelip adresleme modlarnda grdmz indeksli adresleme ilealakaldr. x86 uyumlu ilemciler iki tr pointer desteklerler. Bunlar near (yakn) ve far(uzak) pointer lardr. Buradaki yakn ve uzak kavram referans alnan adresin segmenti

    (64Kb.) amamas yada amas durumunu ifade eder.

    Near pointer ler 16 bitlik tir ve bir segmentin offsetlerine erimek iin kullanlrlar. p birdeiken olsun, p=1000h iin aadaki kodlar inceleyelim.

    mov bx, p ;BX e p pointern ykle.mov ax, [bx] ;p nin gsterdii konumdaki veriyi AX e getir.

    rnekte AX kaydedicisinin deeri pointer n iaret ettii adresten alnacak 2 byte lkdeer ile deiecektir. Bir baka deyile DS:1000h ve DS:1001h adresindeki deerlerAX e yklenecek. Bu ilem ayn segment iinde olduundan dolay, pointer near yaniyakn blgedeki bir adresi gstermi oldu. Aslnda mov ax,ds:1000h komutu da ayn ii

    yapard fakat pointer deikeni kullanlmadndan sonradan pointer deerini deitiripayn komut satr ile hafzann baka bir blgesine erimek mmkn olmazd.

  • 8/14/2019 80x86 processor

    58/131

    Far (uzak) pointer lar ile hafzann istediiniz blgesine eriip ilem yapabilirsiniz. Bununiin pointer deklare edilirken DD direktifinin kullanlmas gerekir, yani pointer 32 bitlikolmaldr. BX, BP, SI ve DI kaydedicilerini erieceiniz uzak offsetler iin herhangi birsegment kaydedicisini de (ki bu genellikle ES olur) erimek istediiniz segment iinkullanabilirsiniz. sterseniz bunu bir rnek ile aklamaya alalm.

    5555:3333 adresine e