assembly ders notlari

Upload: ce10ur

Post on 12-Jul-2015

2.127 views

Category:

Documents


49 download

TRANSCRIPT

Bu yazda X86 ilemcilerine giri yapp Assembly programlama ile ilgili giri bilgisi vermeye alacam. X86 NEDR ? X86 Intelin ilk mikroilemcilerinden olan 8086 ile ilgili programlama kurallarn ifade eden bir tanmlamadr. Intelin nemli zelliklerinden biri olan "geriye dnk yazlm uyumluluu" byle bir tanmlamann olumasn salam. yle ki; 8086 mikroilemcisi olan bir bilgisayar sisteminde hazrladnz herhangi bir assembly program X86 uyumlu tm bilgisayarlarda alr. 80286, 386, 486 SX veya DX, Pentium, Pentium III, AMD nin 286, 386 ilemcilerinde veya Nexgen, Cyrixin ayn tr ilemcilerinde ve dierlerinde bu program alacaktr. Bu demek oluyor ki yukarda saydmz tm mikroilemciler ve uyumlu olan dierlerinin ortak bir yn var. Bu ortak ynler ortak program kodlarn olmas ve mikroilemcilerinin temel mimarileri birbirinin ayn olmasdr. Yeni bir mikroilemci retildiinde, eski mikroilemcilere uyumlu olmas byk bir avantajdr. yle olmasayd bugn dnyada %90 orannda PC, X86 uyumlu ilemci kullanyor olmazd. Bu yzden mikroilemci pazarnn bu byk dilimini birka firma paylayor, aslan payn Intel, daha sonra AMD geliyor, Cyrix ve Nexgen gibi dier mikroilemci reten firmalarn isimlerini pek duymuyoruz. X86 tabanl sistemlerin mimarisi birbirine benzer. Birde X86 tabanl olmayan sistemler vardr. Apple firmasnn iMAC bilgisayarlar, yada SUN Microsystems firmasnn sistemleri X86 tabanl mikroilemciler kullanmadklar iin bu tr bilgisayarda alan programlar X86 tabanl sistemlerde almazlar. unu unutmayalm; dnyada yaklak %90 orannda X86 uyumlu PC sistemi kullanlyor. Bu yzden bu X86 assembly dili dier assembly dillerinden daha geerli bir 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 ile yazlan daha ksa olduunu grrz, ayn zamanda mikroilemciyi ve hafzay daha verimli kulland iin assembly dilinde yazlan program dierlerine nazaran daha gl olacaktr, son olarak assembly dilinde yazlan program dierine oranla ok daha hzl alr. Son zamanlarda mikroilemcilerin hzlar GHzler (giga hertz ciga herz diye okunur) mertebesine ktndan assembly dilinin en byk zellii olan hzll artk pek popler deildir. Kullancya, 2GHz hzndaki bir CPU da hemen hemen her uygulama ayn hzda alyor gibi grnr. Buna ramen C gibi yksek dzey programlama dilleri ile hazrlanan byk projelerde ilemciyi ok fazla megul edecek olan kod blmleri assembly rutinleri arlarak yaplmaktadr.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

NEDEN ASSEMBLY? X86 Assembly dilini renmek kolaydr ama bu dilde proje hazrlamak insan ileden kartabilir. Bu yzden gnmzde X86 assembly dili yerine, daha ok endstriyel alanda kullanlan microcontroller chiplerin assembly dili kullanlmaktadr. Bir programc assembly dilinde byk uygulamalar hazrlamaz (genellikle). Bunun nedeni st dzey programlama dilleri olan delphi, C, C++, Pascala gre daha dikkat gerektirir ve kod yazm daha zordur. Programc assembly dilinde proje hazrlayacaksa kulland sistemin mikroilemcisini ve hafza haritasnn yannda, sistemin donanmnda iyi bilmesi gerekir. Her eyden nemlisi zamandr ki sadece assembly dili ile PC uygulamalar gelitirmek ine ile kuyu amaya benzer. Assembly alt dzey bir programlama dilidir yalnz alt dzey kelimesini yanl anlamayn, bu kelime bu dilin ilemciye ve hafzaya olan yaknln belirtir, st dzey diller ise daha ok programcya yani insana yakndr. Bu yzden assembly dilinin zel kullanm alanlar vardr. Ksaca bunlar syle sralayabiliriz. 1234567Bilgisayar sistemini yakndan tanmak iin, Device driver (cihaz srcleri) yazmak iin, Chiplere program yklemek iin (PIC, microcontroller gibi...) letim sistemlerinin yapmnda (OS), ifre krma ve Hacking ilemleri iin, Virs programlar yazmak iin, Elektronik tablolama (Excel gibi) programlarnda.

LK X86 ASSEMBLY KODLARIMIZ PC platformunda dorudan hafzaya sembolik kod kullanmadan yazacamz bu programck iin herhangi 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 kullanyorsanz balat mensnden MSDOS komut istemini altrmanz gerekiyor. Hala DOS iletim sistemini kullanyorsanz bilgisayarnzn power butonuna basmanz yeterlidir :) yani halihazrda komut isteminde olan bir trex siniz.

2- Komut istemindeyken cd\ yazn ve root dizinine gein burada kendinize md asm yazarak asm adnda bir klasr oluturun ve cd asm komutu ile klasrn iine girin. Tabi ki klasr oluturmak iin bu kadar eziyet ekmenize gerek yok,

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

amacmz biraz nostalji. Maksat projemiz bir klasrde olusun.

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

4- E 0100 yazp enter tuuna basnz.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

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

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

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Yukardaki ekran ktsnda grld gibi konsol ekranna MERHABA ASSEMBLY yazdrdk ve debug programndan kp komut istemine geri dndk. Hala hevesiniz krlmadysa :) neler yaptmz tek-tek aklayalm. Debug program Microsoftun tm iletim sistemlerinde bulunan, hafza ve CPUnun iindekileri grmemizi, dzenlememizi salayan bir programdr. ok ilkel bir program olmasna ramen beynimizin derinliklerine PCnin yapsn kazyacak olan ve bir assembly programcsnn bilgisayara ne ekilde bakmas gerektii konusunda yardmc olacak yegane programlardandr. En fazla 2 makale sonra Debug programn kullanmay brakp daha jan-jan l debuger programlar kullanacaz, imdilik byle idare 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 sylememizi salar; "Ey CPU yazdm bu kodlar srasyla altr bakaym". CPU programcnn sadk klesi olduundan aynen denileni yapar. E komutu ile hafzaya giri yaptmz syledik, komut isteminin en solunda 152F:0100 gibi baz rakamlar grdnz, buradaki 152F sizin bilgisayarnzda farkl olabilir, ama 0100 ayndr. ite : simgesi ile ikiye ayrlm bu 8 rakam hafzann adresidir. Kodlar hafzaya yazlr, silinir, deitirilir fakat bu srete 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 gelir arkada gelir bazen tatilde bo kalr yani evin iindekiler deikendir ama ama ev adresi her zaman sabit kalr, ta ki ev yklana kadar :) E komutu ile bu rnekte hafzann 152F:0100 adresi ile 152F:011B adresleri arasn makine kodlar ile doldurduk. Bunu yaparken kod yazacamz adreste hali hazrda hangi kodun olduunu grme gibi bir lkse 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 yer kapladndan hexadecimal gsterim benimsenmitir. Daha sonra hexadecimal gsterimin anlalmas zor olduundan sembolik kodlar ile yazlan Assembly programlama dili gelitirilmitir. nsan olu rahatna pek

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

dkn olduundan :) daha sonra, kod yazmas ve anlalmas daha kolay olan B Programlama dilini gelitirmi bu da yetmemi C dilini gelitirmitir. (Bu sralamada Assembly programlama dilide A oluyor tabi ki) Programlama dilleri ABC diye devam derken C harfini ok seven programclar buna ++ ve # gibi aksesuarlar takarak deiik varyasyonlar denemiler ve okta baarl olmulardr :) Neyse laf fazla uzatmadan ve "ey programc gemiini bilmeyen geleceinden bir haberdardr" diyerek konumuz geri dnelim. X86 PClerin hafzas byte adreslenebilir diye bir programc ata sz vardr. Bu sz her adrese en fazla 1 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 getirince dosya 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 arkyda sizler iin syleyebilirim :) BU KODLARI OK SEVDYSENZ GELN BUNLARI SAKLAMAK N BR PROGRAM DOSYASI OLUTURALIM Bu ilemi yapmak iin ncelikle programda ne kadar kod kullandmz bilmemiz yani programn byte cinsinden uzunluunu bilmemiz gerekir. Kodlar kendi elimizle teker teker girdiimizden uzunluunun 28 byte olduunu biliyoruz. Emin olmak iin 5. admdaki ekilden faydalannz. Dosya oluturma ilemi iin ilk nce CPUnun CX kaydedicisine (CX ne yahu, kaydedicide ne demek kardeim dediinizi duyar gibiyim merak etmeyin bu terimler ileride hi aznzdan dmeyecek) 28in hex. karl olan 1Cyi yazacaz. Daha sonra debugn N komutu ile dosyaya isim vereceiz ve son olarak W komutu ile harddiskimize kayt yapacaz. Son olarak debugtan kp komut istemine geri dneceiz ve oluturduumuz program altracaz. Ltfen aadaki ekli inceleyiniz. (Yalnz komut istemi penceresini kapattysanz iiniz ya 1.adma geri dnmeniz gerekiyor nk kodlar hafzadan silinmi olabilir)

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

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

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

Programmz konsol ekranna MERHABA ASSEMBLY yazd ve iletim sistemi tarafndan sonlandrld. Programmz bir dosya haline getirdik, Microsoftun iletim sistemlerinde 2 tr program dosyas mevcuttur ve bunlar dosya ismini takip eden EXE ve COM uzantlar (file extensions) ile tannrlar. Bir burada COM olanndan oluturduk, endielenmeye gerek yok EXE uzantl dosyada oluturacaz ve COM ile EXE arasnda ne gibi farklar var onlar da greceiz fakat bunlar bizim iin henz ok ileri konular, sabretmek lazm :) Bu program bir sonraki makalemize kadar silmeyin, nk bir sonraki makalemizde bu dosyadan faydalanp sembolik kodlardan oluan assembly diline gei yapacaz ve eksik kalan noktalar tamamlayacaz. Siz bu arada

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

bo durmayp bu kodlar zerinde oynamalar yapabilirsiniz zellikle 12. koddan itibaren son koda kadar olanlar deitirin (son kod hari) nk bunlar MERHABA ASSEMBLY yazsnn ASCII kod karldr. Bunun iin ASCII kod tablosundan faydalanabilirsiniz. Baka bir programlama dili biliyorsanz ayn yazy yazan program o programa dili ile yazp dosya boyutunu buradaki ile karlatrnz. Ayrca Debug programnn dier komutlarn grmek iin iaretinin grld modda ? yazp enter tuuna basnz. Bir sonraki makaleye kadar esen kaln ve kendinize iyi davrann.

Geen makalemizde debug programn tanm ve makine kodlar ile kk bir program hazrlamtk. Sonra bu program yine debug ile bir dosya haline getirmitik. imdi bu dosya ile biraz daha yakndan ilgilenelim. Yine komut istemine gei yapp debug programn ekildeki gibi altralm. Not:Geen makalemizdeki dosyay kaybettiyseniz buradan indirin ve C:\ dizininde asm adnda 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 ama aslnda merhaba.com adl program dosyasn oluturan makine kodlarn oktan hafzaya yklediniz bile. Makine kodlarn grmeden nce sizlere kk bir tavsiye vermek istiyorum. Assembly programlama dilinde ayrntlar ok nemlidir ve her bir ayrnt kendi apnda bir aratrma konusu olabilir, rnein burada yaptnz program ykleme ilemini windows kullanclar, programn simgesine mouse ile tklayarak yapyorlar ve hatta bu ekilde program hafzaya yklendikten sonra birde iletim sistemi tarafndan altrlyor. imdi aklnza u soru gelmeli; program simgesinin zerine gelip mouse ile tk-tk yapld andan itibaren, programn yklenip altrlmasna kadar sistemde neler ve nasl yaplyor? yle deil mi? Nelerin yapldn geen

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

makalemizi takip ettiyseniz tahmin edebilirsiniz ama nasl yapldna gelince o i biraz sistem programclna giriyor yani bizim iin biraz erken. Neyse biz konumuza geri dnelim, program u anda hafzada ve 0100h offset adresinden itibaren yklenmi durumda. Hemen kodlar grelim o zaman.

ekil 2 - Debugn "d" komutu

Debugn d komutu "dump" anlamna gelip programlama aleminde kodlar ekrana yada kada dkmek gibi bir anlam vardr. Bizde burada kodlar ekranda gsterdik. Neden 0100h adresinden itibaren hafzaya yerleti? sorusunun yant program dosyasnn .com uzantl olmasndan kaynaklanr ve geen makalemizde akladmz gibi sonraki makalelerde ele alnacak bir konudur. Burada nemli olan husus sizin 0100 offset adresi ile 010B offset adresleri arasnda kalan makine kodlarndan bazlarnn komut kodlar bazlarnn ise data (veri) kodlar olduunu bilmenizdir. Tabi ki ekrana yazdrlacak olan MERHABA ASSEMBLY burada data snfna giriyor peki komutlar nerede?

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 3 - Datalarmz...

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

ekil 4 - Makine ve Assembly Dili Yan yana

Yukardaki ekilde makine kodlarn sar assembly kodlarn krmz erevede grebilirsiniz. Tabi ki assembly dili bizlere daha yakn bir dildir. Assembly dilindeki bu gsterim ayn zamanda sembolik kodlar olarak ta bilinir. Kodlar

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

assembly dilinde grmek iin debugn "u" (unassembly) komutunu kullandk, u dan sonra gelen 0100 010A ise hafza araldr, yani biz burada 0100h-010Ah offset adresleri arasnndaki makine kodlarn assembly dilinde grm olduk. imdi yukardaki ekilde grdmz makine ve assembly kodlarn karlatralm;

B409 MOV AH,09 Assembly dilindeki MOV AH,09un makine dilindeki karlnn B409 olduu grlyor ve assembly programclar "B409" ile gsterilen makine dilindeki bu ifadeyi iki ksma ayrrlar. Bunlar opcode ve operand alanlardr. Opcode B4 Operand 09

Tablo 1 : Opcode ve Operand

Buradaki B4 opcodeu ilenecek olan asl emirdir ve ancak mikroilemci (CPU) tarafndan kodu zldkten sonra 09 operanda komut ileme srecine katlr. Burada sadece opcode ile operand ayrmanz yeterlidir assembly dilindeki ifadeleri ne anlama geldiini imdilik nemsemeyin. Intelin opcode uzunluu 1 yada 2 bytelktr. 2 bytelk olan opcodelar 0F ile balar. Biz imdilik hep 1 bytelk opcodelar ile alacaz. Operandlar ise herzaman opcodelardan sonra gelir ve X86 mimarisinde 1,2,4 veya 8 bytelk olabilir. Bylece ortaya karma kark bir komut seti kar, bu yzdende Intelin x86 ailesi CISC (Complex Instruction Set Computers) olarak anlrlar. BA0B01 MOV DX,010B Burda 3 bytelk bir komut satr, opcode 1 bytelk operand 2 bytelk. Ama imdi kafamzda 2 tane soru iareti var, birincisi neden MOV komutunun makine dilinde 2 tane farkl opcodeu var? (yani B4 ve BAdan bahsediyoruz ve aslnda MOV komutunun makine kod karl 2 den de fazladr) ve ikinci soru neden MOV DX,010B iin operand ksm makine dilinde 0B01 olarak ters bir biimdedir? Opcode BA Operand 0B 01

Tablo 2 : Opcode ve Operand

Bu sorlarn cevab X86 uyumlu mikroilemci mimarisini anlayarak bulabilirsiniz. lk olarak B4 veya BA MOVun karl gibi grnse de yle deildir, B4= MOV AHn BA=MOV DXin opcode karldr. Yani ikisi de farkl assembly ifadeleridir ve farkl opcodelarnn olmas son derece normaldir. kinci sorunun cevab ise x86 ailesindeki ilemcilerin hafzaya erime ekillerinin ters sral olmasndan kaynaklanr. Tabi ki birde dz olarak bytelar yerletirme olay var, bunlar kitaplarda little endian byte ordering ve big endian byte ordering olarak geer. Aslnda byte dzenleri ok ok ileri seviyede nemli konulardr ayrca opcodelar gsterirken seilen bu hexadecimal deerlerde (B4 ve BA gibi) rastgele seilmi deerler deildir. Bu tr konular rencilik yllarmdayken

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

aratrmtm, gerekten epey zevkli konular, genellikle yksek lisans ve doktora snflarnda instruction anatomy (komut anatomisi) bal altnda incelenen konulardr. Programclk asndan ise sadece byte dzeni nemlidir. Bu yzden burada sadece bun iki kavram aklayacam. Little Endian Byte Ordering: Hafzda yklenecek olan bytelar dk deerlikli ksmndan itibaren yazlr. rnein 1234 gibi iki bytelk bir veriyi hafzaya 0100 offset adresinden itibaren yazdnz dnelim, bu ilem bitip hafzaya baktnzda greceiniz ey 0100=34, 0101=12 olacaktr.

ekil 5 - Little endian byte dzeni

Burada debugn "a" (assembly) komutunu vererek assembly dilinde program yazma moduna getik ve dw talimat ile hafzaya 1234 deerini girdik ve hafzaya, nce bu saynn dk deerlikli byte sonrada yksek deerlikli byte yazld. Big Endian Byte Ordering: Hafzaya yklenecek bytelar en yksek deerlikli ksmndan itibaren yazlr aynen bizim kat stne saylar yazdmz gibi. Sizlere burada bir tanede big endian rnei vermek isterdim fakat u anda elimde bir Apple PowerPC olmasna ramen MAC OSX iletim sistemi iin debugger yok :( Aadaki tablo hangi sistemlerin hangi byte dzenini kullandn gsteriyor. letim Sistemi Tru64 UNIX HP-UX AIX Byte Dzeni littleendian bigendian bigendian

lemci Tr Digital Alpha AXP Hewlett Packard PARISC IBM RS/6000

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Linux Intel x86 Windows Solaris x86 Motorola PowerPC Macintosh OS X SunOS Sun SPARC Solaris SGI R4000 Irix

littleendian littleendian littleendian bigendian bigendian bigendian bigendian

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

CD21 INT 21 B44C MOV AH,4C CD21 INT 21 INT 21de bir bytelk opcodeu ve bir bytelk operand olan baka bir komut satr. Bu arada MOV AH,4C nin opcodeu ile yukarda akladmz MOV AH,09un opcodelarnn ayn olduuna dikkatinizi ekerim. Buraya kadar ; 1- Neonun Matrixi grd gibi bizlerde hafzaya baktmzda orada grdmz bytelar nasl yorumlayacamz grdk, bu yolda kendinizi gelitirmeye kalkarsanz sizde belki bir gn Matrixi grebilirsiniz :) Yllardan beri ben hafza dkmlerine bakarm onlarda ekrandan doru bana bakarlar ama program boyutu 10Kb geince insan halslasyonlar grmeye balyor onuda belirteyim :) 2- Makine kodlar ile assembly kodlar arasndaki banty grdk, Borland gibi bir derleyici (compiler) yazan bir firma kurmak isterseniz, bu alanda en az bir doktora tezi vermeniz gerekir. Yani for (int i=0 ; i Eren ERENER # ;######################################## .MODEL .STACK .DATA Sayi1 Sayi2 Sonuc .CODE ANA MOV MOV MOV ADD MOV MOV INT ANA PROC AX, @DATA DS, AX AL, Sayi1 AL, Sayi2 Sonuc, AL AH,4CH 21H ENDP END ANA ;Data segment ;ayarlanyor. ;ALye 5 deeri yklendi. ;ALdeki 5 ile 6 topland sonu tekrar ALde. ;toplama ilemini sonucu hafzaya yklendi. ;DOSa ;dn SMALL 32

DB DB DB

5 6 ?

Bir programn alma sreci genel olarak yledir, program nce hafzaya yklenir ve mikroilemci ilk komuttan itibaren program atr-satr icra etmeye balar. Bu program hafzaya yklenirken hafzada mantksal olarak 3 tane segment oluturacak 1.si 32 bytelk stacak segment blgesi 2.si 3 bytelk data segment blgesi ve 3.s kodlarmn kaplad alan kadar code segment blgesi. lemci kaydedicileride programn yklenme srecinde ilk deerlerini alrlar. rnein CS kaydedicisi code segment blgesinin segment adresini ve IP kaydediciside bu blgede bulunan kodlarn ilkinin offset adresinin deerini alr. Bu olaylar en gzel uygulama yaparak anlayabiliriz, bunun iin sizlere bir video hazrladm. imdi kendinize bir kahve hazrlayn ve keyifle bu videoyu izleyin. Kafanza taklan bir soru olursa bana mail atabilirsiniz, bu arada olumluolumsuz eletirilerinizi bekliyorum. Bir sonraki makalede grmek zere hoa kaln.

ADRESLEME MODLARIBildiiniz gibi programlar oluturan kodlar ve veriler hafzaya yklendikten sonra ilemci tarafndan satr-satr icra edilirler. Ayrca CPU tm giri k ilemlerini de hafzaya erierek yapar. Bazen hafzadan dorudan bir kod ya da veri alr, iler. Bazen hafzaya bir veri gnderdiinizde birde bakmsnz bu bir

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

yazcdan belge olarak km vs. te bilgisayarn donanm ve yazlm dzeyinde yapt bunca eitli i iin CPU hafzaya deiik yollardan erime ihtiyac duyar. Sizlerde programlarnz yazarken CPUnun hafzaya nasl erieceini yazdnz kodlarla belirtmek zorundasnz. Assembly dilinin ilk basama olan adresleme modlar da bu konular kapsyor. Her mikroilemci reticisi bir mikro ilemci piyasaya srdnde, komut setini ve adresleme modlarnda yaynlar. Programclar da bu belgelere gre programlarn yazarlar. Intel 8086 ilemcisini piyasaya srdnde olduka kullanl bir dizi adresleme modu salad. Intelin u ana kadar rettii ilemcilerde bu adresleme modlarn kullanabilirsiniz. Daha sonralar bir devrim niteliinde olan 80386 ilemcisi ile ek adresleme modlarda geldi. Bu zel adresleme modlar sadece 386 ve sonras ilemcilerde kullanlabilir. Tabi ki bu ek adresleme modlar ile assembly programlama dili daha esnek bir yapya brnmt. Bizde bu makalemizde adresleme modlarn 386 ncesi ve sonras olarak ikiye ayracaz. u ana kadar yaptmz programlarda ok fazla komut rnei grmediniz ama makalelerimizi takip ettiyseniz MOV komutunu yakndan tanmanz lazm. MOV komutu assembly programlama dilinde en ok kullanlan komutlarn banda gelir. nk bir program alrken genelde hafzaya yazar yada okur. MOV komutu da bu i iin biilmi kaftandr ve bu kadar ok kullanldndan dolay bir ok adresleme modunu destekler, yani bu komut ile hafzaya ok deiik yollardan eriebilirsiniz. Bu yzden bu makalede adresleme modlarn anlatrken MOV komutunu rnek alacam. MOV komutunun genel kullanm ekli; MOV hedef, kaynak

8086 ADRESLEME MODLARI: 8086 Kaydedici Adresleme:Adndan anlalaca gibi kaydediciden kaydediciye yaplan ilemlerde bu adresleme modlar kullanlr. En hzl adresleme modudur, nk ilem hafzada deil ilemcinin iinde gerekleir. Genel amal ve indeks kaydedicilerde kaydedici adresleme modlar: mov mov mov mov mov mov ax, bx dl, al si, dx sp, bp dh, cl ax, ax ; BX teki deeri AXe kopyalar ; AL teki deeri DLye kopyalar ; DX teki deeri SIya kopyalar ; SP deki deeri BPye kopyalar ; CL deki deeri DHa kopyalar ; Bu da doru bir kullanmdr!

Kaydedici adreslemede en ok dikkat etmeniz gereken husus hedef ve kaynan boyutlardr. rnein 16 bitlik bir kaydediciden 8 bitlik bir kaydediciye tama yaplamaz! mov al, bx ;yanl kullanm, derleme annda assembler hata verir.

Kk boyuttaki kaynaktan byk boyuttaki hedefe de kopyalama yaplamaz.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

mov

cx, al

; Yanl kullanm, ALile CX eit boyutta deil.

Bunlara ek olarak segment kaydedicilerinin kullanmnda dikkat edilmesi gereken noktalar vardr. 1- Segment kaydedicileri arasnda bir transfer ilemi ancak genel amal bir kaydedici vastasyla yaplabilir. mov ds,cs ; doru kullanlmayan segment kaydedicisi eklinde assembler hata verir! Bu ii yapmak iin, mov mov ax,cs 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 ilem mmkn deildir! Segment kaydedicileri programn icras aamasnda hafzann segment olarak adlandrlan blmlerinin adreslerini tuttuklarndan, bu kaydedicileri verilerinizi saklamak veya tamak iin kullanmanz tavsiye etmem, kullanlmamaldrlar. Bunun yerine genel amal kaydedicileri kullanmanz daha uygun olur.

8086 Hafza Adresleme Modlara- Acil Adresleme ( Immediate Addressing ) Herhangi bir genel amal veya indeks kaydedicisine dorudan bir deer ykleye bilirsiniz. Yklenecek olan veri kod segmentten alnacandan bu tr kullanmlar ahsen ben pek tavsiye etmem. yi bir program organizasyonu iin, veriler hafzann ayr bir blmnde (mesela data segmentte) deikenler veya sabitler olarak belirtilmelidir. mov al, 17 ; ALye 11h yklenir.

b- Direkt Adresleme (Displacement Only Addressing ) Acil adreslemenin doru kullanlm eklidir. Bu adreslemede segment:ofset adresi kullanlarak hafzaya eriilir.

mov mov mov mov (2 byte)

al, ds:12 ds:12, al ax, ds:12 ds:12, ax

; ; ; ;

ds:000C adresinden 1 byte ALye kopyalanr. ALnin ierii ds:000C adresine kopyalanr. ds:000C adresinden 2 byte AXye kopyalanr. AXnin ierii ds:000C adresinden itibaren kopyalanr

Aslnda kaynak kod hazrlanrken genelde bu ekilde bir kod yazm yaplmaz. Deikenler ve sabitler sembolik kelimelerle ifade edildiinden buna gerek yoktur. Ne var ki debugger programlarnda da sembolik deiken isimlerini deil

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

adresleri grrz. Aadaki kod parasn inceleyin; .data sayi1

db 5

.code mov ax, @data mov ds, ax mov mov al, sayi al, ds:0000 ; 5 deerini alye ykler. ; ayn ii yapar yani 5i ALye 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 keli parantez iine alnr ve bu andan itibaren bir offset adresi oluverir. mov al, [bx] ; hafzadan ALye 1 byte tanr. Alnacak verinin offset adresi BXin deeridir. mov mov mov mov al, al, al, al, [bx] [si] [di] [bp]

Yukardaki 4 rnekte ALye kopyalanacak verilerin offset adresleri ilgili kaydedicinin iindeki deerdir. Segment adresleri ise ilk nn DS sonuncusunun SSdir. BP indeks kaydedicisi yalnz bana hafza adreslemede kullanlrsa, daima stack segmentin (SS) offset adreslerini gsterir. Fakat BP kaydedicisi de dahil olmak zere bu adresleme segment kaydedicileri de belirtilerek yaplrsa, o zaman ilgili segment:offset adresine eriilmi olunur. BX=0000, BP=0001, SI=0002, DI=0003 olduunu varsayalm; mov mov mov mov mov mov mov mov al, al, al, al, al, al, al, al, cs:[bx] ; ALye CS:0000dan kopyalama yaplr [bx] ; ALye DS:0000dan kopyalama yaplr ds:[bp] ; ALye DS:0001den kopyalama yaplr [bp] ; ALye SS:0001den kopyalama yaplr ss:[si] ; ALye SS:0002den kopyalama yaplr [si] ; ALye DS:0002den kopyalama yaplr es:[di] ; ALye ES:0003den kopyalama yaplr [di] ; ALye DS:0002dan kopyalama yaplr

d- ndeksli adresleme ( Indexed Addressing ) Kaydedici dolayl adreslemenin operandna sabit bir deer eklenmi halidir. Kullanm ekli; mov mov mov al, disp[bx] al, disp[bp] al, disp[si]

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

mov

al, disp[di]

Not : disp ksaltmas ngilizcede displacement kelimesinin karldr. Buradaki anlam ise referans alnan ofset adresidir. Komut setlerinde adresleme modlar aklanrken disp veya mem ksaltmas ile ok sk karlaacanzdan, komutlar yazarken ngilizce ifadeler kullanmak durumunda kaldm. Mesela BX=2000h olsun, mov dl, 20h[bx] eklinde bir komut kullanldnda, DS:2020h adresindeki 1 bytelk deer dlye kopyalanacaktr. Ayn ekilde BP=3030h olduunu varsayalm, mov dh,1020h[bp] gibi bir komut ile, SS:4050h adresindeki 1 bytelk deer dha kopyalanr. Bu adresleme modunda da BP segment kaydedicisi daima SSin ofsetlerini gsterir. Fakat kaydedici dolayl adreslemede de olduu gibi bizzat segment kaydedicisinide belirterek bu adresleme modunu kullanabiliriz. Bu durumda ofset adresleri komutta belirtilen segmentin ofseti olur. mov al, ss:disp[bx] burada SSin ofseti olmu. mov al, es:disp[bp] burada ESin ofseti olmu. mov al, cs:disp[si] burada CSin ofseti olmu. mov al, ss:disp[di] burada SSin ofseti olmu. ; BX normalde DSnin ofsetlerini gsterirken ; BP normalde SSnin ofsetlerini gsterirken ; SI normalde DSnin ofsetlerini gsterirken ; DI normalde DSnin ofsetlerini gsterirken

e- Taban ndeksli adresleme ( Based Indexed Addressing ) Bu adresleme modu da kaydedici dolayl adreslemeye ok benzer. Kullanm format aadaki gibidir; mov mov mov mov al, al, al, al, [bx][si] [bx][di] [bp][si] [bp][di]

BXin 0500h SInn 0360h olduunu varsayalm, mov al,[bx][si] gibi bir komut ilenince ALye kopyalanacak veri DS:0860 adresinden alnr. Ayn ekilde; BP=1598h DI=1004 ve mov ax,[bp+di] gibi bir komut ileniyorsa; AX, SS:259Ch ve SS:259Dh adreslerindeki veri ile yklenir. SI ve DI kaydedicileri iin Intelin zel komutlar vardr, bu yzden bu kaydediciler genellikle programlamada indeks deerlerini tutar, arttrr veya azaltrlar. f- Taban ndeksli art direkt adresleme (Based Indexed Plus Displacement Addressing) Bu adresleme modu taban indeksli adreslemeye 8 yada 16 bitlik sabit bir deerin eklenmi halidir.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

mov mov mov mov

al, al, al, al,

disp[bx][si] disp[bx+di] [bp+si+disp] [bp][di][disp]

BP = 1000h, BX= 2000h, SI= 0120h, DI = 5 olduunu varsayalm. mov al,10h[bx+si] mov ch,125h[bp+di] mov bx,cs:2[bx][di] yklenir ; ALye DS:2130 adresindeki veri yklenir ; CHa SS:112A adresindeki veri yklenir ; CS:2007 adresinden itibaten 2 bytelk veri

TASM ve MASM n adresleme modlar iin esneklii. TASM ve MASM assemblerlar indeksli, taban indeksli, ve taban indeksli art direkt adresleme 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] rneinde olduu 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. Aadaki ekil, bu 17 adresleme modunu ezberlemeniz yerine kolayca hatrlamanza yardmc olacaktr.

ekil 1 - 8086 adresleme modlar iin yardmc ekil.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

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 bir adresleme 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 kolayca kartabilirsiniz. disp[bx][si], disp [bx][di], disp[bp][si], disp[bp][di]. Not:Hafza adresleme modlarnda ayet hesaplanan etkin adres 0FFFFh deerinden byk olursa, CPU bu hesaplama sonucu oluan tamay gz ard eder ve FFFFhe ekleneni 0 dan itibaren ekler. rnein BX=10h olsun ve mov al,0FFFFh[bx] komutu ilensin. Bu durunda 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 modlarn anlatmaya altm. Kaydedici adresleme de segment kaydedicilerini kendi amalar dnda kullanmanz tavsiye edilmez, bu i iin yeterince genel amal ve indeks kaydedicisi var zaten. Kark olan ksm ise hafza adresleme modlardr. Hafza adresleme modlarnda belirtilen operand daima bir offset adresini iaret eder, buna etkin adres hesaplama da denir. Hafza adresleme modlarn unutmamanz iin sizlere kolay bir yol gstermeye altm. Adresleme modlarnn isimlerinden ziyade kullanm formatlar nemlidir. Her komut her adresleme modunu desteklemez. Hangi komutun hangi adresleme modunda kullanlaca komut setlerinden faydalanlarak bulunur. Bugne kadar gerek internetten gerekse Trke assembly kitaplarndan yaptm aratrmalarda, Trke olarak yaynlanm ayrntl bir komut seti bulamadm bu yzden ngilizce komut setlerinden faydalanyorum. 8086 instruction set veya x86 instruction set anahtar kelimelerini internetten aratacak olursanz karnza ynla komut seti gelecektir. Genelde komut seti klavuzlar aadaki tablo gibidirler.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

MOV - Move Byte or Word Usage: MOV dest,src

Operands Clocks

Size Bytes

286 386 486 reg, reg 2 2 1 2 mem, reg 3 2 1 2-4 reg, mem 5 4 1 2-4 mem, 3 2 1 3-6 imm reg, imm 2 2 1 2-3 segreg, 2 2 3 2 reg16 segreg, 5 5 9 2-4 mem16... ... ... ... ... ... ... ... ... ... ... ... ... ... ... Tablo 1 - MOV komutu iin rnek tablo

Bu tabloda birinci stun MOV komutu ile kullanlacak operandn hangi adresleme modlarn desteklediini gsteriyor. rnein mem,imm (displacement,immediate) acil adresleme yi desteklediini gsterir. reg,reg (register,register) kaydedici adreslemenin yaplabileceini, segreg,reg16 (segment register, register 16 bit ) bir segment kaydedicisine 16 bitlik bir kaydediciden kopyalama ileminin yaplabileceini gsterir. Clocks stunu bu komutlarn ilemci tarafndan ka admda ilendiini (ilemcinin tipine ve hzna gre bu zaman birimi deiebilir), size bytes stunu ise hafzada makine kodlarnn byte olarak kaplad alan gsterir. ou zaman assembly programclar programlarnn, ilenme srecindeki nano saniyeleri ve hafzada kaplad alann byte dzeyinde nemi yoksa bu ksmlarla ilgilenmezler. Yani 1. derecede operands stunu nemlidir ve ilgili komutu bu stunda belirtilen formatlarn dnda kullanamazsnz. Son olarak x86 uyumlu hibir ilemci mem,mem eklinde yani hafzadan hafzaya dorudan bir adresleme modunu desteklemez, aslnda bu gne kadar bunu destekleyen hi bir ilemci grmedim, zaten byle bir adresleme modunun desteklenmesi durumunda o sistem iin yaplan programlarn kme olasl ok byktr.

80386 ADRESLEME MODLARI 80386 Kaydedici Adresleme (80386 Register Addressing)80386 den itibaren, gnmzde kullandmz Pentium ilemcilerin 32 bitlik kaydedicileri vardr. 8086 adresleme modlarna ek olarak bu ilemcilere de kaydedici adresleme yaparken bu 32 bitlik kaydedicileri de kullanabilirsiniz. Bu kaydediciler geen makalemizde bahsettiimiz; eax, ebx, ecx, edx, esi, edi, ebp, ve esp kaydedicileridir.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

kullanm format; mov eax, ebx

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

80386 Hafza Adresleme (80386 Memory Addressing)a- 80386 Kaydedici Dolayl Adresleme ( Register Indirect Addressing ) 16 bitlik Gerek moda (Real Mode) 80386 ve st ilemcilerde programlama yapmanz offset adreslerinin 32 bit olaca anlamna gelmez. Segmentlerin her zaman gerek moda 64Kb. olduunu unutmamak gerekir, bu yzden offset adresleri gerek modda 0...0FFFFh arasn gsterir. Yani 64Kb. geecek ofset adreslerini gerek moda deil ancak korumal moda (Protected mode) kullanabilirsiniz. Fakat gerek moda 32 bitlik kaydedicileri hesaplamalarda kullanmanzda bir engel yoktur. 80386 kaydedici dolayl adreslemede kullanabileceiniz tm geerli adresleme format aadaki gibidir. mov mov mov mov mov mov mov mov al, al, al, al, al, al, al, al, [eax] [ebx] [ecx] [edx] [esi] [edi] [ebp] [esp] ; DS in ofsetleri iin ; DS in ofsetleri iin ; DS in ofsetleri iin ; DS in ofsetleri iin ; DS in ofsetleri iin ; DS in ofsetleri iin ; SS in ofsetleri iin ; SS in ofsetleri iin

b- 80386 ndeksli, Taban/ndeksli, ve Taban/ndeksli/Direkt Adresleme modlar ( 80386 Indexed, Base/Indexed, and Base/Indexed/Disp Addressing ) 80386 ndeksli adresleme modu 32 bitlik bir kaydedici ile sabit bir deerin birleiminden meydana gelir. Taban indeksli adresleme modu iki adet 32 bitlik kaydedicinin birleiminden ve taban indeksli art direkt adresleme modu ise bir sabit deer ile iki tane 32 bitlik kaydedicinin birleiminden meydana gelir. Hibir zaman unutmamalsnz ki bu adresleme modlar ne kadar 32 bitlik olsa da, ayet 16 bitlik gerek moda kullanlrlarsa eriebilecekleri ofset adresleri 16 biti geemez. 80386 taban indeksli hafza adresleme modlarnda taban adres ve indeks adresi diye iki tane terim kullanlr. Taban adresini ilk operand iken indeks adresini son operand gsterir. Bu kural kaydedici ismi ne olursa olsun geerlidir. Fakat 8086 indeksli veya taban indeksli hafza adresleme modlarnda, taban adresini sadece BX veya sabit bir deer gsterebilirken, indeks adreslerinide SI, DI, BP ve BX gsterebiliyordu. 80386 ve sonras ilemcilerde bulunan bu esneklik phesiz ki programclarn iini kolaylatrr. Aada 80386 indeksli hafza adresleme modlar iin birka rnek grlyor; mov mov mov mov al, al, al, al, disp[eax] [ebx+disp] [ecx][disp] disp[edx] ;ndeksli adresleme ;modlar.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

mov mov mov mov

al, al, al, al,

disp[esi] disp[edi] disp[ebp] disp[esp]

;SS in ofsetleri iin ;iin.

Aadaki rneklerde ise 80386 taban indeksli adresleme modlar iin eitli rnekler grnyor. Bu rneklerde ilk kaydedici taban adresini gsterirken, ikinci kaydedici ise indeks adresini gsterir. Tabi ki sonuta bu iki kaydedicinin iindeki deerler toplanarak etkin olan hafza adresini iaret edecekler. Kaydedicilerin 32 bitlik olduunu dnecek olursanz 4GBlk hafzann istediiniz bir konumuna eriebilineceini de grebilirsiniz (tabi ki korumal modda). Burada taban adresi olarak esp ve ebp kullanldnda SSdeki bir ofset adresini gstereceini unutmayn. Bununla birlikte indeks adreslerini gsteren kaydedicilerin tr verinin hangi segmentten alnacana etkisi olmaz. mov mov mov mov mov mov mov mov al, al, al, al, al, al, al, al, [eax][ebx] [ebx+ebx] [ecx][edx] [edx][ebp] [esi][edi] [edi][esi] [ebp+ebx] [esp][ecx] ;Taban indeksli adresleme ;modlar. ;DS deki ofsetleri gsterirler.

;SS deki ofsetleri gsterirler. ;SS deki ofsetleri gsterirler.

Yukardaki adresleme modlarna sabit bir deer eklerseniz 80386 taban indeksli art direkt adresleme yapm olursunuz. mov mov mov mov mov mov mov mov al, al, al, al, al, al, al, al, disp[eax][ebx] disp[ebx+ebx] [ecx+edx+disp] disp[edx+ebp] [esi][edi][disp] [edi][disp][esi] disp[ebp+ebx] [esp+ecx][disp] ;Taban indeksli art direkt adresleme ;modlar. ;DS deki ofsetleri gsterirler.

;SS deki ofsetleri gsterirler. ;SS deki ofsetleri gsterirler.

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

c- 80386 lekli ndeksli Adresleme Modu (80386 Scaled Indexed Addressing Modes) Programclkla az ok uraan arkadalar diziler konusu bilirler. Yukarda anlattm 3 adresleme modu ile dizilerin elemanlarna rahata eriebilirsiniz. Fakat zellikle dizi ilemler iin bir adresleme modu aryorsanz 80386 lekli indeksli adresleme modunu kullanmak daha akllca olur. Bu adresleme modu ile indeks kaydedicisini 1, 2, 4 veya 8 ile arparak dizilerin elemanlarna erimede daha esnek bir yap salar. Kullanm; disp[index*n] [base][index*n]

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

veya disp[base][index*n] "base" ve "index" 80386nn herhangi bir genel amal kaydedicisi olabilir. "n" ise 1, 2, 4 ve 8 deerlerini alabilir. ebx = 1000h ve esi = 4, iin aadaki rnekleri inceleyelim; mov mov mov al,8[ebx][esi*4] ;ds:1018h daki veriyi dan ALye kopyalar. al,1000h[ebx][ebx*2] ;ds:4000h daki veriyi dan ALye kopyalar. al,1000h[esi*8] ;ds:1020h deki veriyi dan ALye kopyalar.

80386 ndeksli, Taban/ndeksli, ve Taban/ndeksli/Direkt Adresleme modlarn da 80386 lekli ndeksli Adresleme Modunun n deerinin 1 olduu adresleme modlar olarak dnebilirsiniz mov mov mov al, 2[ebx][esi*1] = mov al, 2[ebx][esi] al, [ebx][esi*1] = mov al, [ebx][esi] al, 2[esi*1] = mov al, 2[esi]

MASM ve TASM 80386nn tm bu hafza adresleme modlarnn yazmnda deiik varyasyonlar kabul eder. Aadaki tm operandlar ayn ii yaparlar. disp[bx][si*2], [bx+disp][si*2], [bx+si*2+disp], [si*2+bx][disp], disp[si*2][bx], [si*2+disp][bx], [disp+bx][si*2]

Sonu: 80386 adresleme modlar 8086 adresleme modlarna nazaran programcya daha ok olanak saladndan daha ok tercih edilirler. Benim ahsi grm X86 uyumlu PCler gerek gcn 80386 ilemcisi ile birlikte gelen bu olanaklardan almlardr. Zaten CPU tarihinde 80386 bir devrin kapanp dier bir devrin balad nokta olarak kabul edilir. Ne var ki 8086 adresleme modlar 80386 adresleme modlarna nazaran daha hzl alrlar. Bu yzden sz konusu olan hz ise (mikro saniyelerden bahsediyoruz ki bunlar bazen birleip dakikalar oluyor) adresleme modu seilirken ok dikkat edilmesi gerekir. 80386 taban indeksli ve taban indeksli art direkt adresleme modlar, lei 1 olan (n=1) 80386 lekli ndeksli Adresleme Modu olarak dnlebilir ve bu hafza adresleme modlarnda gsterilen ilk kaydedici taban ikinci kaydedici indeks adresini gsterir. Taban adresini gsteren kaydedici ebp veya esp ise bu adresleme SSdeki bir ofset adresine dier kaydediciler taban adresi olarak seildiinde DS deki bir ofset adreslenmi olunur. lk yazlan kaydedici lekli olarak gsterilirse ("*n") bu bir taban adresi olmaktan kar bir indeks adresi olur. Ayrca operanda segment kaydedicisini de gstererek adresleme modunu zorlayabilirsiniz.

[ebx][ebp] [ebp][ebx] [ebp*1][ebx] [ebx][ebp*1] [ebp][ebx*1]

;DSnin ofsetini gsterir. ;SSnin ofsetini gsterir. ;DSnin ofsetini gsterir. ;DSnin ofsetini gsterir. ;SSnin ofsetini gsterir.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

[ebx*1][ebp] es:[ebx][ebp*1]

;SSnin ofsetini gsterir. ;Zorlanm,ESnin 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 .STACK .DATA SMALL 32

VerilerByte DB 5h, 17h, 8Dh, 0AFh VerilerWord DW 1234h, 7h, 0C01Dh VerilerDoubleWord DD 3DF0178Ah, 11223344h, 12345678h .CODE ANA MOV MOV PROC AX, @DATA DS, AX ; Data segment ; ayarlanyor.

MOV MOV

AX, 5566h BX, AX

; Acil adresleme. ; Kaydedici adresleme.

;---------------------------------------;8086 Hafza Adresleme Modlarna rnekler ;---------------------------------------MOV DX, DS:0000h ; Direkt adresleme.

MOV BX, 0000h MOV AL, [BX] ; Kaydedici dolayl adresleme, DS:0000h adresindeki 5h deeri ALye kopyalanr. MOV AL, 3[BX] ; ndeksli adresleme, DS:0003h adresindeki AFh ALye yklenir MOV AL, 3[VerilerByte] ; Yukardaki ile ayn ii yapar, ; zaten assembler VerilerByte deiken ismini ds:0000h olarak evirecektir.

MOV SI, 0 MOV AL, [BX][SI] deer DS:0000hdaki 05htr. INC SI

; SI = 0 oldu. ; zaten BX=0d, u anda ALye kopyalanacak ; SIy 1 arttrdk,

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

MOV DS:0001hdaki INC INC MOV DS:0003hdaki

AL, [BX][SI] 17htr. SI SI AL, [BX][SI] AFhtr.

; imdi ALye kopyalanacak deer ; SIy, ; 2 arttrdk, imdi SI=3 oldu. ; imdi ALye kopyalanacak deer

; Burada BX taban SI indeks kaydedicisi oldu. MOV AL, [BP][SI] ; DS deil SS in offsetlerini adresler, u anda Stack Segmentin iinde ne olduunu bilmiyoruz!!! ;Taban indeksli art direkt adresleme MOV SI, 0 ; SI=0 oldu. MOV AX, 4[bx+si] ; BXi deitirmediimizden hala sfr ve AXe getirilecek 2 bytelk veri ds:0004h adresinden alnacak, ; nk 4+0+0 = 4tr. Bu adres VerilerWord deikenin adresidir ve bu adreste 1234h vardr. INC SI ; SI, INC SI ; 2 kere arttrlyor ve, MOV AX, 4[bx+si] ; VerilerWord dizisinin 2. elemanna eriiliyor. ; nk 4+0+2 = 6dr. Bu adreste 0007h vardr. ;---------------------------------------;80386 Hafza Adresleme Modlarna rnekler ;---------------------------------------.386 ; 80386 adresleme modlarn ve 32 bitlik kaydedicileri kullanmak iin bu direktifin yazlmas gerekir!!! MOV ESI, 0 SUB EBX, EBX kartma komutu, hzl yapar. MOV ile VerilerWord INC MOV ile VerilerWord ; ndeksi 1 olarak ayarland. ; ebx = 0 yapld. SUB (Subtract) yani ; burada "MOV ebx, 0" ile ayn ii fakat daha AX, 4[ebx][esi*2] ; 80386 lekli indeksli adresleme modu dizisinin 1. eleman (1234h) AXe kopyaland. ESI AX, 4[ebx][esi*2] ; 80386 lekli indeksli adresleme modu dizisinin 2. eleman (0007h) AXe kopyaland.

LEA EAX, VerilerDoubleWord ; LEA komutu (Load Effective Address) VerilerDoubleWord dizisinin balang adresini EAXe kopyalyor, ; 80386 kaydedici adresleme SUB EBX, EBX ; EBX = 0 oldu. ; 80386 taban indeksli adresleme. MOV ECX, [EBX][EAX] ; ve bu dizideki ilk eleman (3DF0178Ah) ECXe kopyalanyor. MOV INT ANA AH,4CH 21H ENDP END ANA ;DOSa ;dn

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Yukardaki program sadece 8086 ve 80386 adresleme modlarna rnek olmas iin hazrlanmtr. Hafzadaki veriler nasl eriilir sorusuna yant arayanlarn bu program dikkatle ve satr-satr incelemesini tavsiye ederim. Sra bu program derledikten sonra Turbo Debugger ile ap hafzada ve ilemcide hangi olaylarn olduunu incelemeye geldi. Turbo Debugger programnn 16 ve 32 bitlik hafzay incelemek iin iki ayr versiyonu var u anda gerek modda alan programlar hazrladmzdan dolay 16 bitlik srmn kullanacaz. Program buradan indirebilirsiniz. ndireceiniz bu dosya Turbo Debugger, Turbo Assembler, Turbo Linker paketini iermekte. Ayrca bu pakete, iinizde belki hala DOS veya Windows 95 kullanan vardr diye bir mouse program ekledim. ayet durum byleyse nce konsola "mouse" yazdktan sonra Turbo Debugger altrn. Turbo Debugger Microsoftun debug ile ayn ii yapar fakat daha kullanl bir kullanc ara yzne sahiptir. Turbo Debugger ile program dosyalarnz atktan sonra bir ok ilem yapabilirsiniz. Not: Turbo Debugger pencere modunda altrrsanz GDI (Graphics Device Interface) kaynaklarn smrrcesine kullandndan bilgisayarnz yavalayabilir. Bu yzden tam ekran modunda balatmanz neririm. Program pencere modunda balattktan sonra konsol penceresinin ayarlarndan tam ekran yapmanzn da bir faydas olmaz. Bu yzden nce komut istemini an, sonra tam ekran yapn ve Turbo Debuggeri altrn. Turbo Debugger kullanmna ilikin birka ipucu: lk olarak konsola "td" yazarak program altrn. Turbo Debuggern ekranna ulaacaksnz.

ekil 2 - Turbo Debugger ekran.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Turbo Debugger ekran 5 blmden oluuyor. ekildeki 1, 2 ve 3 nolu ksmlar hafzay incelemek iin kullanlrlar. 4. ksm mikroilemci kaydedicilerini ve 5. ksmdada yine mikroilemci kaydedicilerinden olan flag register bitsel olarak grebilirsiniz. Genellikle 1. 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 symbol table" diye bir mesaj gelebilir. Bu mesaj penceresinde "OK" e tklayp almaya balayabilirsiniz.

ekil 3 - Turbo Debugger ile dosya ama.

Ayrca menlerden srasyla View/Another/File seeneklerini tklayarak baka bir dosyay dier bir pencerede aabilirsiniz. (Mesela kaynak dosyasn)

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 4 - Turbo Debugger ile ayn ekranda kaynak dosyanz da grebilirsiniz.

ayet bu pencerede yaz yerine hex kodlar grrseniz, pencerenin zerine sa tklayp alan menden "Display As" sein. Program altrma seeneklerini "Run" mensnden seebilirsiniz. F8 tuu program adm adm iletmek iin kullanlr, F7 ise adm-adm program ilenirken dngleri incelemenizi salar. Program adm-adm ilenirken mavi bir ubuk o anda hangi komutun ileneceini gsterir. Ayn ekranda ilemcinin kaydedicilerinin nasl deitiini gzlemleyebilirsiniz. Deiiklie urayan kaydediciler beyaz grnr. Programn tekrar altrmak iin "Run" mensnden "Program Reset" seeneini seebilirsiniz.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 2 - Program adm-adm ileniyor.

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

ekil 2 - Turbo Debugger ile hafza pencerelerini kullanma.

Yalnz .exe tipindeki program dosyalarnda verilerinizi grebilmek iin mov ax,@data ve mov ds,ax satrlarnn ilenmi olmas gerekir. Programnz satr-satr ilenme srecinde, adresleme yaplan bir komutun ilenmesi annda kod penceresinin sa st kesinde hafzann hangi blgesine eriildii grlebilir. Bu makalemizdeki program incelerken bu zellii ska kullanmanz gerekecek.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

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

Mesela yukardaki ekilde mov al, [BX] komutu ileniyor ve kaydedici dolayl hafza adresleme 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 Debuggern daha bir ok zellii var ama u anda bizlere bu kadar yeter. imdi sizler Turbo Debugger ile bu makaledeki program inceleyerek pratik yapn, ayrca bu gne kadar yazdmz programlar da Turbo Debugger ile inceleyerek program kullanmasn daha iyi kavrayn. Bir sonraki makalemizde veri tipleri ve x86 komutlarn inceleyeceiz. Daha sonra prosedr ve makrolarda grdkten sonra nihayet kendi programlarnz yazabilir seviyeye geleceksiniz. Genelde sizlerden makalelerin daha sk aralklarla yaynlanmas ile ilgili mailler alyorum. Fakat bir makale hazrlamak en az 1 haftam alyor ve niversitedeki derslerden ve ilerden dolay ok az vaktim oluyor. Bu yzden makalelerimin yaynlanma aral birden 20 gne srayabiliyor. Hal byleyken sizlerin aray soutmamak iin baka kaynaklardan faydalanmasn tavsiye ediyorum. Bu ekilde alan baz arkadalar internetten kaynak kod bulup, derleyip takldklar yerlerde bana mail atyorlar, bunlara cevap vermesi daha az zamanm alyor ve sizler iinde ok faydal olacandan eminim. ayet ngilizce okuduunuzu anlyorsanz sizlere Art of Assemblyyi tavsiye ederim. nternetten okuyabileceiniz bedava bir kitap. Mesela bu makaleyi yazarken bu kaynaktan ok yararlandm ve sizlere de tavsiye ederim

80x86 KOMUT SET (Blm 1) X86 tabanl mikroilemcilerin icra ettii makine kodlar sabit olmasna ramen, programlama dillerinin komut ve ifadeleri farkl olabilir. Assembly programlama dilininde dier programlama dillerinde olduu gibi bir dizi komutu vardr. Bu komutlar genelde mnemonikler (nivmonik diye okunur) eklindedir. rnein LEA mnemonii Load Effective Adres kelimelerinin ksaltlm eklidir. Bu makalemizde x86 Assembly programlama dilinin komutlarn anlatmaya alacam ve bu makalede aklanan komutlar rendiinizde kendi banza program yazabilir hale geleceksiniz. Aslnda 80386 ve sonras mikroilemciler iin daha birok komut mevcuttur ve bu komutlar assembly dilinde program yazma iini kolaylatrr. Bu komutlar ilerleyen makalelerimizde aklamaya alacam. 80x86 komutlar genelde 8 grup altnda incelenir. 1) Veri tama komutlar mov, lea, les , push, pop, pushf, popf 2) Dntrme komutlar cbw, cwd, xlat 3) Aritmetic komutlar

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

add, inc sub, dec, cmp, neg, mul, imul, div, idiv 4) Mantksal, kaydrma, evirme ve bitsel ilemler iin komutlar and, or, xor, not, shl, shr, rcl, rcr 5) I/O (Giri/k) komutlar in, out 6) Karakter dizi (String) komutlar movs, stos, lods 7) Program ak kontrol komutlar jmp, call, ret, Jxx (artl dallanma komutlar) 8) Dier komutlar clc, stc, cmc Veri Tama Komutlar Veri tama komutlar bir deeri bir yerden baka bir yere tamaya yarar. mov, xchg, lds, lea, les, lfs, lgs, lss, push, pusha, pushad, pushf, pushfd, pop, popa, popad, popf, popfd, lahf, ve sahf komutlar veri tama komutlardr. MOV komutu Bu komutun kullanm ekilleri aadaki gibidir. mov mov mov mov mov mov mov mov mov mov mov reg, reg mem, reg reg, mem mem, immediate data reg, immediate data ax/al, mem mem, ax/al segreg, mem16 segreg, reg16 mem16, segreg reg16, segreg

MOV komutu assembly dilinde ok kullanlan bir komuttur. Yukardaki kullanm ekilleri iin ngilizce ifadeler kullanlmtr, nk internetten eriebileceiniz komut seti referanslarnda hep bunlar karnza kacak. Tm komutlar iin geerli olan bu ngilizce ifadelerin Trke karlklar aadaki gibidir.

reg : register kaydedici, mem : memory hafza (RAM-ROM veya Giri/k portlar olabilir) immediate data acil adresleme ile kullanlan direkt veri

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

segreg : segment register segment kaydedicisi mem16 : memory 16 bit 16 bitlik hafza alan (dw direktifi ile tanmlanan veriler) reg16 : register 16 bit 16 bitlik kaydedici (AX, BX .. gibi)

MOV komutunu kullanrken yapamayacanz iki ey vardr, bunlardan birincisi mem, mem tipinde bir kullanmdr. Yani hafzann bir konumunda dier bir konumuna dorudan tama yapamazsnz. Bu ilemi yapmak iin tanacak veri nce mikroilemci kaydedicilerinden birine getirilmelidir. MOV sayi1, sayi2 ;yanl kullanm

Yukardaki gibi bir komut satr yazarsanz, derleyiciniz hata mesaj verir. Byle bir ilemi yapmak iin genel amal bir kaydediciyi kullanmanz gerekir. MOV MOV AX, sayi1 sayi2, AX

;sayi1 ve sayi2 deikenlerinin word trnden olduunu varsayyoruz.

MOV komutu ile yapamayacanz ikinci ey ise segment kaydedicilerine dorudan bir veri tamaktr. Yani acil adresleme modunu segment kaydedicilerine uygulayamazsnz. MOV DS, 1525h ; bu kullanm hataldr.

Segment kaydedicilerine bir deer ykleyebilmek iin genellikle genel amal kaydedicileri kullanlr. Ayrca segment kaydedicilerine ancak 16 bitlik boyutunda deerler yklenebileceinden genel amal kaydedicilerin 8 bitlik ksmlar deil 16 bitlik ksmlar kullanlabilir. MOV MOV AX, 1525h DS, AX

Bunlarn dnda operandlarn boyutlar eit olmak zorundadr. MOV AX, toplam ; burada toplam deikeninin boyutu kesinlikle word tipinde yani iki byte uzunluunda olmaldr. ayet acil adresleme kullanarak bir veri tayorsanz ilemci operandn boyutunu kaydediciye uyarlar. MOV AX, 15h ; Bu komut ilenince AXin iinde 0015h deerini grrsnz.

Dikkat edilemesi gereken dier bir husus ise hafza operandlardr. rnein MOV [BX], 5 gibi bir komut ile hafzaya neyin yklenecei belli deildir (Burada BX kaydedicisine deil hafzaya tama yapldna dikkat edin) MOV [BX], 5 gibi bir komutla acaba hafzaya byte boyutunda bir 5 deerimi (05) yoksa word boyutunda bir 5 deerimi (0005) yklenecek? Bunu kodlarnzda belirtmeniz gerekir. Derleyici bu komut satrna hata verir. Doru kullanm aadaki gibi olmaldr. mov mov mov byte ptr [bx], 5 word ptr [bx], 5 dword ptr [bx], 5

(*)

(*) 80386 ve sonras ilemcilerde kullanlabilir

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

mov byte ptr [bx], 5 satrn aklayalm. Burada BX=0000 olduunu varsayalm, byle bir durumda ds:0000 adresine bir tama ilemi gerekleeceltir. Ama bu adresten itibaren 05mi yoksa 0005mi yoksa 00000005mi tanacaktr? te bunu ptr operatr belirler. mov byte ptr [bx], 5 komut satr iin ds:0000 adresine 1 bytelk bir veri yani 05 tanr. ayet operatr byte ptr deilde word ptr olsayd o zaman ds:0000 ve ds:0001 adreslerine drasyla 05 ve 00 deerleri tanacakt. XCHG komutu xchg (exchange) komutu operandlarndaki deerleri yer deitirir. 80x86 ailesi iin drt deiik kullanm ekli vardr; xchg xchg xchg xchg reg, mem reg, reg ax, reg16 eax, reg32

(*)

(*) 80386 ve sonras ilemcilerde kullanlabilir LDS, LES, LFS, LGS, ve LSS komutlar Bu komutlar 32 bitlik bir hafza blgesindeki deeri bir segment kaydedicisine ve bir genel amal kaydediciye bir defada ykler. Kullanm format aadaki gibidir; LxS hedef, kaynak

Bu komutlar aadaki gibi kullanabilirsiniz; lds les lfs lgs lss reg16, mem32 reg16, mem32 reg16, mem32 reg16, mem32 reg16, mem32

(*) (*) (*)

(*) 80386 ve sonras ilemcilerde kullanlabilir Reg16 genel amal herhangi bir kaydedici olabilir mem32 ise double word boyutunda bir veri olmaldr, bunu dd direktifi ile oluturabilirsiniz. Daha nce bu komutlardan biri olan LES komutu iin X86 Assembly Dilinde Deiken Bildirimi -1 adl makalede ok gzel bir rnek vermitim. Erimek istediimiz adresin segment ve ofset blmlerini birletirerek bir deiken oluturuyor sonrada bunu program alrken istediimiz gibi kullanyorduk. LEA Komutu LEA (Load Effective Address Etkin Adresi Ykle) sadece offset adreslerini hedef operandna ykleyen bir pointer gibi dnebilirsiniz. Genel kullanm format lea eklindedir. lea dest, source

reg16, mem

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

lea

reg32, mem

(*)

(*) 80386 ve sonras ilemcilerde kullanlabilir. MOV komutunu da LEA komutu yerine kullanabilirsiniz, fakat hangi komutu kullanacanza adresleme moduna gre semelisiniz. Bazen MOV komutu LEA dan daha hzl alabilir, tm bu bilgilere herhangi bir intel komut setinden faydalanarak bakabilirsiniz. Daha nceki makalelerimizde ekrana bir karakter dizisini yazdrmtk, bunun iin kaynak kodumuzda ekrana yazdlralacak olan veriyi aadaki gibi tanmlamtk; Dizi DB "Merhaba Assembly",0Ah,0Dh,24h

Daha sonra bu dizinin adresini DX kaydedicisine yklememiz gerektiinde aadaki komutu kullanmtk; MOV DX,OFFSET Dizi Bu komutun yapt ii LEA kullanarakta yapabiliriz; LEA DX, Dizi

PUSH ve POP komutlar 80x86 push ve pop komutlar Stack Memory (Yn hafza blgesi) ile ilgili ilemlerde kullanlr. Yn hafza blgesini sizler .exe tipi program hazrlarken .Stack direktifi ile belirliyorsunuz. te bu blge genellikle programdaki dallanma veya altrutinlerin almas srasnda, dn adreslerinin ve bayrak kaydedicisinin durumlarn saklamak iin kullanlr. Push komutu bu yn olarak adlandrlan hafza blgesine verileri iterken, pop komutuda bu blgeden veri almada kullanlr. push reg16 pop reg16 push reg32 (**) pop reg32 (**) push segreg pop segreg (CS hari) push memory pop memory push immediate_data (*) pusha (*) popa (*) pushad (**) popad (**) pushf popf pushfd (**) popfd (**) enter imm, imm (*) leave (*) (*) 80286 ve sonras ilemcilerde kullanlabilir (**) 80386 ve sonras ilemcilerde kullanlabilir

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Push ve pop komutlar kullanldnda yn hafza blgesinin iaretisi olan SP kaydedicisi deiir. Tabi ki bu yna itilen veya yndan ekilen deerin boyutuna baldr. Bu komutlar 2 veya 4 bytelk deerler ile ilem yaptndan yna 2 bytelk bir deer itildiinde (mesela bu AX kaydedicisinin ierii olabilir) SPnin deeri 2 byte azalr. ayet yna 4 bytelk deer itilirse SPnin deeri 4 azalr. Unutulmamas gereken nemli bir hususta yn hafza blgesine itilen en son deerin ekilecek olan ilk deer olmasdr. Tabi ki yna birden fazla word ya da doubleword itildiyse aralardaki deerler ile ilem yapmak adresleme modlaryla mmkndr fakat bu SPde herhangibir deiiklik yapmaz. Yn hafza blgesi ile ilgili unutulmamas gereken nemli kural vardr. Segment kaydedicilerinden olan SS yn hafza blgesinin segment adresini gsterir. Yna bir eyler itildike SP azalr ekildike artar. SS:SP her zaman ynn tepesi olarak tabir edilen noktay gsterir. LAHF ve SAHF Komutlar Bu komutlar bayraklar AH kaydedicisine ykler veya AHa yklenen bayrak kaydedicilerinin durumlarn kayar nokta kaydedicisine ( floating point register ) ykler. Bu komutlar 8086 zamanndan kalma ve gnmzdeki modern assembly programlarnda pek kullanlmayan komutlardr. Geniletme lemleri Bazen byte boyutundaki bir deeri word boyutuna veya word boyutundaki bir deeri doubleword boyutuna geniletmek gerekebilir. Bu gibi durunlarda aadaki komutlar kullanlr. movzx olmaldr. movsx olmaldr. cbw cwd cwde cdq bswap xlat hedef, kaynak ;Hedef kaynan iki kat byklnde hedef, kaynak ;Hedef kaynan iki kat byklnde

reg32

MOVZX, MOVSX, CBW, CWD, CWDE, ve CDQ Komutlar cbw (convert byte to word) AL kaydedicisinin 1 bytelk ieriini AXe geniletir. ayet ALdeki deer pozitifse AHn tm bitleri 0 deerini alr. ALdeki deer negatifse AHn tm bitleri 1 olur. cbw cwd (convert word to double word) komutu AXin deerini DX:AXe geniletir. CBW komutundaki kurallar bu komut iinde geerlidir. cwd Bu komut 80386 ve sonras ilemcilere zeldir. CWD komutunda olduu gibi word boyutundaki bir deeri double word boyutuna geniletmede kullanlr. CWD AXi DX:AXe geniletirken bu komut AXi EAXe geniletir.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

cwde cdq komutu EAX kaydedicisindeki 32 bitlik deeri EDX:EAX e geniletir. Bu komutda 80386 ve sonras ilemlerde kullanlr. cdq rnekler: ; AL deki 8 bitlik deeri 32 bitlik dx:axe geniletmek iin cbw cwd ; AL deki 8 bitlik deeri 32 bitlik eaxe geniletmek iin cbw cwde ; AL deki 8 bitlik deeri 64 bitlik edx:eaxe geniletmek iin cbw cwde cdq movsx komutuda yukardaki komutlara benzer i yapar, kullanm formatlar aadaki gibidir. movsx movsx movsx movsx movsx movsx rnekler: movsx movsx movsx yapar. movzx komutu movsx komutu gibi kullanlr fakat negatif deerleri geniletmek iin kullanlmaz, nk movzx komutu geniletme ileminde sadece bitleri 0 yapabilir. Bu komutun sonundaki zx harfleri ngilizcede zero extend yani sfr ile genilet gibi bir anlam tar. Tm bu geniletme komutlar genellikle aritmetik ilemlerde ve zellikle blme komutlarnda kullanlr. BSWAP Komutu Bildiiniz gibi x86 hafzas little endian yapya sahiptir, bununla beraber big endian hafzaya sahip bilgisayarlarda ok sayda mevcuttur. rnein Applen Machintosh bilgisayarlar big andian hafza yapsna sahiptir. BSWAP komutu bu farkl hafza sistemlerine sahip olan bilgisayarlar arasnda veri haberlemesi ax, al eax, ax eax, al ;CBW komutunun yapt ii yapar. ;CWDE komutunun yapt ii yapar. ;CBW ve CWDE komutlarnn birlikte yapt ii reg16, reg16, reg32, reg32, reg32, reg32, mem8 reg8 mem8 reg8 mem16 reg16

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

yaplmas iin kullanlr. BSWAP operandnda belirtilen 32 bitlik kaydedicinin iindeki deeri byte-byte ters evirir. Dk deerlikli sekiz biri en yksek deerlikli blgeye, 8-15 arasndak bitleri 16-23 arasna, 16-23 arasndaki bitleri 8-15 arasna ve son olarak 24-31 arasndaki bitleride 0-7 arasna yerletirir. BU komut sadece 80486 ve sonras ilemcilerde kullanlabilir. Kullanm format aadaki gibidir. bswap reg32 XLAT Komutu Genellikle tablo olarak tasarlanan dizilere erimek iin kullanlr. AL kaydedicisine tablonun elemanlarndan birini ykler. Bu komutu aadaki rnee bakarak daha iyi anlayabilirsiniz. Tablo DB 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

Bu tablonun 11. elemann ALye yklemek istersek; MOV AL, 0Ah ; ndeks deeri (0 dan 0Aha kadar 11 tane deer var) LEA BX, Tablo ; BXe (taban kaydedicisi) Tablonun ofset adresi ykleniyor XLAT ; Tablonun 11. elemanna eriilip ASCII karakterin hex karl ALye ykleniyor (AL=41h) imdi yukarda akladmz komutlardan birkan kullanarak bir program yazalm ve daha sonra da inceleyelim. ncelikle Push ve Pop komutlarn DS kaydedicisinin deerini belirlemek iin kullanabilirim. .exe tipi programlarda DS kaydedicisinin deerini belirlemek iin bu gne kadar hep aadaki iki satr kullandk, MOV AX, @data MOV DS, AX Yn komutlarnda veri tamak iin kullanabileceimizden, MOV PUSH POP AX, @DATA AX DS

Yukardaki satrda DATA segmentin adresini nce AX kaydedicisine ykledik, sonra bu kaydedicideki deeri yna ittik son olarakta yndan bu deeri ekip DS kaydedicisine ykledik. Kullandm sistemin saat bilgisini ekrana yazdrmak istiyorum. Tabi ki bu gibi ilemler iin hali hazrda DOSun kesmeleri mevcuttur. Fonksiyon 2Ch sistem zaman ile ilgili bilgileri ilemcinin kaydedicilerine getirir. MOV AH,2Ch INT 21h Bu komutlar ilenince CX ve DX kaydedicileri saat bilgisi ile yklenirler, CH = saat CL = dakika DH = saniye DL = salise

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Kaydedicilerin iindeki deerlerin binary olduunu ve debugger programlarnda bu deerlerin hexadecimal formatta grndn unutmayalm. Biz bu programda kullanc ekranna desimal formatta deerler yazdracamzdan ya evirme ilemi yapacaz yada tablo oluturup hex bilgilerin karlna tablodan bakacaz. evirme ilemleri iin arpma, blme gibi komutlar bilmeniz gerekir ama henz o komutlarla ilgili rnekler zmedik. Bunun yerine biz hex-decimal tablolar oluturup bu tablolardan desimal deerleri bulalm ve ekrana yazdralm. Fakat tablolarn snrlarn belirlemek iin elimizdeki bilgiyi iyi tanmamz gerekir. En byk saat bilgisi 23:59 yani 0 ile 59 elemanlarn kapsayan bir tablo oluturmam yeterli. SaatTablo DB"00$","01$","02$","03$","04$","05$","06$","07$","08$","09$" DB "10$","11$","12$","13$","14$","15$","16$","17$","18$","19$" DB "20$","21$","22$","23$","24$","25$","26$","27$","28$","29$" DB "30$","31$","32$","33$","34$","35$","36$","37$","38$","39$" DB "40$","41$","42$","43$","44$","45$","46$","47$","48$","49$" DB "50$","51$","52$","53$","54$","55$","56$","57$","58$","59$" Yukardaki tablo bize 60 elamanl gibi grnebilir fakat hafzada 60*3=180 byte yer kaplar, nk x86 hafzas byte adreslenebilir ve her rakam veya karakter hafzada 1 bytelk yer kaplar. Diyelim ki CHtaki saat bilgisi 0Ah, bu saat 10 demek. Tabloda 10$ olan ksm acaba tablonun hangi adresidir? Sayacak olursanz 30. elemann 1 31. elemann 0 yani 30 elemandan itibaren 10 deerinin mevcut olduunu grrsnz. Tabloda her saat deeri iin 3 bytelk deer ayrlmtr ve bu programda CH veya CL deki deerler yardmyla indeks adresi hesaplanrken 3 ile arpmak gerekir. CHta saat 10u temsilen 0Ah deeri bulunuyorsa 0Ah*3 = 1Eh = 30 hesab yaplmaldr. Tm bu ilemleri yapp ekrana yazdrlcak deeride DX kaydedicisine yklemeliyiz. nk ekranda bir karakter dizisini yazdrmak iin INT 21hn 9. fonksiyonu karakter dizisinin balad adresi DX kaydedicisinde bulunmasn ister. Tm bu ilemleri yapan kod satrlar aadaki gibidir. MOVAL, CH ;imdi saat bilgisi, MULUc ;3 ile arplarak tablodaki desimal karl bulundu. MOVDI, AX ;Bu adres indeks olarak dnldnden DI ya yklendi. LEA DX, SaatTablo[DI] ;Ve BXe saat bilgisinin desimal karl olan tablo konumu yklendi. MUL komutunu nmzdeki makalelerde inceleyeceiz, ok fazla kullanm format mevcuttur. Bizim iin burada, sadece CH veya CL deki deerleri 3 ile arpsn yeter. Fakat MUL komutu sadece AL deki deeri bir deiken yada AL kaydedicisi ile arpabildiinden nce CH yada CL deki bilgileri ALye tamamz

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

gerekiyor. Daha sonra 3 deeri ile arpp tablodan adresi buluyoruz. Tabi ki Uc bir deiken ve data segmentinde tanml olmaldr. Uc DB 3

Al deki deer 3 ile arpldnda sonu 16 bitlik AX kaydedicisinde saklanr. Bu noktadan sonra bu adresi DX kaydedisine ykleyip ekranda string yazdrma kesmesini arrsak ilem tamam olacakt ama, SaatTablo taban adresine gre hesapladmz indeks adresi halen AX kaydedicisinin iinde ve LEA DX, SaatTablo[AX] gibi bir komut satr kullanamam nk byle bir adresleme modu mevcut deil. Indeks olarak kullanlacak adresler 8086 assembly dilinde SI, DI veya BX kaydedicilerinin birinde olmaldr, bu yzden bizde hesapladmz indeks deerini DI ya ykledik. Son olarak ekranda bir string yazdracamzdan DX kaydedicisinin iine yazdracamz stringin balang adresini atarak ve daha nce de kullandmz INT 21h fonksiyon 9h kullanabiliriz. Bununla beraber : karakterinide saat bilgisini yazdrrken saat ile dakika arasna yerletirelim, tabi ki bu bilgide data segmentinde bir adreste sakl kalsn. Ayirac DB: Birde saat kelimesini data segmentte tanmlayalm, Saat DB Saat $

imdi kabataslak ne yapacam belli oldu, programmn algoritmasn da yazdktan sonra kodlarm yazmaya balayabilirim. 12345678Ekrana Saat yazdr Sistem saatini ilgili kaydedicilere ykle Tablodan saat bilgisinin desimal karln bul Ekrana yazdr : karakterini ekrana yazdr Sistem dakikasnn karln bul Ekrana yazdr Dur

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 1 - Saat bilgisini ekranda gsteren program.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 2 - Programn ekran kts.

Elbette bu program daha ksa veya pratik bir ekilde yaplabilirdi. Bunun iin komut bilgimizi geniletmeliyiz. Ayrca deiken bildirimlerini de u ana kadar tam olarak anlatmadm. Bu konularla ilgili makalelerimiz yolda fakat u anda sizlerin mevcut bilgilerinizle bu programa birde salise ksmn ekleyebilmeniz gerekir. 80x86 KOMUT SET (Blm 2) Aritmetik ve mantk (lojik) ilemler mikroilemcinin ALU (Arithmetic Lojic Unit) denen ksmnda yaplr. ALU bir dizi elektronik toplama, karma ve mantk devrelerinden olumutur. Bu devrelerin alma mantklar ise sayma temelinden geer. Bizlerde ilkokul sralarnda temel ilemleri parmaklarmzla sayarak yapardk. 3 ile 5i toplarken 3n zerine 5 tane parmak sayardk. Mikroilemcide her sayklda (saat darbesinde) ALUda bir sayma ilemi yapar. Bu saat darbesi ne kadar hzl olursa ilemler o kadar hzl gerekleir. rnein 1 GHz. hznda bir ilemci saniyede 1 milyar elektronik darbe retebilir ve bu saniyede milyonlarca ilem yapabilecei anlamna gelir. Aritmetik komutlarn genel kullanm formatlar aadaki gibidir. Bu komutlar kullanrken de adresleme modlarna dikkat etmemiz gerektiini unutmayalm.

ADD ve ADC komutlar: Toplama ve elde ile toplama komutlardr. ADD komutu ilemci durum kaydedicisinin C bitini hesaba katmazken ADC toplama ilemini C bitinide dahil ederek yapar. MOV AX, 5 ADD AX, 6 Bu ilemden sonra AX kaydedicisinde 11in karl olan 000Bh deeri grlr. MOV AX, 5 ADC AX, 6 Bu ilemden sonra ayet C=0 ise sonu 000Bh C=1 ise sonu 000Ch olacaktr. x := y + z + t ilemini; MOV AX, Y ADD AX, Z ADD AX, T MOV X, AX eklinde yapabilirsiniz. Tabiki bu x,y,z,tler birer hafza konumu veya kaydedici olabilir.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

x := x + z ilemini dnelim. x ve z hafzadaki birer deer olsun yani deikenlerimiz. Bunu en hzl ekilde ilemciye nasl hesaplatabiliriz? 1.yol MOV AX, X MOV BX, Z ADD AX, BX MOV X, AX Yukardaki ekilde bu ilemi yapabilrsiniz ama bu okta iyi bir yol deildir. 2.yol MOV AX, X ADD AX, Z MOV X, AX Bu yol daha iyi gibi grnsede bundan daha iyi alacak kodlar aadaki gibidir. 3. yol MOV AX, Z ADD X, AX Adresleme modlarn akll bir ekilde kullanabilirseniz ok hzl alan programlar hazrlayabilirsiniz. Yukardaki program paras ayn ii yapmasna ramen en hzl alan 3. sdr. Gnmzde kullancya daha yakn ve program yazmas daha kolay olan st seviye programlama dillerine gre assembly dilinin en byk avantaj budur. ADD ve ADC komutlar ilemcinin bayrak kaydedicindeki bitlere yle etki ederler. 1. aretli saylarla ilem yaparken iaret tamalarn gstermesi amacyla V (overflow) bitine. nk bazen negatif bir say ile negatif baka bir say toplanr ve pozitif bir sonu elde edilebilir. 2. aretsiz saylarda ilem yaparken boyut tamalarn gstermesi amacyla C bitini. rnein 2 bytelk bir deiken olan FFFFh (65535) ile 1 i toplarsnz sonuta 0 elde edersiniz. Sonucun alana smad bu gibi durumlarda programcy haberdar etmesi amacyla C=1 olur. 3. ayet sonu negatif bir deerse S=1 deilse S=0 olur. 4. 0 sonucu bir ok yerde nemli olabilir. Bu yzden toplama komutlar ile ilem yapldnda sonu 0 olursa Z=1 aksi halde Z=0 olur. 5. Binary deerler ile desimal saylar kodlamak gerekebilir (BCD). Bu durumda dk deerlikli 4 bitte tama olursa bayrak kaydedicisinin A biti 1 olur. rnein 0000 1111b deerine 1 eklendiinde sonu 0001 0000b olacaktr ve dk deerlikli 4 bitteki en byk say olan 1111 birden 0 a decektir. Bu yzden A=1 olur ve ilemci programcy bu

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

durumdan haberdar eder. 6. Elde edilen sonutaki binary 1 ler ift sayda olursa, rnein 0000 0101 deerinde 2 tane 1 vardr bu durumda P=1 olur.

INC Komutu: ADD X, 1 gibi alr. X kaydedici veya hafza alan olabilir. Ksaca hedefi 1 arttrr. Dnglerde ok kullanlan bir komuttur. Bu yzden ok nemlidir. INC komutunun 1,2 veya 4 bytelk operand olabilir. Yani bu komutu aadaki formatlarda kullanabilirsiniz. INC AL ; 1 bytelk kaydedici INC AX ; 2 bytelk kaydedici INC EAX ; 4 bytelk kaydedici INC HAFIZAADRESI ; Byte word veya doubleword boyutundaki deikenler olabilir. INC komutu genelde ADD mem,1 veya ADD reg,1 formatna tercih edilir nk daha hzldr, buna ramen pepee 1 den fazla inc komutu kullanmak gerekirse komut setinin incelenmesinde fayda vardr. nk bu ii ADD reg,2 veya ADD mem,2 eklindede yapabilirsiniz ve bu durumda sadece 1 adet komut satr yazarsnz. Ayrca INC bayrak kaydedicisinin C bitine etki etmez. Bu yzden dizi ilemleri iin ok uygun bir komuttur. Oysa ADD ve ADC C bitine etki ederler ve byk dizilerde bu komutlar kullanlrsa dizinin iindeki elemanlar iaret etme ileminde bazen yanl sonu gsterebilirler.

XADD Komutu: 80486 ve sonras ilemciler iin geerli bir toplama komutudur. Bu komutu aadaki rnek ile daha iyi anlayacanz kanaatindeyim. ; AX = 07h ve BX = 03h olsun XADD AX, BX ; Bu komuttan sonra

; AX = 0Ah yeni toplama ileminin sonucunu gsterir, ; ve BX = 07h olur, yani AXteki kaybolan operand buraya tanr. kartma ilemini yapan komutlar: SUB ve SBB komutlar: SUB (Subtract) yani kartma SBB ise bor ile kart (SuBtract with Borrow) anlamna gelir. Her iki kartma ilemi bir kartma sonucu retmenin yannda bayrak kaydedicisinin C bitinide etkilerler. Bu komutlarn genel kullanm formatlar aadaki gibidir; sub sub sub sub reg, reg reg, mem mem, reg reg, immediate data

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

sub mem, immediate data sub eax/ax/al, immediate data Bu komutlarn ne yaptn rnekler ile daha iyi anlayabiliriz; MOV AX, 0Ah MOV BX, 04h SUB AX, BX Yukardaki komutlar ile ilemci 0Ah-04h ilemini yapar ve 6 sonucunu AX kaydedicisinin yani hedef kaydedicide saklar. Bu ilemde byk deerden kk deer kartldndan C bitinin durumunda bir deiiklik olmaz. MOV AX, 04h MOV BX, 0Ah SUB AX, BX Yukardaki komutlar ilenince 04h-0Ah ilemi yaplr ve 2 bytelk AX kaydedicisinin iinde FFFAh sonucu grlr. Bu ilemde ayrca C biti set edilir ve C=1 olur. Programc Cnin bu durumunu gz nnde bulundurmaldr. nk sonucu iaretsiz bir tamsay gibi deerlendirirse yanlr. Byle bir sonu elde edildiinde sonucun tmleyeni aln ve 1 eklenir. 1111 1111 1111 1010 ; FFFAhn binary karl 0000 0000 0000 0101 ; tmleyeni 0000 0000 0000 0110 ; 1 fazlas yani 6 Ayrca bu sonu incelenirken, kaydedicideki FFFAh deerinin 15. biti 1 olduundan sonu negatif olarak deerlendirilmeli ve yukardaki ilem yaplarak sonucun gerek deeri hesaplannca; -6 deerine ulaabilirsiniz. Aslnda FFFAh sonucunun salamasn yaparsanz, yani kana bu sonucu eklerseniz; FFFAh 000Ah ------0004h yukardaki 4h sonucuna eriirsiniz. SUB komutunun kullanmn SUB hedef, kaynak eklinde genellersek; hedef = hedef - kaynak; SBB komutu ise; hedef = hedef - kaynak - C ilemlerini yapar. kartma komutlar toplama komutlarnda da olduu gibi bayrak kaydedicisinin, Z, S, V, A, P ve C bitini etkilerler. Tabiki bu etkilenen bayraklar yaplan ileme gre programc tarafndan deerlendirilmelidir. kartma Aslnda Toplamadr!

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

3 - 4 aslnda 3 + (-4) deil midir? Bu tr basit bilgileri unutmamak bazen sizin iinizi kolaylatrabilir. Aadaki rnei inceleyelim. x = x - y -z ilemini yapmak iin; MOV AX, X SUB AX, Y ; x-y ilemi yaplyor, sonucu AXe ykleniyor. SUB AX, Z ; x - y - z ilmi yaplm oluyor MOV X, AX ; sonu xe yklenerek x = x - y - z ilemi yaplm oluyor. Fakat bu ilem aslnda x = x - (y + z) deilmidir? MOV AX, Y ADD AX, Z ; y - z ilemi yaplyor SUB X, AX ; x - y - z ilemi yaplp sonu xe ykleniyor. DEC komutu: Decrement yani azalt anlamna gelir. hedef operandn 1 eksiltir, baka bir deyile -1 ekler. Kullanm formatlar aadaki gibidir. DEC reg DEC mem DEC reg16 C biti hari kartma komutlarn etkiledii bayraklar etkileyen bir komuttur. INC komutu gibi genelde dnglerde her iterasyondan sonra sayac azaltmak iin kullanlr. CMP komutu: SUB komutu ile ayn ii yapar fakat karma ileminin sonucunu herhangi bir kaydediciye yklemez. Bu komut genelde artl dallanma komutlarndan nce bayraklar etkilemek iin kullanlr. CMPnin anlam "compare" yani karlatr demektir. Bakn neleri karlatrabiliyoruz; genel kullanm formatlar, cmp cmp cmp cmp cmp cmp reg, reg reg, mem mem, reg reg, immediate data mem, immediate data eax/ax/al, immediate data

Bu komut A, C, O, P, S ve Z bayraklarn etkiler. Programc etkilenen bu bayraklar greceli olarak yorumlayabilir, yle ki; A ara elde biti yani ilem yaplrken 3. bite gelindiinde eldenin olup olmad hakknda bilgi verir ve P ilem sonucundaki deeri binary olarak dndmzde 1ler tekmi yoksa ift mi durumunu gsterir. A ve P bayraklarndan ziyade programclar Z, C, O ve S bitlerinin durumlar ile ilgilenirler. Bu bayraklar deerlendirirken de ilemlerin iaretli yada iaretsiz saylar ile yapldnn bilinmesi byk nem tar.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

1- Z bayra saylar ister iaretli ister iaretsiz olsun eitlik yada eit olmama durumunu gsterir. mov ax,5 mov bx,5 CMP ax,bx ; Z=1 yani operandlar eit. 2- C bayra iaretsiz saylarda; C=1 ise 2. operand 1.operand dan byk demektir. C=0 ise 1. operand byktr. C bayrann iaretli saylarda bize verdii sonularn bir anlam yoktur. 3- S ve O bayraklar iaretsiz saylarda anlamsz olurken iaretli saylarda 2 deiik durumu gsterirler. Bunlar; a- S=0, O=1 veya S=1, O=0 ise 2. operand 1. operandtan byktr. b- S=0, O=0 veya S=1, O=1 ise 1. operand 2. operandtan byktr. artl Dallanma Komutlar: ngilizce karl Conditional Jump Instructionsdr. Bu tr komutlar ilendikten sonra program ya normal akna yani komutlar satr-satr ilemeye devam eder ya da normal akndan sapp baka bir adresteki komutu iler. Karar alma mekanizmalar bu komutlar ile yapldndan ok nemli komutlar olduunu sanrm tahmin edebilirsiniz. artl dallanma komutlarnn ilk harfi J ile balar ve takip eden 1,2 yada 3 harf art gsterir. Bu tr komutlar bundan sonra JXXX komutlar olarak kullanacam. JXXX komutlarnn da CMP komutlar gibi iaretli ve iaretsiz deerler iin farkl anlamlar vardr. Tm bu anlamlar ve komutlar aadaki 3 tabloda zetleyebiliriz.

Bayraklarn Durumunu Test Etmek in Jxxx KomutlarKomut Aklama art E Komut Kart Komut

JC JNC JZ JNZ JS JNS JO JNO JP JPE JNP JPO

Jump if carry (carry (tama) bayra 1 ise) Jump if no carry (carry (tama) bayra 0 ise) Jump if zero (zero (sfr) bayra 1 ise) Jump if not zero (zero (sfr) bayra 0 ise) Jump if sign (sign (iaret) bayra 1 ise) Jump if no sign (sign (iaret) bayra 1 ise) Jump if overflow (overflow (tama) bayra 1 ise) Jump if no Overflow (overflow (tama) bayra 0 ise) Jump if parity (parity (elik) bayra 1 ise) Jump if parity even (sonutaki 1ler ift ise) Jump if no parity (parity (elik) bayra 0 ise) Jump if parity odd (sonutaki 1ler tek ise)

Carry = 1 Carry = 0 Zero = 1 Zero = 0 Sign = 1 Sign = 0 Ovrflw=1 Ovrflw=0 Parity = 1 Parity = 1 Parity = 0 Parity = 0

JB, JNAE JNB, JAE JE JNE JPE JP JPO JNP

JNC JC JNZ JZ JNS JS JNO JO JNP JPO JP JPE

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

aretsiz Saylarda Jxxx KomutlarKomut Aklama art E Komut Kart Komut

JA

Jump if above (>) (Yukarsndaysa) Jump if not below or equal (not =) (Yukarsnda veya eitse) JNB Jump if not below (not ) (Bykse)

Jump if not less than or equal (not =) JGE (Bykse veya eitse) JNL Jump if not less than (not b) kullanlmt. Assembly karlnda ann deeri olan 5 nce eax kaydedicisine ykleniyor ve sonra hafzadaki b deikeni deeri ile yani 4 ile karlatrlyor.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

JLE satrna dikkat edin, JLEnin anlam less or equal yani dk yada eitse. Yani ann deeri olan 5 bnin deeri olan 4ten dk yada eitse, program 00411A3E adresinden devam edip, nce eaxe k karakterini ykleyip (daha dorusu knn ASCII kod karln ykleyecek), bunu hafzadaki "sonuc" adl yere (sonuc da aslnda bir adres :)) kaydedecektir. Tabi 5 4ten byktr. Hal byle olunca bu programda JLE komutu ilendikten sonra bir dallanma sz konusu deildir. Yani program normal akn devam ettirecek ve eaxe "b" karakterini ardndan da sonuc adl adrese kopyalayacaktr. Bu programn assembly kodlarn daha nce grmediimiz bir biimde birazck farkl grmeniz doaldr. Bunun nedeni Visual Studio.NETin C derleyicisinin 32 bitlik olduundandr. Yani bu gne kadar biz 16 bitlik TASM veya MASM kullandk. Bu yzden eax kaydedicisini gremedik veya adresleri buradaki gibi 32 bitlik deil de hep 16 bitlik offsetler halinde grdk. Bu yzden assembly kodlar biraz farkl. 32 bitlik kodlama bizim iin henz ok erken bir kavram, bu yzden bundan sonraki makalelerimizde 16 bitlik kodlamaya devam edeceiz.

80x86 KOMUT SET (Blm 3) NEG komutu NEG negatif kelimesinin ksaltmasdr. Tek operand vardr. Kullanm format aadaki gibidir. neg neg reg mem

yani operand herhangi bir kaydedici veya hafza adresi olabilir. Yapt i operandn deerinin negatifini almaktr. Daha doru bir deyile operandn 0dan kartr. Binary dzende dnecek olursanz 1lein yerine sfr 0larn yerine 1 getirir ve bu sonuca 1 ekler. mov neg al,0fh ax

yukardaki ilemden sonra AXin ierii F1h olacaktr. 0Fh = 0000 1111 tersi = 1111 0000 1111 0000 +1 = 1111 0001 = F1h Bu komutun ne amala kullanlabileceini makalenin sonlarna doru anlayacaksnz. MUL ve IMUL Komutlar MUL arpma IMUL ise iareti dikkate alarak arpma ilemlerini yapar. Kullanm format aadaki gibidir. aretsiz arpma: mul mul reg mem

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

aretli arpma: imul imul imul imul imul imul imul reg mem reg, reg, imm (*) reg, mem, imm (*) reg, imm (*) reg, reg (**) reg, mem (**)

*- Sadece 286 ve sonras ilemcilerde. **- Sadece 386 ve sonras ilemcilerde.

IMUL komutunun 286 ve 386 dan sonraki kullanm formatlarna bakacak olursanz, bu gne kadar grdmz formatlardan biraz farkl olduunu grrsnz. Bu kullanm ekilleri programclarn kafasn biraz kartrmakla beraber tek bir komut satr ile abucak arpma ilemini yapmasn salar. Nede olsa Intel karmak komut setini benimsemitir. arpma komutlar bayt-bayt, word-word veya Doubleword-Doubleword arpma yapabilir. Tabi ki Doubleword arpm iin 386 ve sonras ilemci kullanmanz gerekiyor, nk 32 bitlik kaydediciler 386 ile birlikte gelmitir. Ayrca arpma ilemi toplamadan daha byk sonular karabilir. Yani 2 basamakl bir deeri baka bir 2 basamakl deer ile toplarsanz sonu en fazla 3 basamakl karken arpmada bu 4 basamaa kadar kabilir. Daha fazla basamakl saylarn arpmnda sonu arplan veya arpandan ok daha fazla basamakl kabilir. Bu gerei gz nne alarak ilemci tasarmclar sonucu her zaman arpan ve arplann boyutundan daha byk bir kaydedicide saklama yoluna gitmilerdir. Bunlar aadaki ekil ve aklamalarla daha iyi anlayacaksnz. Byte arpma

27h ile 17h arpmak iin; mov mov mul al, 27h dl, 17h dl

komutlarn kullanabilirsiniz. Burada "mul dl" komutu ile DL*AL ilemi yani bu kaydedicilerdeki deerler olan 17h ve 27h saylar arplr. Peki sonu nerede? Yukardaki ekle baktnzda sonucun AX iinde olacan grebilirsiniz. Bu arpma ileminden sonra AXte 0381h deeri grlr.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Pratik olarak 8 bitlik bir deerin karesini almak iin; mov mul al,sayi al

komutlarn kullanabilirsiniz. Word arpma

Bu tr bir arpma ileminde operand AX ile arplr ve sonu DX-AX kaydedicilerinden okunur. DXte daha nce ne olduu nemli deildir nk arpmadan sonra buraya sonucun yksek deerlikli byte yerleir. Sonucun dk deerlikli byte ise AX kaydedicisinde saklanr. Burada dikkat ederseniz arpma ilemiyle birlikte AX kaydedicisindeki "arplan" da kaybedilecektir. Benim tavsiyem bu tr arpmalarda arpan ve arplan birer deiken olarak programnzn data segmentinde tanmlamanzdr. Aadaki rnekleri inceleyin, 100h ile 2345h deerlerini arpalm; mov mov mul ax, 2345h bx, 100h bx

bu ilemden sonra DX=0023h ve AX=4500h olur. Yani asl sonu olan 234500h deerinin yksek deerlikli wordu DXte dk deerlikli ksmda AXte grlr. Fakat arplan deer yani 2345h bu ilemden sonra kaybolacaktr. ayet bu arplan deer sizin iin nemliyse; carpilan db 2345h .. .. .. mov ax, carpilan mov bx,100h mul bx bylece 2345h deeri daima "carplan" ismi ile hafzada korunur. Ayn eyi tabi ki arpan iin yani 100h deeri iinde yapabilirsiniz. carpilan carpan .. .. db db 2345h 100h

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

.. mov mov mul

ax, carpilan bx, carpan bx

Double Word arpma Double word boyutundaki verilerin arpmnda da word dekine benzer bir yap kullanlr. arplan deer EAX kaydedicisine yerletirilip, MUL veya IMUL komutunun peinden gelen operand ile bu deer arplr. Daha sonra elde edilen sonucun yksek deerlikli doublewordu EDXte dk deerlikli doubleword ise EAXte saklanr. Yani sonu 64 bitliktir.

carpilan dd 12345678h carpan dd 34522344h .. .. .386 .. .. mov ax, carpilan mov bx, carpan mul bx Yukardaki rnekte sonu olarak ilemci 03B878D610295FE0h deerini hesaplar. Bu arpma ileminden sonra EDX=03B878D6h ve EAX=10295FE0h olur. Buradaki .386 32 bitlik kaydedicileri kullanmak iin assemblera verilen bir direktif (talimat) dr. EDX ve EAX gibi 32 kaydedicilerin 32 bitlik alanlarn kullanmak iin nu talimat vermeniz gerekir. 32 bitlik programlama, 16 bitlik programlama nedir bunlar? imdilik sadece 32 bitlik programlarn 16 bitliklere gre daha avantajl olduunu grebilirsiniz. nk 32 bitlik programlama ile kaydedici boyutlarm 2 katna kyor ve bir kaydedicide hesaplayabileceimiz deerlerde ayn oranda artyor, bu ilemi 16 bitlik bir programlama ile de halledebilmemize ramen 2 kat daha fazla komut yazmamz gerekir. MUL komutu bayrak kaydedicisinin C ve O bitlerini etkiler. Bu bayraklar beraber deerlendirildiinde aadaki sonular kartlr. 1- Byte boyutundaki bir operand AL ile arplrsa sonu AXte grlr. AH=0 ise C ve O sfr olur, aksi durumlarda bu bayraklar set (1) olur. 2- Word arpmada C ve O sfr ise DXte sfr demektir, aksi durumlarda bu bayraklar set olur.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

3- Double word arpmada ise C ve O sfr ise EDXte sfr demektir, aksi durumlarda bu bayraklar yine set olur. Yukardaki durum soldaki sfrlarn armada bir deeri olmadndan, sonucu optimize etmenize yardmc olacaktr. IMUL ile Dier arpma Formatlar IMUL (Integer Multiplication) komutu ile yukardaki MUL komutu iin verilmi kalplar kullanabilirsiniz, bununla beraber IMUL komutuna zel ok operandl kullanm formatlarda mevcuttur. Tm kullanm formatlar bu makalenin banda verildii gibidir fakat kaydedicilerin 8 16 ve 32 bitlik durumlar da gz nne almamz gerekir. imdi henz aklamadmz 286 ve 386 sonras ilemcilerde kullanlabilen komut formatlarn aadaki rneklerle inceleyelim. imul operand1, operand2, imm imul imul imul imul imul imul imul imul imul imul imul imul reg16, reg16, reg16, reg16, reg16, reg16, reg32, reg32, reg32, reg32, reg32, reg32, ;Genel kullanm format

reg16, imm8 reg16, imm16 mem16, imm8 mem16, imm16 imm8 imm6 reg32, imm8 (*) reg32, imm32 (*) mem32, imm8 (*) mem32, imm32 (*) imm8 (*) imm32 (*)

* Sadece 80386 ve sonras ilemcilerde kullanlabilir Yukardaki komut formatlarnn 3 operandl olanlar operand1 := operand2 x imm ve 2 operandl olanlarda operand1 := operand1 x imm eklinde alr. Her zaman son kullanlacak olan operandn "imm" yani saysal bir deer olduuna dikkatinizi ekerim. mov imul bx, 4 ; BX = 0004h ax, bx, 3 ; AX = 4 * 3 = 000Ch

Bu komutlar ile 8x8 bit arpm sz konusu deildir, imm8 olarak yukarda grdnz operand sadece komutunun makine kodunun olmasn salar. Ayrca bu arpma ilemlerinde sonucun boyutu operandta belirtilen kaydedicilerin boyutuyla ayndr, yani makalenin banda anlattmz mul komutu gibi sonu operandn 2 kat olmaz. Bu durumda sonucun hedef kaydediciye smamas durumuna kar C ve O bitleri birlikte kontrol edilmelidir, bu durumlara Intelin komut setinden bakabilirsiniz.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Bununla beraber bu formattaki arpma komutlar Z bitini her zaman doru bir ekilde etkilemeyebilir, ayet sonucun sfr olup olmad sizin iin nemli ise ancak sonucu sfr ile karlatrdktan sonra Z bitini kontrol etmelisiniz. Ayn ekilde sonucun iaretini renmek iin iaret bayra yerine C ve O bitlerinin sfr olup olmad kontrol edilmelidir. IMUL komutu iin Intelin 80286 ve sonras ilemcilere koyduu bu adresleme biimleri ok boyutlu diziler ile yaplan ilemleri hatr saylr biimde kolaylatrmtr. Bu konuya ok boyutlu dizileri ve karmak veri yaplarn anlatrken bir daha deinmeyi dnyorum. DIV ve IDIV Komutlar DIV division yani blme kelimesinin ksaltmasdr. Blme ilemi arpmann tersine blnene gre kk sonu retir, bu yzden bu komutlar kullanrken blnenin boyutu blenin boyutunun iki kat olmak zorundadr, an azndan Intel bu komutlar iin byle bir form ngrmtr. Bu yzden blnenin boyutu en az word trnde olmaldr, nk x86 Assembly dilinde en kk veri tipi bytedr. Bu durumda byte trnden bir deeri blmek isterseniz bunu CBW komutu ile word boyutuna dntrmeniz gerekir, hatrlarsanz bu tr komutlar daha nceki makalelerimizde aklamtk. Div ve idiv komutlarnn genel kullanm formatlar aadaki gibidir. div div idiv idiv reg mem reg mem ; aretsiz arpma

; aretli arpma

Wordu Bytea Blmek

rnek: 10h:3h ilemini yapmak istiyoruz, bu deerlerin ikisinin de byte trnden olduunu varsayalm; mov mov cbw div al, 10h bl, 03h ; bl yerine baka bir kaydedicide olabilir! ; 10h imdi 0010h ve AXte bl ; ax, blye blnd

bu ilemden sonra AX, 0105h olur. AHtaki 01h kalan ve ALdeki 05h ise blmdr. Nitekim 16nn (yani 10h) 3e blm ile de bu sonu retilir. Bu tr blme ileminde elde edebileceiniz en byk blm 255 (FFh iaretsiz deerler iin) yada 127 (7Fh iaretli deerler iin) deerleridir. Doublewordu Worde Blmek

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Bu tr blme ileminde elde edebileceiniz en byk blm 32767 (FFFFh iaretsiz deerler iin) yada 16383 (7FFFFh iaretli deerler iin) deerleridir. Quadwordu Doubleworde Blmek

Peki ya sonu tam deilse? Mesela 11h (yani 17yi) 3e blerseniz sonu normalde 5,666... eklinde olur, bu ilemi div komutu ile yaptnzda ise AXte 0205h deerini grrsnz, yani blm 5 ve kalan 2. zetle 17nin iinde 5 tane 3 ve 1 tanede 2 vardr ve div ve idiv komutlar tamsay blme ilemlerini gerekletirebilir. Ondalkl blme ilemleri iin floating point kaydedicileri kullanlr ve bu kaydediciler matematik ilemcisinin iindedir. 80486 DX ilemcisine kadar matematik ilemci normal ilemcinin yanna opsiyonel olarak konulurdu mesela ilemci 80386 ise matematik ilemcisi 80387 olurdu. Artk matematik ilemcisi normal ilemcinin iine gml olarak geliyor. Bu arada floating point nitelerini kullanmak iin yksek seviyeli assembly kodlar yazmak gerekir ve bu i bizim iin henz ok erken. Fakat kalan 10 ile arpp sonrada blnen ile karlatrp ayet blnenden bykse tekrar blene blme ilemine gidebilirsiniz, ayn kat zerinde normal blme ilemi yapar gibi, fakat floating point nitelerini kullanmak inann bu iten daha pratiktir ve daha kolay sonu verir. Malesef Tm Sonular Binary Toplama, kartma, arpma ve blme komutlarn grdk, artk bu komutlar kullanarak basit bir hesap makinesi program yazmak isteyebilirsiniz, byle bir program yazmaya baladnzda karnza sonular ekranda desimal formatta gstermek gibi bir problem kacaktr. Evet ekrana yazdrmak iin daha nce programlar yazdk fakat bunu sadece stringler ile gerekletirdik. DB direktifi ile deklare edilen kelime katarlar (stringler) hafzada byte-byt