You are on page 1of 121

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<100 ; i++) gibi bir ifadenin derleyici ile makine diline dnmesi zannettiinizden daha karktr. zetle buraya kadar derin konularn giri ksmlar anlatld. imdi sra assembly kodlarna bir hacker gibi deil de bir programmer gzyle bakmaya geldi. DEKENLER DEKLARE ETMEK rnein 2 sayy toplayan program yazmay dnelim. Bunu 2 deiik ekilde yapabiliriz. Birincisi acil adresleme modu ile; MOV ADD AL,5 AL,4

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

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 kadar kullanl olduunu artk siz tahmin edin. Oysa bu saylar birer deiken olarak tanmlasaydk daha esnek bir program hazrlam olurduk. .DATA sayi1 DB 5 sayi2 DB 4 toplam DB ? . . . .CODE . . MOV AL,sayi1 ADD AL,sayi2 MOV toplam,AL Yukardaki program parasnda 3 adet bir bytelk deiken tanmlanmtr. Bunlar sayi1, sayi2 ve toplam deikenleridir. Aslnda bu yazdmz satrlar assemblera bir deme eklindedir. Assembler programmz derlerken, hafzada bizim kullanmamz iin 3 bytelk alan ayracak ve bu alanlardan birine 5 dierine 4 deerlerini yerletirecektir. Toplam deikeninin deeri program altnda nemli olacandan dolay, onun deeri henz atanmam fakat undan da emin olun ki o adreste muhakkak bir deer mevcuttur. Grdnz gibi deikenlerini isimleri, trleri ve deerleri mevcut. Deiken ismi (sayi1 gibi) aslnda bir offset adresidir ve kullanm seimliktir. ayet deiken tanmlarken isim kullanmazsanz assembler yine hafzada deikenin trne gre yer ayrr. Fakat byle bir durumda deikeni programnzn iinde kullanmak iin adresini (ds:0000 gibi) bilmeniz gerekir. ok sayda deiken tanmlarken bu adresleri hesaplamak g olacandan dolay deikenlere isim vermemek pek tavsiye edilmez. Deikenin tr ise boyutu ile alakldr, rnein DB ile deikenimizin 1 bytelk olacan belirtiyoruz. Son olarak deikenin deeri tabi ki bir rakam yada say olmak durumunda. ayet balangta deer nemli deilse ? operatrn kullanabilirsiniz. Kaynak kodda deikenleri bu ekilde yazarak assemblera hafzada yer tahsis etmesini sylemi, bir baka deyile deiken deklare etmi oluyoruz. aret Karmaas 1 bytelk bir hafza alanna ne sar? Toplam 256 adet farkl deer 1 byte ile tanmlanabilir. Bunlar onluk dzende 0-255 aras saylar veya -128den 127 ye kadar olan iaretli saylar olabilir. Kafanz karmasn bu deerleri aslnda binary olarak dnmek lazm, nk 0...255 ve -128...127 aras saylar toplam 512 adet ediyor. Aslnda, bunlar sadece 1lerin ve 0larn kombinasyonlardr. Yani 1 byte 0000 00002 ile 1111 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 baka kullanacanz bir deer yok. aretli veya iaretsiz saylar, harfler, metinler, resimler, mp3ler ve Tomb Raider :) tamamen 1 ve 0lardan oluur.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

te bu 1 ve 0lar program iinde yorumlamak nemlidir, ancak o zaman anlam kazanrlar. Aslnda ilemci (CPU) sadece matematiksel, mantksal ve veri tama ilemleri yapar. Bu balamda bizim iin alt seviyede nemli olan 1 ve 0lardr. O zaman iaretli ve iaretsiz saylar neye gre belirlenecek? Boyutlar ve ilemci durum kaydedicisi (flag register) burada imdadmza yetiiyor. rnein 1111 1111 deeri onluk dzende 255mi yoksa -1mi. 255tir, nk 1111 11112 = 20+21+22+23+24+25+26+27 = 255 -1dir, nk 1 ile toplandnda 1 bytelk alanda 0000 00002 deeri elde edilir ve elde biti oluur.

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

1 bytelk bir deer 1 bytelk baka bir deerle toplannca sonu bir bytelk olmak zorundadr, nk ayrlan fiziksel alan bu kadardr. Bu ilemde artan 1 bitlik deer ilkokul matematiinden bildiimiz eldedir ve bu elde ilemci durum kaydedicisinin C (carry) bitinde saklanr. Daha nce ilemci durum kaydedicisinin bitsel olarak nemli olduundan bahsetmitim. Bu kargaa tamamen boyutlarn snrl olmasndan kaynaklanyor. Ayrca bilgisayarn bu hesap mant ile pozitif bir say bir baka pozitif say ile toplandnda negatif bir deer de elde edilebilir. Bunu tam tersi de olabilir. Biz bunlar ilerleyen makalelerimizde, ilemci durum kaydedicisini anlatrken iaret ve boyut tamas olarak inceleyeceiz. imdilik siz matematiksel hesaplamalar yaparken alanlarn kstl olduunu gz ard etmeyin. Yani 2 sayy toplayan program yerine, sonu olarak maksimum 255 deerini gsteren program demek u anda daha doru olur :) BAST DEKENLER Byte Deikenleri Bir byte boyutunda deerleri deklare etmek istiyorsak genellikle DB direktifini kullanyoruz. DB ngilizcede Define Byte yani byte tanmla anlamna gelir. Bu direktif ile hafzada 1 bytelk bir alan tahsis eder ve bu alana adresi ile eriebilirsiniz. MASM ile DB direktifi yerine byte yada sbyte direktiflerini de kullanabilirsiniz, fakat sonuta assemblern yapaca i ayndr. i j k db byte sbyte 0 255 -1

;MASM iin alternatif direktif ;MASM iin alternatif direktif

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Yukardaki tanmlama farkl gibi gzkse de assembly dili yazm deikenleri tanmlarken 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 bytea smayacak deerleri bu deikenlere atamaktr. DB direktifi ile; Ayrlan Hafza Alan : 1 Byte Tanmlanabilecek Deer Aral: -128...255 Word Deikenler DW 8086dan 80286 ilemcisine kadar offset adresleri, iaretli ve iaretsiz tamsaylar tanmlamak iin kullanlan en geni veri tipiydi. -32768...65535 arasndaki tam saylar DW direktifi ile deklare edebiliriz. MASM iin word ve sword direktifleri de ayn ii grr. Word deikenler hafzada 16 bit yani 2 bytelk alan kaplarlar. sayi1 sayi2 isayi1 sayi_0 sayi_eksi pointer dw dw dw dw dw dw ? ? ? 0 -1 65535 sayi1

sayi_enbuyuk dw

zetle DW direktifi ile; Ayrlan Hafza Alan : 2 Byte Tanmlanabilecek Deer Aral: -32768...65535 Double Word Deikenler 4 bytelk deikenler tanmlamak iin kullanlr. DD direktifi ile bu trdeki deikeleri tanmlayabilirsiniz. MASM ile dword, sdword direktiflerini de kullanabilirsiniz. sayi1 sayi2 isayi1 sayi_0 sayi_eksi pointer dd dd dd dd dd dd ? ? ? 0 -1 4000000000 sayi2

sayi_enbuyuk dd

DD direktifi ile; Ayrlan Hafza Alan : 4 Byte Tanmlanabilecek Deer Aral: -2,147,483,648...4,294,967,295

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

6, 8 ve 10 Bytelk Deikenler DF direktifi ile 6, DQ direktifi ile 8 ve DT direktifi ile 10 bytelk 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 (indeksleme amacyla, offset adreslerini gstermek iin kullanlan bir iareti) olarak kullanlr. Bu direktif ile 6 bytelk deikenlerin tanmlanmas mmkn olsa da 80386 ve sonras ilemcilerde pointer olarak kullanlr. DQ: 64 bitlik kayar noktal saylar 64 bitlik tamsaylar deklare etmek iin kullanlr. Daha ok kayar noktal saylar deklare etmek iin kullanlr, nk x86 ailesinin henz 64 bitlik genel amal bir kaydedicisi yoktur. Yani bu direktif ile 64 bitlik bir tam say deklare ettiinizde, bu say ile dorudan ilem yapamazsnz nk en byk kaydedici 32 bitliktir. DT: Daha hassas (80 bitlik) kayar noktal saylar ve 10 bytelk BCD deerleri deklare etmek iin kullanlr. Yukardaki direktiflerle ilgili ayrntl bilgileri kayar noktal saylarla ilemler bal altnda ilerleyen makalelerimizde vereceim. Pointer Veri Tipleri Pointer iareti anlamna gelip adresleme modlarnda grdmz indeksli adresleme ile alakaldr. x86 uyumlu ilemciler iki tr pointer desteklerler. Bunlar near (yakn) ve far (uzak) pointerlardr. Buradaki yakn ve uzak kavram referans alnan adresin segmenti (64Kb.) amamas yada amas durumunu ifade eder. Near pointerler 16 bitliktir ve bir segmentin offsetlerine erimek iin kullanlrlar. p bir deiken olsun, p=1000h iin aadaki kodlar inceleyelim. mov mov bx, p ax, [bx] ;BXe p pointern ykle. ;pnin gsterdii konumdaki veriyi AXe getir.

rnekte AX kaydedicisinin deeri pointern iaret ettii adresten alnacak 2 bytelk deer ile deiecektir. Bir baka deyile DS:1000h ve DS:1001h adresindeki deerler AXe yklenecek. Bu ilem ayn segment iinde olduundan dolay, pointer near yani yakn blgedeki bir adresi gstermi oldu. Aslnda mov ax,ds:1000h komutu da ayn ii yapard fakat pointer deikeni kullanlmadndan sonradan pointer deerini deitirip ayn komut satr ile hafzann baka bir blgesine erimek mmkn olmazd. Far (uzak) pointerlar ile hafzann istediiniz blgesine eriip ilem yapabilirsiniz. Bunun iin pointer deklare edilirken DD direktifinin kullanlmas gerekir, yani pointer 32 bitlik olmaldr. BX, BP, SI ve DI kaydedicilerini erieceiniz uzak offsetler iin herhangi bir segment kaydedicisini de (ki bu genellikle ES olur) erimek istediiniz segment iin kullanabilirsiniz. sterseniz bunu bir rnek ile aklamaya alalm.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

5555:3333 adresine eriip, buraya FFh deerini kopyalamaya alacaz. Bu ilemi yapan program aadaki gibidir. Kaynak kodlar buradan download edebilirsiniz.

ekil 2 - Uzak adreslere erimek iin 32 bitlik pointerlar kullanlr.

Bu rnekte pointer 32 bitliktir ve erieceimiz segment:offset adresini gsterir. LES komutu ES kaydedicisine pointer deikeninin yksek deerlikli 2 byten (5555h) yklerken, operandnda gsterilen kaydediciye de (bu rnekte BX) dk deerlikli 2 byten (3333h) ykler. MOV ES:[BX], AL komutu ile de 5555:3333 adresine AL deki FFh deeri kopyalanr. Aadaki ekiller ile bu programn pointer kullanarak nasl uzak adreslere eritiini grebilirsiniz.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 3 - LES BX, P komutu ilenmeden nce ES ve BXin durumu

ekil 4 - Pointer deikeni ilgili kaydedicilere yklendikten sonra

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 5 - 5555:3333 adresine FF deeri yklendikten sonra

OKLU DEKENLER Bu tr deikenler birden fazla paradan oluur. Tek boyutlu ve ok boyutlu diziler (arrays) ve yaplar (structures) bu tr deikenlerdir. Bu makalede sadece tek boyutlu dizileri anlatmaya alacam, ok boyutlu diziler ve yaplar baka bir makalede gzel rneklerle, amacna uygun bir ekilde anlatacam. Diziler Dizilerlerde dier deikenler gibi hafzaya yerletirilmi verilerden oluur. Ardarda gelen byte, word veya double word deikenler dizileri oluturabilir. Daha nceki makalelerimizde "Merhaba Assembly" yazsn ekrana yazdrmtk, ite bu karakterlerde hafzada dizi olarak saklanr. u anda yazdm karakterlerde hafzada bir dizi veri olarak saklanacak. Dizi kavramnn yannda getirdii baz terimler vardr, bunlar indeks, taban adresi, dizi eleman ve eleman tipidir. Burada dikkat edilmesi gereken en nemli nokta diziyi oluturacak elemanlarn ayn trden olma kouludur. Dier terimleride isterseniz aadaki ekille aklamaya alalm.

ekil 6 - Diziler ile ilgili terimler.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Dizinin tm elemanlarnn ayn trden olmas gerektiini sylemitik, bununla beraber dizinin ilk elemannn adresi taban adresidir. Dizinin elemanlarna erimek iin bu adres referans olarak alnabilir. Son olarak dizinin ilk elemanndan itibaren adresler artarak devam eder ve bu adreslerdeki her elemana indeks deerleri ile eriilir. Dizinin herhangi bir elemanna erimek iin kullanlacak klasik forml; Eleman_Adresi = Taban_Adresi + ((Indeks - lk_Index) x Eleman_Boyutu) Bu formlde ilk_indeks 0 ise gz ard edilebilir. Dizilerin Deklare Edilmesi Balangta elemanlarn deerleri nemli deilse; Dizi DB 100 DUP (?) Dizi DW 100 DUP (?) bytelk alan kaplar. ;byte trnden 100 elemanl bir dizi ;word trnden olduundan dolay hafzada 200

Buradak DUP direktifi ingilizcedeki duplicate (dierinin ayns) kelimesinin karldr. Elemanlar ayn olacaksa; Dizi DB 100 DUP (12h) ; Hafzaya 100 adet 12h yerletirir.

Elemanlar farkl ise; Dizi DB 32, 45, 67, 3F, 0, 7, 11 dizi. Yazi DB Merhaba Assembly ascii kod karlklar saklanr. ;7 tane byte trnden elemandan oluan bir ;16 elemanl bir karakter dizisi, hafzada

Unutulmamas gerekir ki taban adresi dizinin banda yazdmz etikettir, rnein yukarda Merhaba Assembly karakterlerinden oluan byte trndeki dizinin taban adresi Yazidr. Tek Boyutlu Dizilerin Elamanlarna Erimek WordDizi DW 1, 45, 1234h, 567Ah, 99, 105Eh

Yukardaki dizinin 2. elemanna erimek demek o elemann adresini bulmak ile ayn anlama gelir. Bunun iin formlmz vard; Eleman_Adresi = Taban_Adresi + ((Indeks - lk_Index) x Eleman_Boyutu) Bu forml word tipindeki dizimize uygulayacak olursak; Eleman_Adresi = WordDizi + ((2 - 0) x 2) yada; Eleman_Adresi = WordDizi + 2 olarak bulunur.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Tabi ki bu ilemi bir program ile yapmak lazm. Ayn ii yapan program paras aada verilmitir. mov add mov bx, 2 ; indeks deeri BXe ykleniyor, bx, bx ; 2*bx ilemi yaplyor, ax, WordDizi [bx] ; AXe dizinin 2. eleman (1234h) ykleniyor.

Dizi elemanlarna erimek iin ok deiik teknikler mevcut, fakat bunlar ilerleyen makalelerimizde aklayacam. Bazen assembly programclar dizilerini deklare ederken, dizinin ilk eleman olarak indeks deerini koyarlar. Tabi ki bu durumun doruluu grecelidir. rnein byte trnden bir dizi iin bu teknikle en fazla 255 elemandan oluan bir dizi deklare edebilirsiniz. Daha fazla eleman deklare etmek iin indeks deerinin boyutunu arttrmak gerekir ama bu durumda da dizi elemanlarnn ayn trden olmas artn gz ard etmemek gerekir. Diziler usta programclarn vazgeemedii veri yaplardr. nemli olan dizinin elemanlarna erimek iin kullanlacak olan fonksiyonu assembly dilinde yazabilme kabiliyetidir. rnein; Yildizlar DB 10 DUP (*)

dizisinden aadaki geni ekrana yazdrmak gibi. * ** *** **** Aln size dev, bir daha ki makaleye kadar bu program yazmaya aln, bylece hem adresleme modlarn hem de tek boyutlu dizileri kavram olursunuz. Sakn zor demeyin elin olu dizilerden matrix tretip, sonra ona felsefi bir boyut ekleyip filim yapyor :)

Assembly Kodlarna Bir Assembly Programcs Gibi Bakmak


Yazdmz programda iki tane i yaplyor. Birincisi ekrana bir dizi byten ASCII grnmn yazdrmak, ikincisi bilgisayar tekrar kullancnn ellerine brakmak yani iletim sistemine geri dn.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 6 - Programmzn paralar

Yukardaki ekilde algoritmanzn assembly koduna dnm halini gryorsunuz. Tamam, geen hafta bu program yazarken algoritma falan hazrlamadk ama nce ekrana yazdr sonra k mantn iin de algoritma yazlmaz herhalde :) Bu program DOSun 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 yzden bu olay daha iyi anlamanz iin aadaki diyalogu hazrladm. Buradaki acemi assembly programc (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 ekran kart 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 bytelar nasl gndereceimi bilmiyorum, bana anlatrmsn ltfen? TAP- Hangi iletim sistemini kullanyorsun? AAP- Windows! TAP- Bytelar ekran kartna gndermene gerek yok, onu senin yerine iletim sistemi yapar zaten. AAP- Peki nasl olacak? TAP- INT 21in 9. fonksiyonu senin iin birebir, ilemcinin AH kaydedicisine 09, DX kaydedicisine karakterlerin balang adresini yaz, sonrada 21. interrupt servisini ar. Ha bu arada son karakterden sonra hafzaya bir $ iareti koy ki interrupt servisi yazlacak karakterlerin bittiini anlasn. Anladn m? AAP- Anlar gibi oldum? Ama ben bu ii kendim yapamaz mym?

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

TAP- Yaparsn tabi ama ok ekmek yemen lazm :) AAP- Nasl yani?(bu arada TAPn glne de kzar tabi) TAP- Bak AAP karde, Windows gibi iletim sistemini yazan programclar senin gibi programclarn ekrana bir ey yazmak isteyeceini, veya klavyeden bir bilgi alacan yada yazcdan kt almak isteyeceini dnerek baz kk programlar yazp iletim sistemlerine gmmlerdir. Sende bu hizmetlerden faydalanr ve Amerikay yeniden kefetmeye 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- (AAPnin sonra tekrar gelip baka interrupt servislerini de soracandan endielenerek) Hey AAP, bak buradan dier interrupt servislerine de bakabilirsin, hani lazm olur diye sylyorum... AAP- Teekkrler TAP. Daha sonra AAP bilgisayarnn bana gider yukardaki ekildeki programn ilk satrn yazar ve altrr, tabi ki ekranda MERHABA ASSEMBLY grnr ama komut istemindeki penceresini kilitlenir, nk ekrana yazdrma ileminden sonra program sonlandrmamtr. Bunun zerine program sonlandrmak iin tekrar interrupt servislerini aratrmaya koyulur ve interrupt 21in 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. lerleyen makalelerimizde interruptlar daha yakndan ele alacaz, bu konular gerektende ok zevkli. Yukardaki diyalog ta kaydediciler (register) diye bir kavram geti, bunlar imdilik mikroilemci iindeki hafza konumlarna (memory location) benzeyen yaplar olarak dnn. Kaydedicilerin listesini grmek iin debug programn kullanabilirsiniz.

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

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

X86 kaydedicilerinin AX, BX, CX, DX, SP, BP... diye adlar vardr ve bunlarn hepsinin deiik ilevleri mevcuttur. Program yazarken elbette bunlar kullanacaz ama imdilik zmn yiyin ban sormayn, nk ban yerini sylersem ve sizde gider o baa bakarsanz itahnz kaabilir. Kafalar fazla karmadan yeni bir uygulama yapalm.

10 defa Merhaba Assembly Yazdryoruz


Tabi byle bir ii yaptrmann deiik yollar mevcut ( bir .bat uzantl script dosyas hazrlayp ilk programmz 10 defa altrmak bunlara dahil deil tabi :) ) imdi yazacamz programda ilk programmzn ilk satrn 10 defa altrp sonra program sonlandracaz. 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 bu program dosya haline getirin, bytelar saymada sizler iin pratik olur. Burada CX kaydedicisine (0A)16=(10)10 deerini saya olarak yklyoruz. LOOP komutu CXin deeri kadar operand ile belirtilen adrese dallanr, burada dallanlacak adres 0103 offset adresidir ve bu ilem sayesinde ekrana 10 defa MERHABA ASSEMBLY yazlr. Daha sonra programmz fonksiyon:4C interrupt 21 ile sonlanyor. Buradaki stringe dikkat, debug ile assembly modunda hafzaya bir dizi karakter girmek iin DB (Define Byte) talimatn kullanyoruz. Talimatlar (daha sonra ayrntl bir ekilde greceiz) derleyiciye verilir yani opcode olarak dntrlmezler, ayn Cdeki int, double, string veri tipleri gibi. DBden sonra ayet bytelar karakter olarak girmek isterseniz " " arasna yazmalsnz. Bu ilemi karakterlerin hexadecimal kodlarn yazarak ta yapabilirsiniz bu sefer her bir karakterden sonra "," koymanz gerekir. Burada her iki teknikte kullanlmtr. ASCII kod tablosuna bakacak olursanz 0A=LF yani Line Feed (bir satr aa) 0D=CR yani Carriage Return (Kursr satr bana) olduunu grrsnz, zaten CR ve LF kontrol karakterleri olduundan dolay standart ASCII kod tablosunda A,C,P,Z gibi normal karakter olarak karlklar yoktur mecburen hex. kod karlklarn kullanmak zorunda kaldk. INT 21 fonksiyon 9 ile yazdracanz karakter dizilerinin sonunda mutlaka 24=$ bulunmal yoksa

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

bu interrupt servisi hafzada 24 deerini bulana kadar ekrana yazma ilemine devam eder. Bu programn kodlar ile oynayarak konuyu daha iyi kavrayabilirsiniz, rnein 0D karakterini kodlardan kartn yada CXe yklenen deeri deitirin. Son olarak debug ile bu program adm adm altrabilirsiniz, bunun iin program yazma ilemi bitince P (Proceed) komutunu kullann T (Trace) komutu ile programnz iinden arlan interrupt servislerine de girebilirsiniz (ama kabilirmisiniz orasn bilemem) Debugtan kmadan bir daha programnz altrmak iin "r ip" komutunu kullanarak ip kaydedicisini 0100 yapn, bylece programn balang adresini doru ayarlam olursunuz.

ekil 9 - Adm adm program ilemek

Bir sonraki makalemizde say dzenleri ile ilgili birka nemli noktay, ve assembler konularn ileyeceiz. Yorumlarnz ve nerilerinizi bekliyorum....

Assembly programcs sisteme nasl bakyor?


Mikroilemci bir ok karmak birimden oluur, neyse ki programclar donanmsal olarak sistemleri fazla yakndan bilmek zorunda deillerdir. Bir assembly programcs sadece mikroilemci iindeki birka kaydediciyle ilgilenir. Bunun dndaki birimler genelde okullarda bilgilendirmek amacyla verilir, rnein CPU iinde bir ALU biriminin olduunu bir ok programc bilir ama bu birimin almas ile ilgilenmezler. Bir assembly programcs keskin baklarn mikroilemcinin iinden ekip :) sistemin tamamna baktnda bile, donanmlarn ve donanmlar birbirine balayan birimlerin almas ile ilgili fazla birey gremez yada grmesine gerek yoktur. Programclk ve elektroniin snr noktas budur aslnda. Assembly programclar kaydediciler, hafza veya sistemi oluturan birimlerde dolaan elektron akmlarn 1ler ve sfrlar olarak grrler ve genelde bu 1 ve 0lardan enaz 8 tanesini yan yana grdklerinde bir eyler anlamaya veya yorumlamaya balarlar.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

X nl gzlerimiz PC zerinde?

ekil 1 - PCnin kabaca i organizasyonu

Bir sisteme bilgisayar diyebilmeniz iin o sistemin en az 1 CPU, memory (RAMROM/Hafza) ve I/O (Input-Output/Giri-k) birimin olmas gerekir. Elbette bu birimle birbirlerine yollar (bus) ile bal olmal ve sistemin alabilmesi iin hafzasnda bir firmware programnn ykl olmas gerekir. Yukardaki ekilde bu birimleri gryorsunuz. Dikkat ederseniz btn yollar CPUya kyor, dier birimler arsnda dorudan bir balant yok, bunun byle olmas gerekir yoksa iler kontrolden kabilir. Aslnda her modern bilgisayarda DMA (Direct Memory Access/Dorudan Bellek Eriimi) adnda bir transfer yaps mevcuttur fakat bu zellik kullanc tarafndan kapatlabildiinden dolay birimler arasndaki en temel balant yukardaki ekildeki gibidir. Ayrca DMA zellii kullanldnda CPU veri transferinden elini ayan tamamen deil ksmen eker, CD-ROM kilitlenmelerinde Ctrl+Alt+Del kombinasyonun zorda olsa almas bundan dolaydr. Ne demiler kontrolsz g, g deildir :) Konuyu fazla datmadan isterseniz X nl gzlerimizle CPUya zoom yapalm :)

X nl gzlerimiz CPU zerinde?

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

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) gibi kontrol sinyalleri, veri yolundan ilenecek veriler gidip gelir. Adres yolu iste tek ynldr ve CPUdan dier birimlere doru sinyal ak olur, rnein hafzaya bir veri yerletirilmeden nce adres yolundan verinin yerletirilecei hafza adresinin bilgisi gnderilir. Bunu daha iyi anlamak iin aadaki animasyonu izleyebilirsiniz yada animasyonu offline izlemek iin download edebilirsiniz. En temel 3 birimden biri olan ALU aritmetik ve mantksal ilemleri yapan bir elektronik devredir. BIU ise komut kodlarnn icras ile ilgilenir yani emirleri icra eden birim olarak basite tanmlanabilir. Kontrol nitesi ise sistemdeki birimleri harekete geirmek iin kontrol sinyalleri retir. Bu birime programcnn dorudan mdahalesi sz konusu deildir. Programc sadece CPU iindeki kaydedicilere eriebilir.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

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

Kaydedicileri tam olarak anlayabilmeniz iin onlar kullanmanz gerekir, yani burada ne kadar anlatsak bo bu yzden ksaca yukardaki ekilde grdklerinizi aklayp hemen bir uygulama yapalm. Genel Amal Kaydediciler Bu kaydedicilerin 8,16 ve 32 bitlik kullanm mmkndr. rnein AL ve AH Accumulatorn 8 bitlik kullanmn AX 16 bitlik EAX ise 32 bitlik kullanmn simgeler. Genel amal kaydedicilerin hepsi verileri geici olarak zerlerinde barndrabilir fakat baz x86 komutlar buradaki kaydedicilere zeldir. Mesela loop komutu ile CX kaydedicisinin deeri azalr. Accumulator (EAX, AX, AH, AL): En sk kullanacanz kaydedicidir. ok genel kullanm alanna sahiptir, daha nceki makalelerimizde yazdmz kodlara bakarsanz ok deiik amalarla kullanldn grebilirsiniz. Bu kaydedici birok giri/k ileminde ve aritmetik ilemlerde (arpma, blme ve tama gibi) kullanlr. Ayrca baz komutlar ilenmeden nce accumulatorden parametre alr veya bu kaydediciye ilemin sonucunu kaydeder. Base (EBX, BX, BH, BL): Accumulator gibi genel amal ve hafza eriiminde indexleri gstermede kullanlr. Bir baka kullanm alanda hesaplamalardr.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Counter (ECX, CX, CH, CL): zel amalar ve hesaplamalarda kullanlaca gibi genellikle bu kaydediciyi sayc olarak kullanlr, daha nce loop komutunun CX kaydedicisini otomatik olarak deitirdiini sylemitik. Data (EDX, DX, DH, DL): Baz giri/k komutlarnda bu kaydedicinin kullanlmas gerekir, ayrca arpma ve blme ilemlerinde accumulator ile birlikte byk sonular bu kaydediciden okuruz. Segment Kaydedicileri Segment kaydedicilerinin hepsi 16 bitliktir ve hafzann segment olarak adlandrlan ksmlarn adreslemede kullanlr. Code Segment Kaydedicisi (CS): DOS iletim sisteminde programlar oluturan kodlar code segmente yklenir. CS kaydedicisi ise IP kaydedicisi ile birlikte programn alma srecinde, programn oluturan kodlarn adreslerini gsterirler. Data Segment Kaydedicisi (DS): .exe trndeki bir programda kullanlacak olan veriler data segment denilen hafza blmnde tutulur. DS kaydedicisi ise bu blgedeki verilerin konumlarn gsterir. Stack Segment Kaydedicisi (SS): Tm programlar stack segment denilen bir hafza alann geici depolama alan olarak kullanmak zorundadrlar (rnein dallanma ilemlerinde). SS kaydedicisi ise SP kaydedicisi ile birlikte bu verilerin adreslerini referans eder. Extra Segment Kaydedicisi (ES): Baz string ilemlerinde DI kaydedicisi ile birlikte karakterlerin bulunduu hafza adreslerini tutarlar. FS ve GS Kaydedicileri: 80386 ve sonras CPUlarda bulunurlar ve dier segment kaydedicilerinin yetersiz kald durumlarda kullanlrlar. zel kaydediciler IP ve EIP kaydedicileri: IP 16 bitlik DOS programlarnn EIP ise 32 bitlik programlarn ilenmesi 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 ilemden sonra o ileme zel sonular gsterirler. lemci durum kaydedicisi olarakta bilinen bu kaydediciler sonucun sfr, pozitif veya negatif olduunu veya ilemin sonucunda elde retilip retilmedii gibi birok nemli veriyi bitsel olarak programcya bildirirler. Index Kaydedicileri Bu kaydedicilerin E ile balayanlar 32 bitlik programlarda, dierleride 16 bitlik programlarda 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 adreslerine erimek iin kullanlr. Burada aklamadm dier kaydediciler: X86 ailesindeki ilemcilerde baka kaydedicilerde mevcuttur. Bunlardan bazlarn programc kullanamaz bazlar

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ise ayrcalkl mod, korumal mod diye adlandrlan zel alma modlarnda anlam kazanr hatta bu tr alma modlarnda yukarda saydmz kaydedicilerin birou bambaka amalar iin kullanlrlar. lemciyi ksaca anlatmaya altm, sra hafzada.

HAFIZA
imdi hafzann fiziksel ve mantksal yapsn anlatacam, fiziksel yaps ile programc fazla ilgilenmez hafzann mantksal yaps ise tm programclara hemen hemen ayn grnr. ok kark bir konu olmasna karn basit bir anlatmla bu konuyu kavramanz umuyorum. 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, zetle data busn (veri yolu) genilii kullanlacak olan hafza chipini belirler. Hafza denilince boyutu 8 bit olan bir dizi hcre ve bu hcrelerin numaras olan adresler akla gelir. Hafza chipleri veri, adres ve kontrol yollarna baldr. Hafzada bulunan veriler hexadecimal formatta 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 bilmek ie yarayabilir. rnein 0. adresten itibaren 16 bitlik (2 byte veya word) bir deerin ilemci kaydedicilerine herhangi bir ilem iin ekileceini varsayalm. X86 ailesi ilemciler, hafzadan verileri dk deerlikli ksmndan itibaren okurlar (little endian). Bu rnekte hafzaya eriim ift numaral adresten yapld iin ABFFh verisi data busa doru bir ekilde

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

yerleecektir ve en hzl hafza eriimi bu ekilde yaplr. Birde tek numaral bir adresten rnein 7. adresten okuma yapldn varsayalm. Bu durumda okunmas gereken deer 4676h olmasna ramen data busa 7646h verisi yerletirilir gibi grnyor deil mi? Hal byle olunca ilemci nce Odd Banktan daha sonra Even Banktan okuma yapar ve bu bytelar sraya koyar, bu tr bir hafza eriimi daha uzun zaman alr. zetle ift numaral adreslerden 1 bytetan fazla bir deere eriilirse buna sral eriim (Aligned Memory Access), tek numaral adreslerden okuma yaplrsa buna srasz hafza eriimi (Unaligned Memory Access) denir. Sral hafza eriimi sraszdan 2 kat daha hzl olduundan programlamada buna dikkat edilmelidir. Bu tr ayarlamalar assembly 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=1048576 yani 1 MB. a denk gelir. 80286 ilemcisinin adres yolu 24 bitlikti ve 224= 16777216 hcreyi, baka bir deyile 16MB. lk bir hafza alann adresleyebilirdir. Gnmzde kullanlan mikroilemcilerin adres yolu ounlukla 32 bitliktir, buda 4 Milyar ksr hafza konumuna denk gelir. Yava yava 64 bit devri balyor, AMD 64 bitlik ilemcilerini oktan piyasaya srd 264 adet hafza konumu gelecein programlarn altrmak iin epey yeterli. Her ne kadar mikroilemci byle byk hafza alanlarn desteklese de byle bir alan kullanabilmemiz hafzay nasl organize edileceine baldr. Hafza organizasyonuna yaplan bu yaklama hafzann mantksal yaps diyebiliriz. Hafzann mantksal yaps alma moduna gre deiiklik gsterir ve alma modu iletim sistemleri tarafndan belirlenir. X86 uyumlu tm PCler Real Mod denilen alma modunda alrlar, daha sonra iletim sistemine gre hafza farkl bir ekil alabilir. rnein Linux yada Windows iletim sistemi ykleniyorsa hafza Protected Mod (korumal mod) denilen yapya brnr. DOS iletim sistemi ykleniyorsa (neydi o gnler :)) hafza real modda kalr. Birde korumal mod altnda DOS programlarn altrmak ve korumal mod ile real mod programlar arasnda gei yapmak iin windows iletim sisteminin Virtual Protected Modu vardr. Tm bu modlar tek bana bir makale konusu olduundan ve u an iin biraz ar konular olduundan fazla ayrntya girmiyorum. imdi sadece en basit ve programlarmzda kullanacamz mod olan Real Mode Adressing yeni gerek modda hafzay inceleyeceiz. Real modda hafza 64Kblk segmentlerden oluur ve bu segment iindeki her bytea erimek iin offset adresleri kullanlr. Bu durumda hafzann tamam bir kitap, segmentler sayfalar ve adreslenebilen her byte ise satr olara dnlebilir. Protected mod ok daha karmaktr. 80286 ve sonras ilemciler protected moda gei yapabilir. Sayfalama (paging), sanal bellek (virtual memory) ve multitasking (ok grevlilik) korumal modun getirdii byk avantajlardr. Mikroilemci hafzann herhangi bir konumuna eriirken segment adresini segment kaydedicilerinden, offset adresini de ayet eriilecek olan bir komut kodu ise IP kaydedicisinden alr. Eriilecek olan veri (deiken, karakter vs.) ise verinin trne gre offset adresini tutacak olan kaydedici deiir, rnein eriilecek veri stackta (yn bellekte diyebilirsiniz) ise buradaki verinin offset adresini SP (stack pointer) tutar.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Segment kaydedicileri 16 bitliktir, real modda offset adresleri index kaydedicilerinin 16 bitlik ksmlarnda (SP,BP,SI,DI) veya 16 bitlik olan IP kaydedicisinde tutulur. Bu durum xxxx:xxxx formatnda gsterilir. rnein 3456:76A3 real modda bir hafza adresini gsterir, burada 3456 segment adresi iken 76A3 ofset adresidir. 3456:76A3 gibi bir adres gsteriminde 3456y sayfa numaras olarak dnrsek bu sayfada 0000-FFFF arasnda 65536 adet offset adresi (satr) mevcuttur diyebiliriz ve bu konumlarn her biri 1 bytea denk gelir. Hafzann gerek yapsn gz nne alrsak rnein 8086 ilemcisi en fazla 1MB. lk hafzay adresleyebilir fakat xxxx:xxxx eklinde bir gsterim 4GBlk bir alana denk gelir (FFFF kere FFFF). Hal byle olunca ilemci real modda alrken gerek adresi bulmak iin bir hesaplama yapar nk gerekte hafza real modda 00000H-FFFFFH arasnda anlamldr.

ekil 5 - Programc hafzay adresleri olan byte tablosu olarak dnr

Real modda gerek adres u formlle bulunur; 045F:0032 adresi iin, segment adresi 4 bit sola kaydrlr veya baka bir deyile adresin sonuna 4 adet 0 getirilir (0000)2=(0)16 bylece segment adresi 045F0 olur, sonra buna offset adresi eklenir ve gerek adres bulunur. 045F0h+0032h=04622h gerek hafza adresidir.

Gerek modda bilgisayarnz Pentium 4 bile olsa hafzann sadece 1MB. lk alann adresleyebilirsiniz, ayrca sadece kaydedicilerin 16 bitlik ksmlarn kullanabilirsiniz. Bu son model ferrarinizi otobanda 1. viteste srmeye benzer. imdide hafza ve kaydedicileri daha iyi anlamak iin rnek program hazrlayalm. TITLE Kaydediciler ve Hafza (regmem.asm) ;########################################

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

;# Bu program hafzadaki 2 adet byte toplar ve sonucu # ;# tekrar hafzaya kaydeder. # ;# Son Gncelleme: 05/03/05 # ;# Yazan --> 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 MODLARI
Bildiiniz 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 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 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 Komutlar


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


Komut Aklama art E Komut Kart Komut

JA

Jump if above (>) (Yukarsndaysa) Jump if not below or equal (not <=) JNBE (Aasnda deil yada eit deilse) JAE Jump if above or equal (>=) (Yukarsnda veya eitse) JNB Jump if not below (not <) (Aasnda deilse) JB Jump if below (<) (Aasndaysa) Jump if not above or equal (not >=) JNAE (Yukarsnda deil veya eit deilse) JBE JNA JE JNE Jump if below or equal (<=) (Aasnda veya eitse) Jump if not above (not >) (Yukarsnda deilse) Jump if equal (=) (Eitse) Jump if not equal (!=) (Eit Deilse)

Carry=0, Zero=0 Carry=0, Zero=0 Carry = 0 Carry = 0 Carry = 1 Carry = 1 Carry = 1 or Zero = 1 Carry = 1 or Zero = 1 Zero = 1 Zero = 0

JNBE JA

JNA JBE

JNC, JNB JNAE JNC, JAE JB JC, JNAE JNB JC, JB JNA JBE JZ JNZ JAE JNBE JA JNE JE

aretli Saylarda Jxxx Komutlar


Komut Aklama art E Komut Kart Komut

JG JNLE

Jump if greater (>) (Bykse)

Jump if not less than or equal (not <=) (Dk deilse yada eit deilse) Jump if greater than or equal (>=) JGE (Bykse veya eitse) JNL Jump if not less than (not <) (Dk deilse) JL Jump if less than (<) (Dkse) Jump if not greater or equal (not >=) JNGE (Byk deilse veya eit deilse) Jump if less than or equal (<=) (Dkse veya JLE eitse) JNG JE JNE Jump if not greater than (not >) (Byk deilse) Jump if equal (=) (Eitse) Jump if not equal (!=) (Eit deilse)

Sign = Ovrflw or Zero=0 Sign = Ovrflw or Zero=0 Sign = Ovrflw Sign = Ovrflw Sign Ovrflw Sign Ovrflw Sign Ovrflw or Zero = 1 Sign Ovrflw or Zero = 1 Zero = 1 Zero = 0

JNLE JG JNL JGE JNGE JL JNG JLE JZ JNZ

JNG JLE JGE JL JNL JGE JNLE JG JNE JE

Tabiki yukarda kullandm byk, kk, yukarsnda veya aasnda kelimeleri saylarn deerleri asndandr. Tablolarda aslnda ayn ii yapan hatta makine dzeyinde ayn kodu reten komutlar vardr. Bunlara rnek olarak JA ve JNBEyi rnek verebiliriz. Assembler her iki komut iinde ayn makine kodunu retir, fakat programcy assembly kodlarn yazarken birazck olsun rahatlatmas iin Intel bu tr yazm uygun grmtr. Tm programlama dillerinde kullanlan if, for, while vb. deyimler aslnda artl dallanma komutlar ile dzenlenmi bir ka assembly komutuna benzetilebilir. Hatta ii biraz daha netletirelim C dilinde kullandmz "if" deyimi aslnda bir adet cmp ve bir adet Jxxx komutundan oluur, xxx ksm ise arta gre deiir. Aadaki rnekle bu olay daha iyi anlayabilirsiniz.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 1 - C Dili ile yazlm bir program.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 2 - Programn assembly kodlarna baktmzda if deyimine karlk CMP ve JLE komutlarn gryoruz.

1. ekilde C dilinde yazlm basit bir program gryorsunuz. Bu programda tamsay trnden 2 adet deiken (a ve b) ve karakter trnden 1 adet deiken mevcut (sonuc). IF deyimi ile ayet a, bden bykse (ki zaten yle) sonu deikenine by temsilen b karakteri aksi durumda k temsilen k karakteri yklenecek. imdi burada bizi ilgilendiren C dilinde IF acaba assemblyde neye karlk geliyor? ekil 2 ye baktnzda bu sorunun cevabn hemen gryorsunuz. IF aslnda CMP ve JLE komutlarnn bir kombinasyonuymu. JLE yerine baka bir artl dallanma komutu gelebilirdi, bu tamamen IF ile kullandnz arta baldr, bu programda IF (a>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-byte ve ardk olarak saklanr ayn zamanda bu bytelar elbette harflerin veya saylarn ASCII kod karlklardr. 8086 komut seti (blm 1) balkl makalemizde saat program yapmtk ve kaydedicilerde elde ettiimiz sonular bir tablo vastasyla ASCII karakterlerini ekranda gstermitik. Bu yntem ska kullanlmaz, hatta daha nce bu i iin bu yntemi kullanan bir program grmedim diyebilirim. Representation yani gsterme veya sunum ilemi ok geni bir yelpazede incelenebilir, bu tamamen kullancnn hayal gcne kalm bir olaydr. Benim burada anlatmaya alacam olay ise ekran text modunda iken hafzadaki binary ifadelerin ASCII karakter karlklarn ekranda gstermek olacaktr.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Diyelim ki bir ilem yaptnz ve sonucunu 20h (32) olarak AL kaydedicisinde saklamay baardnz ve bunu ekranda gstereceksiniz, bunu direk olarak ekrana yazdrrsanz sadece imleci 1 kez ilerletmi olursunuz nk 20h ascii kod tablosunda space yani boluk karakterine karlk gelir, klavyedeki en byk tu yani. Peki 32yi nasl yazdracaz? Unutmayn ki ascii kod tablosunda sadece rakamlarn, harflerin ve bir dizi kontrol karakterinin kod karlklar vardr saylarn kod karlklar yoktur. Bu balamda biz 32 yi deil 3 ve 2 yi yan yana ekranda gstermeyi dnmeliyiz. Ama u anda ALde ne 3 ne 2 var sadece 20h var. Dier bir gerek 3un ascii kod karl 33h ve 2 nin ki ise 32h dr. 30h ile 39h aras ascii kod tablosunda rakamlar iin ayrlmtr. imdi ekrana srasyla 33h ve 32h gnderirsek kullanc 32 yi grecektir. Problemi zetleyelim elimizde bir baytlk 20h var ve bizim bunu 2 byte lk 3332h dizisine dntrmemiz gerekiyor. Keke bir komut bu ilemi bizim yerimize yapsa! Byle bir komut varm yokmu oraya geleceiz ama 20h ile 3332h arasnda gzel bir ba var. 20h 0ah yani 10a blsek zaten hexden decimale dnm ilemi yapm oluruz; mov mov div ax, 20h bl, 0Ah bl ;AX=0203 yapar.

Keke AXteki 0203h deerinde 0larn yerine 3 gelseydi; or ax,3030h ;AXteki 0203h artk 3233h oldu.

birde al ile ah yer deitirsek! Acaba buna gerekten gerek var m? Hatrlarsanz ekrana bir string yazdrmak iin DOS kesmelerinden 09h nolu fonksiyonunu kullanmtk ve bu fonksiyon hafzadaki stringleri yazdryordu, yani biz AXteki bu 3233h deerini nce bir hafzaya atalm sonra 32h ile 33hn yerini deitirmek gerekiyor mu dnrz; mov sonuc, ax ; sonuc=3332h olur.

x86 tabanl ilemciler hafzay adreslerken little endian byte sralamasn kullanrlar, bu yzden aldeki dk deerlikli byte hafzann dk numaral adresine axteki yksek deerlikli byteta hafzann yksek numaral adresine yerlemi olur, bylece ax ile alnin ieriklerini takas etmemize de gerek kalmaz. Artk sonuc deikenini referans gstererek ekrana yazdrma kesmesini kullanabilirsiniz. lea mov int dx,sonuc ah,9 21h

AAA, AAS Komutlar Klavyeden giri yapldnda, baslan tua ait kod hafzada ascii formatta saklanr, mikroilemci hesaplamalar binary yapar bu yzden asciiden binaryye dnm yapmak gerekir. ayet ekrana bir karakter baslacaksa bu karakter ekrana gnderilmeden nce ascii forma dntrlmelidir.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Bizler gnlk yaammzda desimal deerleri kullanrz, bu desimal deerleri hafzada binary rakamlar olan 1 ve 0lar kullanarak gsterebiliriz, buna BCD (Binary Coded Decimal) kodlama diyoruz. Desimal numaralar hafzada BCD olarak gsterilmenin yannda ASCII olarakta gsterilebilir. te AAA, DAA, AAS gibi komutlar bunun iin kullanyoruz. rnein klavyeden girilen 1234 hafzada 31 32 33 34 olarak ASCII formda saklanr. BCD gsterimin ise iki farkl eidi vardr, bunlar packed BCD (paketlenmi BCD) ve unpacked (paketlenmemi) BCDdir. 1234 hafzada 01 02 03 04 byte dizisi olarak saklanrsa bu paketlenmemi BCDdir, ayet ayn deer hafzada 12 34 byte dizisi olarak saklanrsa bu da paketlenmi BCDdir. AAA, AAS, AAD ve AAM komutlarnn hepsi ascii deerlere dnm iin kullanlr. Bu komutlarn operand yoktur AL kaydedicisindeki deerleri dntrrler. AAA (Ascii Adjust After Addition) komutu toplama komutundan sonra sonucu ascii ye ayarlar. Aadaki rnekleri inceleyin; 34h = 0011 0100b 35h = 0011 0101b +_______________ 69h = 0110 1001b Sonu 09 olmas gerekir AAA komutu 6 deerini siler. Sonu ALde 09 olarak grlr. 36 = 0011 0100 35 = 0011 0101 +_______________ 6B = 0110 1011 Sonu 11 olmas gerekir AAA komutu B deerinin yerine 1 koyar ve toplama sonucu 9 deerini atndan AH kaydedicisine de 1 koyar, yani AX = 0101 olur. Tm bu ilemlerden sonra OR komutunu kullanarak sonucu ASCII gsterim iin hazrlayabiliriz. SUB AH, AH MOV AL, 6 ADD AL, 8 AAA OR AL,30h ; AH temizleniyor ; ilk deer ALde ; AL + 08h ilemi yapld sonu 0Eh ; AX = 0104h ; AL = 34h

34h artk ascii olarak 4 demektir. Tabi burada AH kaydedicisini de kontrol edip ayet 01 ise bu deeri de 30h ile OR ilemine tabii tutmalyz. Bu tr ilemler iin genelde ekrana tek bir karakter basma fonksiyonu kullanlr yani ALdeki deer teker teker ekrana bastrlr. Henz mantksal komutlar grmedik bu

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

yzden aadaki program tam olarak anlamayabilirsiniz, bu yzden aklamalara dikkat edin.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil - Makine dilinden insan diline dnm

Pekte gzel bir ekran kts olmasa da bu program dnmleri anlamak iin iyi bir rnektir. Yukardaki ekilde program ilk aktrldnda klavyeden srayla 2 ve 3 girilmi ve sonu 5 olarak ekrana baslm. Daha sonra 7 ve 8 deerleri girilmi ve sonu 15 olarak ekrana baslm. Gerektende sonular doru :) Unutulmamas gereken bir nokta AAA komutunun C bitini etkilediidir, ayet AAA komutundan nceki bayraklarn durumu sizin iin nemliyse bayraklarn durumunu saklamanz gerekir. AAS (Ascii Adjust after Subtract) komutuda AAA gibi alr, kartma komutundan sonra sonucu ASCIIye ayarlamak iin kullanlr. AAS komutu sekiz bitlik AL kaydedicisinin yksek deerlikli 4 bitini kontrol eder, ayet AF bayra 1 ise (baka bir deyile bu 4 bit Ah...Fh arasnda ise) ALden 6, AHtan 1 kartlr. AHtan 1 kartmak normalde 00 olan AH FF yapmak yani rakamn negatifliini ayarlamak demektir. mov al,35h sub al,31h aas ; or al,34h ; ascii 5 ;5-1=4 AF=0 olduundan bir deiiklik olmaz sonu hala 04h ; ascii 4

sonucun negatif kt bir rnek; mov sub aas al,34h al,38h ;ascii 4 ;ascii 8 -- sonu FCh (negatif) ; AX = FF06 (yanl sonu)

yukardaki gibi bir durumda SUB komutu ile A ve C bayraklar set (1) olur. Bu durumda sonucu dorudan 30h ile OR ilemine tabi tutmak hatal olacaktr. FCh sonucu desimal -4 deerine eittir bu yzden burada programc OR komutu ile doru ascii deeri ekrana yazdrmadan nce NEG komutu ile tersini alabilir. Bu durumda sonuc 4 olacaktr. Tabiki bu 4 deeri ekrana yazdrlmadan nce nne - iareti konulmal. mov al,34h sub al,38h jnc devam neg al devam: aas or al,30h yukardaki kod paras sonu negatif olsa da pozitif olsa da, sonucun mutlak deerini doru bir ekilde ascii deere dntrr. Unutmayalm ki klavye bize ekran text moundayken daima ascii deerler verecektir, bu arpma ve blme ilemlerinde de problem oluturur. Klavyeden girilen deerlere sanki 30 eklenmi gibi geleceinden arpma ileminin sonucu

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

girilen deerde bir modifikasyon yapmadmz srece yanl hesaplarz. Bu tr modifikasyonlar yapmak iin baka mantksal komutlara ihtiyacmz olacak, bu yzden bu komutlar anlatmadan DAA, DAS, AAD ve AAM gibi komutlar aklamak istemiyorum. 80x86 KOMUT SET (Blm 4) Mantksal (logical) komutlar AND, OR, XOR ve NOT adyla bilinen ve matematiksel hesaplamalarda ok kullanlan komutlardr. AND komutu Yap olarak AND (VE) mant 1 ve 0lar ile ifade edilirse; 1 1 0 0 ve ve ve ve 1 0 1 0 = = = = 1 0 0 0

sonularn retir. Bu komutu assembly programclar genelde maskeleme ilerinde kullanrlar. rnein 1 bytelk deerin 7, 6, 5, ve 4. bitlerini gz ard etmek iin aadaki gibi bir program paras yazlabilir. mov al, A5h and al, 0Fh bu ilemlerden sonra ALin yksek deerli 4 biti (nibble) sfrlanacaktr yani AL binary olarak ifade edersek 0000 0101 olacaktr. Buna dk deerlikli 4 bite dokunmadan dier bitleri sfrlamakta denilebilir. Bu komutu elektronikiler ok kullanrlar, mesela paralel porttan alnacak olan verinin sadece 5 bitini kontrol etmek iin; mov dx,378h ; paralel port adresi in al, dx ; bu adresten bilgiyi al and al, 0010 0000b ; 5. biti kontrol et (maskele) jnz devam ; 5. bit 1 ise "devam" a dallan . . . . devam: . ;devam komutlar . Diyelim ki ALye IN komutu ile alnan byte 1011 0001 olsun, bu durumda; 1011 0001 0010 0000 v __________ 0010 0000

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

yukardaki ilem yaplr ve AND komutu bayrak kaydedicisinin Z bitini 0 olarak kurar, nk sonu 0dan farkldr. te burada maske olarak sadece 5. biti 1 olan bir byte seilmitir. Not: Windows XP altnda paralel porta dorudan eriim iletim sisteminin kerneli tarafndan engellendiinden bu program windows XP ncesi iletim sistemlerinde altrabilirsiniz. IN ve OUT komutlarnn kullanm sonraki makalelerin konusudur. AND komutunun kullanm formatlar; and and and and and and and OR komutu Mantksal veya ilemini gerekletirir, 1 1 0 0 | | | | 1 0 1 0 = = = = 1 1 1 0 hedef, kaynak reg, reg mem, reg reg, mem reg, imm mem, imm eax/ax/al, imm ;hedef := hedef & kaynak

doruluk tablosu yukardaki gibidir. Kullanm formatlar AND komutundaki gibidir. XOR komutu XOR olmadan ifreleme ilemleri sanrm ok zor yaplrd. ok fazla kullanm alan olmakla beraber veri paketleme ve ifreleme ilemleri iin hayat kurtarc bir komuttur. eXclusiveOR (zel veya) kelimesinin ksaltmasdr. Doruluk tablosu; 1 1 0 0 ^ ^ ^ ^ 1 0 1 0 = = = = 0 1 1 0

Ben genelde rencilerime bu komutun yapt ii anlatrken "aynlarda 0 farkllarda 1" sonucunu veren mantksal ifade derim. XOR komutu ile ifreleme ve paketleme ilemleri iin rnekler u anda belki de sizin iin biraz ar kaabilir, bunun yerine swap (yer deitirme) ve kaydedici sfrlama rneklerini XOR komutunu ile neler yaplabildiine rnek tekil edeceini dnyorum. xor ax,ax ; ax=0 olur ve "mov ax,0" dan kat kat hzl alr

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

;AX = 1234h ve BX=9876h olsun xor xor xor ax, bx bx, ax ax, bx

; bu 3 komut sonrasnda AX = 9876h ve BX = 1234h olur. XOR komutunun kullanm formatlar AND ve OR komutlarnnkiyle ayndr. Bayraklarn Durumu Yukarda anlattm bu komut bayrak kaydedicisini aadaki gibi etkiler; Carry bayran 0 yaparlar, Overflow bayran 0 yaparlar Zero bayran ayet sonu 0 ise 1 yaparlar ve aksi durumlarda bu bayra 0 yaparlar En Yksek deerlikli biti Sign bayrana kopyalarlar Parity bayran (sonutaki 1lerin says ift ise) 1 yaparlar Auxiliary carry (Ara Elde) bayrann durumunu deitirirler. NOT komutu NOT komutu operandnn mantksal tersini alr. Kullanm formatlar aadaki gibidir; not reg not mem ; BL kaydedicisinin deeri 15h olsun; not bl ;bl = 0001 0101b iken bu komuttan sonra 1110 1010b olur. NOT komutu hibir bayra etkilemez. imdi Uygulama Zaman Bu makalemde sizlere rnek tekil etmesi iin konsol ekranndaki grnty (tm yazlar) nce karma kark bir hale getiren daha sonrada tekrar orijinal haline eviren bir program anlatmay dnyorum. ncelikle Windowsun cmd.exe yada komut istemi ile alan pencerenin grntsnn aslnda B800:0000 adresinin bir yansmas olduunu hatrlatmak isterim. Debug ile bu alana gz atalm.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 1 - Aslnda ekran yansmas da hafzadaki bytelardan ibarettir.

Konsol penceresi alnca ayet iletim sisteminiz Windows XP ise "Microsoft Windows XP....." ile balayan bir yaz grlr. Debug altrp b800:0000 adresini ekrana dktmzde bu yaz hala ayn yerindedir. B800h segmenti de burada grnen yaznn bulunduu text video alandr. ekilde B800:0000 adresindeki 4Dh deerinin aslnda M harfi olduunu ve C karakterininde yine ayn segmentte bir deer olduunu gryorsunuz. Yukardaki resimdeki hafza dkm, en st satrn tamamn ve sonraki satrn yarsndan biraz fazlasn gzler nne seriyor. Hafza dkmnde tek numaral her offsette (0001h,0003h,00F3h gibi) 07h deerini gryorsunuz. Bu text mode zellii olup siyah zemin zerine beyaz yaz anlamna gelir. Gerektende ekrandaki karakterlerin hepsi beyaz ve zemin siyah deil mi? Konsol ekrannn tamam karakterlerle dolsa, ekranda ka karakter grrz? Tabi ki 80x25=2000 adet. imdi bu karakterlerin tek tek adreslerine eriip (zellik ieren 07h bytelarn atlayarak) bunlar lojik bir ilemden geirsem ekrann o anki grnts deiir, hem de bizim bo olarak tabir ettiimiz ama aslnda 20h olan yerler bile. Byle bir durumda ekranda karman orman anlalmaz bir grntnn belirmesi olas bir durumdur. Peki deitirdiim her byte tekrar eski haline getirebilir miyim? Btn bunlarn cevab aadaki programda sakl.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 2 - 80x25 text mode da grnen ekrana mdahele.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 3 - Program altrlmadan nceki durum.

ekil 4 - Ekrandaki yazlara ne oldu byle?

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 5 - Klavyeden bir tua basldnda grnt tekrar normale dner.

Aslnda video ilemleri iin daha pratik interruptlar mevcuttur, burada anlatmaya altm, "ayet assembly dili ile hafzann her yerine eriebilecek deneyime sahipseniz yapamayacanz ey yoktur" gereiydi. Bu programda zellikte, text video alannn segment adresini DS kaydedicisine ykleniini ve bu alann kaydedici dolayl (register indirect) adresleme modu ile sanki kendi tanmladmz bir data alan gibi kullanln incelemenizi tavsiye ederim 80x86 String Komutlar (Blm 4) eitli bilgilerin birleerek biraya gelmelerine string denir. Merhaba kelimesi bir stringdir. ASSEMBLYde stringleri kontrol edebilen komutlar vardr ve bu komutlar hafza bloklar zerinde alrlar. Bu makalemizde 80 X 86 ailesinde kullanlan string komutlarn (MOVS, CMPS, LODS, SCAS, STOS ) incelemeye alacaz, komutlarmz byte, word ve double word dizileri zerinde ilemler gerekletirmek iin kullanlmaktadr. Aada ilgili komutlar ve kullanm ekillerini tablo halinde grebilirsiniz.

Komut Kullanm ekli MOVS movsb,movsw,movsd CMPS cmpsb,cmpsw,cmpsd SCAS scasb,scasw,scasd STOS stosb,stosw,stosd LODS lodsb,kodsw,lodsd

String komutlarn ile ilem yaparken, Indis registerleri olarak adlandrlan SI ve DI registerlerinden, bellekteki bir bilgiyi bir adresten baka bir adrese tarken kullanyoruz. SI registerine tanacak bilgi dizisinin balang adresini, DI registerine de diziyi tamak istediimiz bellein balang adresini yerletirerek

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

yapmak istediimiz ilemi gerekletirebiliriz. Indis registerlerinin program ieirisinde kullanm eklini gsteren rneimizi inceleyebilirsiniz. Byte1 db a Byte2 db * Movs Byte2,Byte1 Lea di,Byte2 koy Lea si,Byte1 koy ;byte1 iin ayrlan alana a deerini koy ;byte2 iin ayrlan alana * deerini koy ;byte2 bilgi dizisini, byte1 bilgi dizisine kopyala ;tamak istediimiz bellein balang adresi di registerine ;tanacak bilgi dizisinin balang adresini si registerine

Movsb ;si registerinde bulunan byte dizisini di registeri ile gsterilen adrese byte olarak ta

String ilemlerinde kullanlan komutlar daha detayl incelemeye balayalm; MOVS Komutu: movs komutunun kulland veri tipine gre farkl kullanm ekilleri vardr, data segmentinde ve ofset adresi SI rejisterinde bulunan byte / word / double word dizilerini ES ve DI registerleri ile gsterilen adrese tar. CX registerinde tutulan deger adedince tama ilemi tekrarlanr.movsb ile byte dizileri, movsw ile word dizileri ve movsd ile double word dizileri zerinde ilemler yaplr. REP: kendisinden sonra gelen string komutunun cx registerinin deeri 0 olana dek tekrarlar.

Komut

Anlam

lem side bulunan byte dizisini, cx registerinde tutulan deer adedince di registerine ta side bulunan word dizisini, cx registerinde tutulan deer adedince di registerine ta side bulunan double word dizisini, cx registerinde tutulan deer adedince di

movsb

byte dizisi ta

movsw

word dizisi ta

movsd

double dizisi olarak ta

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

registerine ta CMPS Komutu: REPE, REPZ, REPNE ve REPNZ komutlarnn parametresi olarak bellekteki iki stringi birbirleriyle karlatrma ileminde kullanlr. Stringlerden biri Data Segmentte dieri ise Extra Segmentte tutulur. Data Segmentindeki stringin ofset adresi SI registerine, Extra segmentteki stringin ofset adresi ise DI registerine yerletirilir. Cx registerindeki deer adadince karlatrma ilemi tekrarlanr. Not:REPE: eit oduu zaman tekrarla REPZ: zero flag 0 oldugu zaman tekrarla REPNE: eit olmad zaman tekrarla REPNZ: zero flag 0 olmadg zaman tekrarla

Komut

Anlam

lem data segmentte ve extra segmentte tutulan byte dizisini, cx registeri adedince karlatr data segmentte ve extra segmentte tutulan word dizisini, cx registeri adedince karlatr data segmentte ve extra segmentte tutulan double word dizisini, cx registeri adedince karlatr

cmpsb

byte dizisi karlatr

cmpsw

word dizisi karlatr

cmpsd

double word dizisi karlatr

LODS Komutu: Lods komutu string komutlar iinde tektir. Komut ncesinde herhangi bir komut kullanmaya gerek yoktur. Ofset adresi DS:SI rejisterinde bulunan byte / word / double word dizilerini al, ax, eax registerlerine, si registerinin deerini

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

arttrarak veya azaltarak kopyalar.

Komut

Anlam

lem ofset adresi ds:si registerinde bulunan byte dizisini, si registerinin deerini arttrarak, al registerine ta ofset adresi ds:si registerinde bulunan word dizisini, si registerinin deerini arttrarak, ax registerine ta ofset adresi ds:si registerinde bulunan double word dizisini, si registerinin deerini arttrarak, eax registerine ta

lodsb

byte dizisi kopyala

lodsw

word dizisi kopyala

lodsd

double word dizisi kopyala

SCAS Komutu: Ofset adresi DS:SI rejisterinde bulunan byte / word / double word dizileri ierisindeki deerle al, ax, eax registerlerindeki deerleri karlatrarak arama yapmak iin kullanlr. Scas komutu AF, Cf, OF, PF, SF ve ZF bayraklarn ayarlarak arama ilemini gerekletirir.

Komut

Anlam

lem

scasb

ofset adresi ds:si registerinde bulunan byte dizisi byte dizisi ierisinde ara ierisindeki deerle, al registerindeki deeri karlatrarak arama yap

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

scasw

word dizisi ierisinde ara

ofset adresi ds:si registerinde bulunan word dizisi ierisindeki deerle, ax registerindeki deeri karlatrarak arama yap ofset adresi ds:si registerinde bulunan double word dizisi ierisindeki deerle, eax registerindeki deeri karlatrarak arama yap

scasd

double word dizisi ierisinde ara

STOS Komutu: Stos komutu es:di ile gsterilen adreste bulunan akmlator ierisinde belirtilen deeri saklar. Bu ilemden sonra yn bayrann durumuna gre ilemci di registerini arttrr veya azaltr. Stos komutu byte, word yada double word zerinde ilemler yapmak iin uygundur.

Komut

Anlam

lem es:di ile gsterilen adresteki al registerinde, istenilen byte dizisi saklanr es:di ile gsterilen adresteki ax registerinde, istenilen word dizisi saklanr es:di ile gsterilen adresteki eax registerinde,

stosb

al ierisinde byte dizisi sakla

stosw

ax ierisinde word dizisi sakla

stosd

eax ierisinde double word dizisi sakla

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

istenilen double word dizisi saklanr

ekil 1 - Programn Ekran Grnts.

rneimizde, kelime ierisindeki kk harfler byk harflere dntrlecek. Dntrme ileminde kucuk harf olup olmadn anlamak iin a = ASCII 61h oldugu iin bu deer ile karlatrma yapacaz. Eer harf bu deerden buyuk ise kk harf olduunu anlayacaz ve harfi buyue evirmek iin 20h deerini karacaz. Harf deerimizden kkse byk harf olduuna karar vereceiz ve karma ilemi yapmayacaz. Dntrme ileminden sonra program terk edeceiz. Programn ekran ktsndan da grdnz gibi klavyeden ilk harf grubunun tamam kk harf ikinci harf grubunun bir eleman ise byk harf olarak girilmitir. Sonuta enter tuuyla harf girii tamamlanp sonu deeri elde edilmitir. Umarm string komutlarnn kullanm konusunda faydal olur.

.model small .stack 64 .data snc db 10,13, ,$,10,13 .code mov mov mov ax,@data ds,ax es,ax ; sonuc iin ayrlan alan

dizi_al: mov ah,01 int 21h cmp jz inc cmp jg jl degis: sub sbt: al,13 yaz si al,61h degis sbt

;klavyeden karakter isteniyor ;girilen alde ;aldeki deeri enter ile karlatr ;entere baslmsa yaza atla ;si ile kelime iinde bir sonraki karaktere ilerle ;al iindeki deerle a=61h karlatr ;girilen deerden buyukse degise atla ;girilen deerden kucukse sbte atla

al,20h

;al deerinden 20h kar

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

sub mov yukle jmp yaz: mov lea int

al,0h [snc+si],al

;al deerinden 0h kar ;kelime ierisinde sradaki harfe son al deerini

dizi_al

;dizi balangcna atla

ah,09h dx,snc 21h

;ekrana sncde tutulan deer yazlyor

dosa: mov ah,4ch int 21h end

;program terket

Aslnda string komutlar ile yaplan ilemler bilgisayar kullanclarna o kadar yakn ki, mesela msword uygulamalarnda kullanlan kopyala-yaptr gibi. Yorumlarnz bekliyorum. Bu makalede stack (yn) hafza blgesini anlatmaya alacam. Stack memory geici deerlerin sakland bir hafza alandr. Mikroilemci SS:SP kaydedicileri ile bu hafza alanna eriir. SS stack alannn segment adresini tutarken SP bu alandaki offsetleri iaret eder. Stack hafza alann kullanmama diye bir lksmz yok, bu makaleye kadar stack memory ile ilgili hi bir komut yazmasakta, bu hafza alann yadmz tm programlar kulland. Bununla beraber stack memoryyi kendi isteklerimiz dorultusunda da kullanabiliriz. Bunun iin bir ok komut mevcuttur. PUSH, POP, CALL, RET bunlardan bazlar ve bu makalede anlatlacaklar arasndadr. LIFO Mikroilemci stack memoryyi dier hafza alanlarn adreslerken kulland yntemden biraz daha farkl adresler. ncelikle stack hafza alanna yklenen bilgiler LIFO (Last In First Out) yani ilk giren son kar yada ilk yklenen bilgi en son alnr dzenine gre sralanrlar.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 1 - Stack (Yn) hafza.

Yukardaki ekilde krmz blou stack memory olarak dnebilirsiniz. BU alann bykln kod yazarken .stack talimat ile belirliyoruz, .stack 32, .stack 100h gibi. Geici verilerinizi saklamak iin ne kadar alana ihtiyacnz varsa o kadar stack tahsis edebilirsiniz. Yine yukardaki ekilde orijinal SP yn boken SP kaydedicisinin ald deerdir. Mesela .stack 32 diye direktif verdiyseniz SP=0020h gsterir. Yna veri itildike SPnin deeri azalr, bu deerler yndan ekildike SP artar. x86 mimarisinde yn hafzaya 16 bitlik alma modunda 16 bitlik deerler, 32 bitlik alma modunda ise 32 bitlik deerler saklayabilirsiniz. PUSH ve POP komutlar Stack memoryde verilerinizi saklamak iin kullanlan komutlardr. Stackta saklanan veriler veya adres bilgileri iin genelde "stacka itilen" kelimeleri kullanlr. Stacktan geri alnan veriler iinse "stacktan ekilen" kelimesi kullanlr. zetle PUSH komutu stacka bir veriyi itmek iin, POP ise verileri ekmek iin kullanlr. Yn hafza alann etkileyen komutlarn genel kullanm formatlar aadaki gibidir; push pop push pop push pop push pop push pusha popa reg16 reg16 reg32 reg32 segreg segreg mem mem imm

(**) (**) (CS hari)

(*) (*) (*)

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

pushad popad pushf popf pushfd popfd

(**) (**)

(**) (**)

(*)- Sadece 80286 ve sonras ilemcilerde. (**)- Sadece 80386 ve sonras ilemcilerde. En ok kullanlan komutlar PUSH ve POP komutlardr. PUSHA ve PUSHAD tm kaydedicileri ynda saklamak amacyla kullanlr, POPA ve POPAD ise saklanan bu kaydedicileri geri almak iin kullanlr. PUSHF, PUSHFD bayrak kaydedicisini saklamak POPF ve POPFD ise bunlar geri almak iin kullanlr. Peki neden kaydedicilerin ieriini saklamak durumunda kalalm? Programclarn programlarn dz mantkla yazmadn biliyorsunuz, modler programlama teknikleri kullanlmazsa 30-40 satrdan sonra kaynak kod anlalmaz hale gelir. Gnmzdeki programlar onbinlerce hatta milyonlarca komut satrndan meydana geliyor. Bunun iin program paralara ayrmak, modller hazrlamak art. Yksek dzeyli programlama dillerinde kullanlan, snf, fonksiyon gibi kavramlar hep bu ama iin tretilmitir. Assembly dilinde CALL ve RET komutlarda bunu amalar. Hatta C dilinde ve birok programlama dilinde fonksiyon armlarnn assembly dilindeki tam karl CALL komutudur. ster assembly dilinde call komutunu kullann isterseniz C dilinde bir fonksiyonu arn, dallanma ilemi gereklemeden nce geici parametreler stackta saklanr. CALL ve RET Komutlar Bu komutlar anlatmadan nce assembly dilinde prosedr (procedure) mantn kavramanz lazm. Bir rnekle prosedrleri anlayalm.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 2 - Prosedrler kullanlarak yaplm bir kaynak kod..

Kaynak kodu buradan indirebilirsiniz. Bu program bir nceki makaledeki string komutlarna rnek olmakla beraber biz burada sadeve CALL ve RET komutlarn inceleyeceiz. Program altnda komut isteminden bir yaznn girilmesini ister, ayet yazy oluturan karakterler byk harfli ise bunlar kk harfe dntrr. Programda tane prosedr bulunmakta ve ana prosedre baktnzda klasik kodlar olan segment ayarlama ve dosa dnn dnda sadece CALL komutlarn gryorsunuz. Ana prosedrden 3 kere alt prosedrlere dallanma gerekleiyor. Her dallanma srasnda geri dn adresi ynda saklanr. Alt

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

prosedrlerden dnerkende ret komutu ile bu adres geri yklenir. ayet dallanma bir baka segmente taplyorsa CS ve IP, buradaki gibi ayn segment iindeyse sadece IP yani offset adresi ynda saklanr. Offset ve segment adreslerinin 2 byte olduunu dnecek olursanz bunun stackn yapsnada uygun olduunu anlarsnz. Yn hafza yada stackn kullanlmad bir program yok gibidir. Tm kesmeler (bunlarda bir eit alt prosedr gibi dnle bilir) arlmadan nce, o anki CS ve IP ayrca tm kaydediciler ynda saklanmak zorundadr. Aksi halde geri dn yapldnda alt prosedrn deitirdii kaydediciler ile karlalr, hatta bu bile mmkn olmaz nk mevcut CS ve IP saklanmadan geri dn sz konusu deildir. Satrlar yn hafzay anlatmakta biraz yetersiz kalyor olabilir, bu konuyu anlamam olabilirsiniz diye sizlere birde video hazrladm. Yukardaki programn rnek alnd videoyu buradan download edip izlediinizde sanrm problem zlecek :) unlar hatrlamakta fayda var; 1- Programlar genelde 3 adet hafza alanndan oluur, bunlar code, data ve stack tr. 2- CPU bu alanlara adresleme yaparak eriir, 3- CPU CS ve IP kaydedicilerini kodlara eriip onlar ilemek iin, 4- DS, SI ve DIy deikenlere datalara erimek iin, 5- SS, SP ve BPyi yn hafza alanna erimek ve biimlendirmek iin kullanlr. rnek programmzdaki ana prosedr dndada CALL komutunu kullanabilirsiniz, alt prosedrleri istediiniz kadar arabilirsiniz. Fakat bir prosedr iinden kendini arrken dikkatli olmalsnz, yazacanz kodlarla programn sonsuz dngye girmesini engellemezseniz, "memory overflow" hatasndan nce "stack overflow" hatasn alrsnz.

AAM ve AAD Komutu: AAM komutu, arpma ilemi sonucunda, AX registerinde oluan deeri ASCII formata dntrme amal kullanlr. Daha nce anlatlan AAA ve AAS komutlarnda olduu gibi AAM ve AAD komutlarda operandsz yazlrlar. AH ve AL registerlerini gizli operand olarak kulanmaktadrlar. AAM komutu, arpma ilemi ile ax registerinde oluan deerin ardndan kullanlr. Alnin deerini desimal 10 ile bler, elde edilen deeri aha aktarr. Blmden kalan deeride tekrar alye aktarr.Yaplan ilemin sonucunda, elde edilen saynn sol dijiti ahda, sa dijiti ise alde yer alr.AAM komutu, parity, sign ve zero flaglarn alye aktard deere gre uygun ekilde etkiler. rneimizde mul komutu, arpm sonucu olan 00 51 deerini ax registerine aktarrken, aam komutuda bu deeri 00 81 olarak ASCII formatna dntrmtr. mov al,09 mov bl,09 mul bl aam ;alnin deeri 9 ;blnin deeri 9 ;ax = 00 51h ;ax = 08 01h

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

51h = 0101 I. adm 0001b al registerinin _________________ deerini = 08h 0Aha bl 0Ah = 0000 0Ah=d10 1010b II.adm blmn sonu deerini aha , kalan alye aktar III.adm Sonu

ah = 08h al = 01h

ax = 0801h

AAD komutu ise blme ileminde blnenin sonucunda, AX registerinde oluan deeri ASCII formata dntrme amal kullanlr.AAD komutu, blnen deerin yksek seviyeli ksmn (ah registerinin ieriini) desimal 10 ile arpar ve al (dk seviyeli ksm) ile toplayarak al ierisine aktarr. Yaplan ilem sonucunda ah registeri sfrlanr, al registerinde bulunan BCD says, baka bir BCD says ile blnebilir duruma getirilmi olur. AAD komutu, parity, sign ve zero flaglarn alye aktard deere gre uygun ekilde etkiler.

rneimizde desimal 35 says, desimal 5e blnmekte ve sonu yine desimal olarak elde edilmektedir. AAD komutunu kullanarak, ax zerine paketlenmemi olarak aktarlan sayy, blme ilemi iin uygun hale getiriyoruz. mov ax, 0305 ;ax = 03 05 aad ;ax = 00 23 mov bl,05 ; blye al deerini koy div bl ;ax = 00 07 I. adm 03h = 0000 0011b ah 0Ah = 0000 1010b registerinin *_________________ ieriini 1Eh = 0001 1110b 0Ah ile arp 0Ah=d10 II.adm arpm 1Eh = 0001 1110b sonucundaki 05h = 0000 0101b deere +_________________ alnin 23h = 0010 0011b deerini ekle ve alye yaz III.adm Sonu 23h = 0010 0011b _________________ =7 05h = 0000 0101b

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

DAA ve DAS komutu: DAA komutu ile yaplan toplama ilemi sonucunda her bir byteda iki adet desimal dijit bulunur. ADD komutunun arkasndan kullanlan DAA komutu, alnin ierii olan deere ve AF (auxilary flag) ile CF (carry flag)nin durumuna bal olarak iki farkl ekilde ileme sokulur. I. Durum: al registerinin dk seviyeli 4 biti 9dan byk veya AF set ise, al registeri 6 ile toplanarak, AF set edilir. II.Durum: al registerinin yksek seviyeli 4 biti 9dan byk veya CF set ise, al registeri ile 60h toplanarak CF set edilir. rneimizde 9 ve 5 deerlerini toplayarak komutumuzla istenilen sonucu elde edeceiz. mov al,09 ; al = 9 add al,05 ; al = 0E daa ; al =14

I. adm 09h = 0000 1001b al 05h = 0000 1001b registerlerini +__________________ topla 0Eh = 0000 1110b II.adm al registerinin dk 0Eh = 0000 1110b seviyeli biti 06h = 0000 0110b 0dan kk olduu iin 6 +_________________ deerini 14h = 0001 0100b ekledik ve sonu deere ulatk

DAS komutu ile yaplan kartma ileminin al registeri zerindeki sonucuna ve auxuiliary ile carry flaglarnn durumuna bal olarak iki farkl ekilde kullanlr. I. Durum: al registerinin dk seviyeli 4 biti 9dan byk veya AF set ise, al registerinden 6 kartlarak, AF set edilir. II.Durum: al registerinin yksek seviyeli 4 biti 9dan byk veya CF set ise, al registerinden 60h kartlarak CF set edilir. DAS komutu, auxiliary, carry, parity, sign ve zero flaglarn etkiler. rneimizde, desimal 13 den 5 i kartma ilemini al registerinde yaptmz iin sonu 0E oluyor. al registerindeki deerin desimal say olmas iin kartma komutunun ardndan DAS dzenleyici komutu kullanlyor. mov al,13 ;al=13h mov bl,05 ;bl=05h sub al,bl ;al = 0Eh das ;al = 08

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

I. adm 13h = 0001 0011b al 05h = 0000 1001b registerindeki deerden bl __________________ registerindeki 0Eh = 0000 1110b deeri kart II.adm al registerinin 0Eh = 0000 1110b dk seviyeli biti 06h = 0000 0110b 0dan kk olduu iin 6 __________________ 08h = 0000 1000b deerini kardk ve sonu deere ulatk CBW ve CWD Komutu: CBW:Byten worde evrilmesi. CWD:Wordun double worde evrilmesi Aritmetik ilemler srasnda operandlar farkl uzunluklara (byte,word veya double word) sahip olabilirler. Bu gibi durumlarda, ilem ncesinde operandlarn uzunluklarnn dzenlenmesi gerekir.Kk uzunlua sahip operandn uzunluunu, byk uzunlua sahip operandn uzunluuna denkletirilmektedir.aretsiz saylarla temsil edilen operandlar, rahat bir ekilde dzenlenir. Fakat iaretli saylarla temsil edilen operandlarda deiim o kadar rahat olmamaktadr. aretli saylar ieren operandlarn uzunluklarnn dzenlenmesi iin CBW ve CWD komutlar gelitirilmitir. CBW komutu al ve ah, CWD komutu ise ax ve dxi gizli operand olarak kullanrlar. CBW komutu, al ierisindeki iaretli saynn iaret bitini ahn tm bitlerine, CWD komutu da ax iindeki saynn iaret bitinin deerini dxin tm bitlerine aktararak sonuca ulamamz salar.

TEST Komutu: Test komutunun alma prensibi ve flaglar etkileme biimide dahil olmak zere And ile ayndr. Farkl olarak, komut ile birlikte kullanlan operandlarn deerlerini deitirmez. Dier lojik komutlarnda olduu gibi, carry, owerflow bayraklar test ileminin sonrasnda reset edilirler, auxiliary dndaki dier bayraklarda ilem sonucuna uygun ekilde etkileneceklerdir. Fark olmamasna ramen, hangi durumda and, hangi durumda test komutunu kullanmalyz sorusu aklmza gelecektir. rneimizi inceleyelim; and al,01

I. Durum

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

jz * ... ... test al,01 jz * ... ...

II.Durum

I. ve II. Durumda, al registerinin deeri desimal 1 ile karlatrlmaktadr; al registerindeki deer desimal 1e eit ise I.Durumda: alnin deeri korunacak ve zero bayrann reset durumuna gelmesine sebeb olacak, bu sayede jzyi izleyen komut ile program devam etmi olacaktr. Fakat deer 1den farkl ise sonu 0 olarak alye yerletirilecek ve zero bayra set edilecektir, sonucunda ise * yerine kullanlan adrese dallanlacak ve program bu adreste bulunan komut ile srecektir. Fakat alnin deeri 1e eit deil ve baka ilemler iin bize gerekli ise sorun kacaktr.Sonutan da anlald gibi, al registerinin karlatrma ncesi deeri, karlatrma sonras admlarda da gerekli ise test komutunu tercih etmeliyiz. SHR ve SHL Komutu: SHR Komutu ile, soldaki operandn en dk seviyeli biti carry bayrana kopyalanr ve operandn tm bitleri saa doru 1er bit kayar. En soldaki bitin deeri 0 yaplr. Bu ilem SHR ile verilen ikinci operandn deeri kadar tekrarlanr. rneimizde, 30h deerini iki kere 1er biti saa kaydrarak sonucun nasl deitiini inceleyeceiz. mov al,30h shr al,01 shr al,01 ;al=30h ;al=18h ;al=0Ch

ekil 1 - Shr komutu ile bitlerin saa kaydrlmas

Admlar

Hexadesimal Binary

Desimal CF -

I. adm: alye 30h al=30h deerini koy II.adm: deerleri 1 bit saa al=18h kaydr, en dk seviyeli biti

00110000 48

00011000 24

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

CFna ta III.adm: deerleri 1 bit saa kaydr, al=0Ch en dk seviyeli biti CFna ta

00001100 12

Programda da grld gibi her bir saa kaydrma ilemi ile sayy ikiye blmektedir.Her bir shr ilemi sonrasnda carry bayra 0 ise ift say, 1 ise tek saydr. SHL Komutu ile, soldaki operandn en yksek seviyeli biti carry bayrana kopyalanr ve operandn tm bitleri sola doru 1er bit kayar. En soldaki bitin deeri 0 yaplr. Bu ilem SHL ile verilen ikinci operandn deeri kadar tekrarlanr. rneimizde 0Ch deerini iki kere 1er bit sola kaydrarak sonu zerindeki deiiklikleri inceleyeceiz. mov al,0Ch shr al,01 shr al,01 ;al=0Ch ;al=18h ;al=30h

ekil 2 - Shl komutu ile bitlerin sola kaydrlmas

Admlar

Hexadesimal Binary

Desimal CF -

I. adm: alye 0Ch al=0Ch deerini koy II.adm: deerleri 1 bit sola kaydr, al=18h en yksek seviyeli biti CFna ta III.adm: deerleri al=0Ch 1 bit

00001100 12

00011000 24

00110000 48

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

sola kaydr, en yksek seviyeli biti CFna ta Programda da grld gibi her bir sola kaydrma ilemi ile sayy iki ile arpm oluyoruz. RCR ve RCL Komutu: RCR Komutu, ileme tabi tutulan bitlerin herbirini bir pozisyon saa kaydrr. Dk seviyeli bit pozisyonundaki deer carry bayrana, carry bayrann deeride yksek seviyeli bit pozisyonuna aktarlr. lem ikinci operand deeri kadar tekrarlanr.

ekil 3 - Rcr komutu ile bitlerin saa kaydrlmas

RCL Komutu, ileme tabi tutulan bitlerin herbirini bir pozisyon sola kaydrr. Carry flann deeri dk seviyeli bit pozisyonuna, yksek seviyeli bit pozisyonundaki deer ise carry flana aktarlr. lem ikinci operand deeri kadar tekrarlanr.

ekil 4 - Rcl komutu ile bitlerin sola kaydrlmas

ekil 5 - Programn ekran grnts

Bu blmde anlattmz aam,das,shr ve rcl komutlarn kullanarak rnek bir program hazrladm. aam komutu kullanlan prosedrde shr komutunu ileme katmak istediimiz al registerinin ieriini bir bit saa kaydrmak iin, das ile ilgili prosedrde ise rcl komutuyla al registerinin ieriini bir bit sola kaydrdm.

.model small .stack 64 .data aamsonuc db 00$,10,13 dassonuc db 00$

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

knm db 10,13,$ ;.................................................... .code mov ax,@data mov ds,ax mov es,ax call aamornek call dasornek ;.................................................... aamornek proc mov al,12h shr al,01 al=9h mov bl,9h mul bl aam add ax,3030h mov byte ptr [aamsonuc],ah mov byte ptr [aamsonuc+1],al yerletir. mov ah,09h lea dx,aamsonuc int 21h mov ah,09h lea dx,knm int 21h aamornek endp ;.................................................... dasornek proc mov al,28h rcr al,01 al=14h mov bl,05h sub al,bl das add al,30h mov ah,02h mov dl,al int 21h

;al registerinin ieriini bir bit saa kaydr,

;bl=9h ;ax=51h ;ax=81h ;al ve ah deerlerini ascii karakterlere evir.

;ax registerini sonuc dizisi ierisine

;sonucu yaz

;alt satra ge

;al registerinin ieriini bir bit sola kaydr,

;bl=5h ;al=Fh ;al=9h ;al deerini ascii karaktere evir.

;sonucu yaz

dasornek endp ;....................................................

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

mov ah,4ch int 21h ;programdan k end ;.................................................... Programmz, anlatlan komutlarn salamas olarak da deerlendirilebilir. Ben kodu altrdm ve grdm ki kullandm komutlar iini baaryla gerekletiriyor. Makalemizde aritmetik lojik komutlarn alma ekillerini, bayraklar zerindeki etkilerini anlatmaya altm. Benzer zelliklere sahip komutlarn kullanlmas sizlerin tercihine kalm, gerekletireceiniz uygulamalar ve elde etmek istediiniz performans dorultusunda ihtiyacnza en uygun olan belirleyebilirsiniz.

Assembly kodlarmz farkl programlama dilleri ierisinde de kullanabiliriz. Daha nce anlatlan makalelerde DOSta DEBUG ve TASM kullandk. Bu blmde ise, anlatacamz kodlar pascal ve c++ builder ierisinde kullanacaz. Sadece assembly komutlarn kullanarak programlar gelitirmek kodlar iin kullanlan satr says arttktan sonra zor olmaya baladndan farkl programlama dilleri ierisinde assembly kodlarn alt programlar olarak yazmak daha avantajl bir yol olur. Bu sayede temelden bize ait olan alma mantn bildiimiz istediimiz zelliklere sahip fonksiyonlar gelitirme frsatmz oluruz.

ekil 1de Turbo Pascal ierisindeki ASM....END; bloklar arasnda, ekil 2de C++ Builder 6.0 ierisindeki asm{...} bloklar arasnda tasmda olduu ekliyle kodlarmz yerletirebiliyoruz.

Turbo Pascal 7.0 ierisinde assembly kodlarnn yerletirildii bloun yaps;


_____________________________________________________________________________________ _______________________

ekil 1: Pascal ierisindeki assembly blm _____________________________________________________________________________________ _______________________

C++ Builder 6.0 ierisinde assembly kodlarnn yerletirildii bloun yaps;


_____________________________________________________________________________________ _______________________

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 2: C ++ Builder iersindeki assembly blm _____________________________________________________________________________________ _______________________

ekil 1 ve 2deki assembly bloklar ierisinde, iki saynn toplanmas ileminin nasl gerekletiine bakalm: Turbo Pascal 7.0da ASM...END; ve C++ Builder 6.0da ASM{...} bloklar arasnda, komut satrndan girilen deerler MOV komutu ile AL registerine aktarldktan sonra ADD komutuyla toplama ilemini gerekletirip TOPLAM deikenine AL registerinin son deeri olarak aktaryoruz, assembly blou dnda programlama dilinin fonksiyonlar ile sonucu grntlyoruz.

ekil 3: Turbo Pascal 7.0 ile assembly kod rnei

ekil 4: Turbo Pascal 7.0 Ekran Grnts

C++ Builder ierisinde kullanacamz assembly blou dndaki component ve fonksiyonlar inceleyelim. C ++ Builder Componentleri : Etiket (TLABEL): Form ierisinde bulunan Metin Kutusuna ne tr deer girileceini belirtmek iin kullanlmaktadr. Metin Kutusu (TEdit): Kullancnn bilgi girii yapmas ya da elde edilen sonucun grntlenmesi iin kullanlr.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

Komut Dmesi (TButton): Kullancn programda, gerekletirecei uygulamay balatan yada bitiren kontroldr. Assembly Blou dnda kullandmz C ++ Builder Fonksiyonlar: Fonksiyon Anlam Kullanm ekli

StrToInt

Metin olarak girilen StrToInt(Edit1deeri >Text); sayya dntrr. Say olarak girilmi IntToStr(Edit1deeri >Text); metine dntrr.

IntToStr

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 5: C ++ Builder ile assembly kod rnei

ekil 6: C ++ Builder 6.0 Ekran Grnts

C++ Builder 6.0 ile gerekletirdiimiz rnek kodu buradan , Turbo Pascal 7.0 ile gerekletirdiimiz rnek kodu buradan indirebilirsiniz. Makalemizde , assemblynin dier diller ierisinde nasl kullanlacan en basit haliyle anlatabilmek iin ksa kodlar kullandm, daha gelimi kodlar

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

gerekletirebilmeniz iin sizlere balang olmas asndan nemli. Uzak mesafeler katedebilmek iin kk admlar atmak gerekiyor. Admlar kk yol uzun, nemli olan hedefe ulamay istemek.Herkese iyi almalar... Makalemizde, 80X86 komut sistemine ait, CMPXCHG, CMPXCHG8B, SAL, SAR, SHLD, SHRD, ROL, ROR, BT, BTS, BTR, BTC, BSF, BSR aritmetik lojik komutlarn aklamaya devam edeceiz.

Mikroilemci iinde yaplan ilemlerin durumlarn programcya bildiren bir kaydedici mevcuttur. Tm karar alma mekanizmalar bu kaydedicide gsterilen sonular baz alnarak yaplr. LEMC DURUM KAYDEDCS (PROCESSOR STATUS REGISTER) Diyelim ki klavyeden girilen iki adet deiken var bunlar eit ise ekrana "eit" eit deilse "eit deil" yazdrmak istiyoruz. Bunu st seviye programlama dillerinde basit bir ekilde if-else mantyla yapabilirsiniz. Peki mikroilemci bu deerlerin eit olup olmadn nasl gsterecek bize. Cevab basit bu deerlerin farkn alarak, sonu sfrsa girilen deerler eittir aksi taktirde eit deildir. yi ama assembly programcs bu sonu sfr deerini nereden okuyacak? Bir ilemin sonucunun sfr, negatif, pozitif veya elde rettii veya ilemin gerekletirilmesi iin bor alnd gibi durumlar gsteren kaydediciye ilemci durum kaydedicisi diyoruz. Turbo debugger ile ilemci durum kaydedicisinin ieriini gzlemleyebilirsiniz.

ekil 1 - 8086da ilemci durum kaydedicisi.

ekilde krmz ereve iine alnm ksm ilemci durum kaydedicisini bitsel olarak gsteriyor. Dier kaydedicilerin aksine ilemci durum kaydedicisi programc iin bitsel olarak anlamldr. Ve bu bitlerin her birinin bir ad vardr. rnein C biti Carry yani tama biti veya Z biti Zero yani sfr bitidir. Terminolojide genellikle bu bitler "flag" yani bayrak olarak adlandrlr. Aslnda

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

assembly programclar ilemci durum kaydedicisi yerine bayrak kaydedicisi terimini daha ok kullanrlar. rnein Z iin Zero Flag yani sfr bayra denir. 8086, 80286, 80386, 80486 ve Pentium ilemcilerin bayrak kaydedicileri biraz farkldr, daha dorusu ilemciler gelitike ek bayraklar eklenmitir, mesela 80286dan itibaren iletim sistemlerinin yazm iin gerekli olan ayrcalkl mod bayra eklenmitir. Yukardaki ekilde 8086nn 8 bitlik bayrak kaydedicisini grmektesiniz, aadaki ekilde ise 8086dan 80486ya kadar olan ilemcilerin sahip olduu bayraklar grebilirsiniz.

ekil 2 - x86 ilemci durum (bayrak) kaydedicisi.

Bayrak kaydedicisindeki her bir bitin 1 olma durumuna SET, 0 olma durumuna da RESET denir. lemcinin rettii sonular hakknda programcy uyaran bayrak kaydedicisindeki durumlar grecelidir. rnein carry (tama) bayra 1 olduunda bazen ilemin elde rettiini bazen de bor alndn ifade edebilir. Bazen de iki bayran durumu birlikte deerlendirilerek baz sonulara varlr. rnein; MOV AX, 0FFFEh ; FFFE = 65534 iaretsiz sayy temsil ederse ADD AX, 3 ; C = 1, O = 0 olur ve bu bir boyut tamasn gsterir. Bu rnei biraz daha aklayacam fakat daha nce matematik dersinde grdmz baz olaylar hatrlatmak istiyorum. Hani bir fonksiyonun zm iin sorularda "her x gerel says iin" gibi ifadeler geer ya, ite bu tr kabullenmeler assembly dilinde ok nemlidir. nk 1 ve 0lar ancak bu

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekilde yorumlayabilirsiniz, yani batan evrensel kmenizi kafanzda tanmlamanz gerekir. Bu rnekte de FFFE=65534 deerini gsterirse diye balyoruz ie, nitekim FFFE iaretli say olarak kabul edilseydi -2 deerini gsterecekti. Ama burada iaretli deil sadece pozitif tamsaylarla ilem yapld varsaylyor. Bu ilemin sonucu AX kaydedicisinde 0001 olarak grlr. lemci saylarn iaretli veya iaretsiz olduuna bakmadan FFFE ye 3 ekler ve FFFE deeri nce FFFF sonra 0000 ve daha sonrada 0001 olur. Tabi ki 65534 + 3, ileminin sonucu 1e eit deildir. lemin doru sonucu olan 65537 deeri 2 bytelk AX kaydedicisinin iine smadndan bu sonu retilmitir. Bu toplama ilemi srecinde say FFFFden 0000a dnerken C=1 olur, bunu elde olarak dnebilirsiniz (tabi ki pozitif tamsaylar kmesi baz alnarak ilem yaplyorsa) Aslnda 0001 sonucunun bana bu elde getirildiinde yani sonu C biti ile birlikte okunursa 10001 olur ve bu gerektende 65537 deerine eittir. Fakat programc doal olarak AX kaydedicisini iindeki deeri yani 0001i sonu olarak alacaktr. Burada sonu anlaml aralk olan 0...65535 arasnda olduundan O=0 olmutur. zetle sonu anlaml aralkta yanl bir deerdir, bu durumu programc iki bayraa birden bakarak anlayabilir. Yukardaki gibi bir durumda programc ilem yapldktan sonra baz zel komutlarla C ve O (overflow-tama) bitlerinide kontrol eder ve bu bitler srasyla 1 ve 0 ise bir boyut tamas olmu demektir. Bu durumda programc kullanc ekranna "sonu ok byk" gibi bir mesaj gnderebilir. Hesap makinelerinin belli bir deere kadar ilem yapabildiini hatrlayn. Bu rnek iin en bata FFFE iaretli bir saydr deseydik herhangi bir tama sz konusu olmayacakt. lemci yine ayn sonucu retecek fakat bu sefer programc bunu -2+3 olarak deerlendireceinden sonu doal olarak 1 ve AXte 0001 deeri doru sonu olacakt. Yine C=1 ve O=0 olsa da programc iin bu durum bir tamay gstermeyecektir. te assembly programlama dili matematiin bu basit gibi grnen temellerine baldr. Hafzadaki 1 ve 0lar nasl yorumlarsanz yle ekil alrlar. Bazen bu 1 ve 0lar bir resim, bazen bir mp3 bazen de bir kelime oluveririler. Hani matrix filminde herkes kodlara bakyor ama sadece Neo olay idrak edebiliyordu ya, ite o misal :)

ekil 3 - bilgisayarlar aslnda 1ler ve 0lar dnyasdr.

8086 iin bayrak kaydedicisi 16 bitliktir ve bu 16 bitte sadece 9 adet bayrak mevcuttur. 386 ve sonras ilemcilerde ise bayrak kaydedicisi 32 bitliktir ve bu 32 bitin her biri bir bayra temsil etmez, aralarda hibir eyi ifade etmeyen bo bitler mevcuttur. u anda gerek mod programlar yani 8086 iin programlar yazdmzdan bu 9 adet bayran ne anlama geldiklerini incelememiz yeterlidir. Overflow Flag (OF) (Tama Bayra): aret tamas olduunda olduunda set (1) olur, mesela 1 bytelk iaretli saylarda 100+50=150dir, fakat sonu -

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

128...127 aralnda deildir. Direction Flag (DF) (Yn bayra): String ilemlerini yapan komutlar iin kullanlr. 1 olduunda index kaydedicisi otomatik olarak azalr. 0 ise index kaydedicisi otomatik olarak artar. (mesela bir string hafzann bir blgesinden baka bir blgeye kopyalanrken ilemin stringin sonundanm yoksa bandanm yaplacan D flag ile belirleyebilirsiniz) Interrupt-enable Flag (IF) (Kesme Yetki bayra): 1 olduunda maskelenebilir kesmeler kullanlabilir. (kesmeler hakknda ayrnt sonraki makalelerimizde!) Single-step Flag or Trace (TF) (Tek Adm veya zleme Bayra): Genelde debugger programlar iin kullanlr, 1 olduunda bir anda sadece 1 komut ilenir. Sign Flag (SF) (aret Bayra): MSB biti (en soldaki bit) 1 olduunda bu bayrakta 1 olur. Zero Flag (ZF) (Sfr Bayra): Sonu sfr olduunda 1 olur. Auxiliary carry Flag (AF) (Ara Elde Bayra): AL kaydedicisinin 0-3 arasndaki bitlerinde yaplan ilemde elde veya bor retilirse 1 olur. Parity Flag (PF) (Elik Bayra): 1 olduunda sonucun dk deerlikli baytndaki (mesela 127Fh gibi word boyutunda bir sonu retilmise bunun 7F ksm iin) 1lerin saysnn ift olduunu gsterir. Carry Flag (CF) (Tama Bayra): 1 olduunda elde retildiini veya bor alndn belirtir. Bayrak Kaydedicisini zetleyecek olursak, 1- lemcinin yapt ilemlerin zel durumlarn gsterirler 2- Baz ilemler yaplmadan nce baz bayraklarn 1 yada 0 yaplmas gerekebilir 3- Programclar baz ilemleri anlayabilmeleri iin bazen birden fazla bayran birlikte rettikleri durumlar gz nne almak zorundadrlar. Uzun bir sre bu bayraklardan OF, SF, ZF, CF olanlar bizim iin nemli olacak. Bayraklarn geri kalan ksmlar ve bayraklar etkilen komutlar sonraki makalelerimizde yeri geldike aklamaya alacam. sterseniz imdi bayrak kaydedicisi ve bayraklarla ilgili kafanzda daha belirgin bir eklin oluabilmesi iin makalemizin banda bahsettiimiz rnei hayata geirelim. imdi yapacamz programda kullanc klavyeden 2 adet deer girecek ve bu deerler eitse ekrana "Girilen Degerler Esittir" yazacak deilse "Girilen Degerler Esit Degildir" yazacak. lk bakta kullanc saylar bilmiyor mu kardeim ne gerek var byle bir programa diyebilirsiniz :) Fakat deerlerin klavyeden deilde paralel porttan alndn ve bu portun bir klimaya bal olduunu ve hava scaklnn 24C0 ye eit olup olmadn test eden ve eitse klimay durduran deilse altran bir programnda bundan pek farkl olmayacan tahmin edebilirsiniz. Bu rnekte henz ilemediimiz konulardan olan "ekran ve klavye ilemleri" ve

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

"artl dallanmalar" konularn kapsayan komutlar kullanacaz. Bunlarn ayrntlarn daha sonra anlatacamdan imdilik fazla nemsemeyin. Bu komutlar aadaki gibidir. Bu komutlardan sonra program kullanc giri yapana kadar durur ve kullanc klavyeden deer girdiinde o deerin ASCII kod karl AL kaydedicisine yerletirilir. Bu komut ile hedef adrese dallanma gerekletirilir. Bu komut ile hedef adrese Z bayra 1 ise dallanma gerekletirilir. Bu komut BL ile AL kaydedicisini karlatrr.

MOV AH,01 INT 21h JMP HedefAdres JE HedefAdres CMP BL, AL

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 4 - Klavyeden girilen deerleri test eden program.

Yukardaki programn kaynak kodlarn buradan download edin ve TASM ile

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

derleyin. Bu program altrdnzda sizden iki adet deer girmenizi isteyecek, deerleri girerken enter tuuna basmanza gerek yok. ayet girilen deerler eitse ekranda "Girilen Degerler Esittir" deilse "Girilen Degerler Esit Degildir" mesajn greceksiniz.

ekil 5 - Programn ekran kts.

Deerlerin eit olup olmama durumunu belirleyen ilemci durum kaydedicisinin Z biti (Z bayra) dir. Bu bayran durumu karlatrma komutundan sonra girilen deerlere gre 1 yada 0 olur. ayet girilen deerler eit ise, eit olan bu deerler karlatrlr ve sonu sfr elde edilir, bu durumda Z=1 olur. JE komutu ise ancak Z=1 olduunda, operandnda belirtilen adrese dallanma ilemini geekletirir. Aksi durumda ilemci klasik yolunu izler ve bir sonraki komutu iler.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 6 - Z=1 olduunda 0024h offset adresine dallanlacak.

Klavyeden farkl deerler girildiinde ise, karlatrma ileminin sonucunda z=0 olur. Bu durumda dallanma gereklemez ve ilemci normal seyrini srdrerek bir sonraki komutu iler.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 7 - Z=0 olduunda dallanma gereklemeyecek, program sonraki komutu takip edecektir.

Bayraklarn durumlar bayraklar etkileyen bir komut ilendiinde deiir, her komut bayraklar etkilemez. Burada CMP komutu 6 adet bayra etkiliyor. Hangi komutun hangi bayraklar etkilediine Intelin komut setinden bakabilirsiniz. Komut setinden CMP komutunu bulursanz bu 6 bayran neler olduunu grebilirsiniz.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

ekil 8 - CMP ile AF, CF, OF, PF, SF, ZF bayraklar etkilenir.

sterseniz ekil7 deki etkilenen tm bayraklar ve neden dolay 1 yada 0 olduklarn inceleyelim. Burada yaplan ilem "CMP BL, AL" dir ve BL=33, AL=34dr. BL-AL yani 33h-34h ilemini yapan CMP komutu aadaki nedenlerden dolay bu bayraklar etkilemitir. 1- 33-34 ilemi iin bor gerektiinden (Kk say byk saydan kartlyor) CF=1, 2- Bu ilemin sonucu sfr olmadndan ZF=0, 3- lemin sonucu negatif olduundan SF=1, 4- lem sonucunda bir iaret tamas olmadndan OF=0, 5- Sonuta elde edilen -1 yani FFh, baka bir deyile 11111111b deerindeki 1lerin says sekiz adet yani ift olduundan PF=1, bor alndndan AF=1 olmutur.

6- Binary olarak kartma ileminde daha 2. bitte 0dan 1 karlrken

Bizim programmzda sadece Z bayrann durumu nemli olduundan bu bayran durumuna gre programn akn kontrol eden JE komutunu kullandk. Aslnda burada JE komutu ile ilerleyen makalelerde ele alacamz if-else mantn oluturduk. Grdnz gibi program ak kontrolnde bayraklar hayati nem tar. lemci durum kaydedicisinde bulunan bu bayraklar u anda aklnzn alamayaca bir ok ilemde bizlere yardmc olacak. Bu konuyu daha iyi anlamak iin Turbo Debuggerda programn her komutunu adm-adm altrn ve komut setinden faydalanarak, altrdnz komutun etkiledii bayrak varsa bunun nedenini aratrn.

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

HAZIRLAYAN : 05BP2030 ETHEM DEMRKIRAN

You might also like