You are on page 1of 53

Assembly

Programlama Dili
Temmuz 2003

Hazrlayan : Fehmi Noyan S


fni18444@gantep.edu.tr fnoyanisi@yahoo.com

http://www2.gantep.edu.tr/~fni18444

Bu dokmanda Intel firmasnn 80x86 serisi olarak nitelendirilen 8086, 80186, 80286, 80386, 80486 ve Pentium ilemcileri iin 16-bit Assembly programlama dili genel yaps ile anlatlacaktr . Bu sebepten, dokmanda sadece 8086, 80186 ve 80286 (Intel firmasnn 16-bit ilemcileri) ilemciler iin assembly dili anlatlacaktr. rnekler MS-DOS iletim sistemi iin yazlmtr. Windows iletim sistemi iin assembly programlama 32-bit olup bu dokmanda ele alnmayacaktr. Dokmanda bulunan Linux Altnda Assembly Dili blmnde, Linux iletim sistemi altnda assembly dilinin kullanm anlatlmaktadr. Assembly programlama dili ile ilgili elinize geecek birok kaynakta baz temel terim ve ifadeler srekli orijinal ngilizce halleriyle kullanldklar iin ben de birok terimin ve ifadenin Trke karln kullanmadm. Bu, baz durumlarda anlatm biraz vasatlatrmsa da kavramlarn ok bilinen adlar ile renmenin daha faydal olacan dnyorum. Fehmi Noyan S

indekiler
Giri Blm 1 : Temeller 1.1 Say Sistemleri 1.2 Veri Tipleri 1.2.1 Bit 1.2.2 Bayt 1.2.3 Word 1.2.4 Double Word (Long) 1.3 Bitler zerinde Mantksal lemler 1.4 retli ve aretsiz Saylar 1.5 Shift ( Kaydrma ) ve Rotate ( Dndrme ) lemleri Blm 2 : Mikro lemci (CPU) ve Bellek 2.1 Mikro lemci ve Yaps 2.1.1 Data Register'lar 2.1.2 Pointer ve Index Register'lar 2.1.3 Segment Register'lar 2.1.4 Instruction Pointer 2.1.5 Flag Register 2.1.5.1 Carry Biti 2.1.5.2 Parity Biti 2.1.5.3 Auxilary Carry Biti 2.1.5.4 Zero Biti 2.1.5.5 Sign Biti 2.1.5.6 Trace Biti 2.1.5.7 Interrupt Biti 2.1.5.8 Direction Biti 2.1.5.9 Overflow Biti 2.2 Bellek ve Yaps 2.3 Stack 2.4 80x86 lemcilerde Bellek Adresleme 2.4.1 Dorudan Adresleme (Direct Addressing) 2.4.2 Dolayl Adresleme (Indirect Addressing) 2.4.3 Indexed Adresleme 2.4.4 Based Indexed Adresleme 2.4.5 Based Indexed + Sabit(Disp) Adresleme Blm 3 : 80x86 Komut Kmesi 3.1 Transfer Komutlar 3.1.1 MOV Komutu 3.1.2 XCHG Komutu 3.1.3 LEA Komutu 3.1.4 PUSH Komutu 3.1.5 PUSHF Komutu 7 8 8 8 8 8 8 8 9 9 10 11 11 11 12 12 12 12 13 14 14 14 14 14 14 15 15 15 16 18 18 18 19 19 20 20 21 22 23 23 24 24

3.1.6 POP Komutu 3.1.7 POPF Komutu 3.1.8 LAHF Komutu 3.1.9 SAHF Komutu 3.2 Giri/k Komutlar 3.2.1 IN Komutu 3.2.2 OUT Komutu 3.3 Aritmetiksel Komutlar 3.3.1 ADD Komutu 3.3.2 ADC Komutu 3.3.3 SUB Komutu 3.3.4 SBB Komutu 3.3.5 MUL Komutu 3.3.6 IMUL Komutu 3.3.7 DIV Komutu 3.3.8 IDIV Komutu 3.3.9 INC Komutu 3.3.10 DEC Komutu 3.3.11 CMP Komutu 3.4 Mantksal Komutlar 3.4.1 AND Komutu 3.4.2 TEST Komutu 3.4.3 OR Komutu 3.4.4 XOR Komutu 3.4.5 NOT Komutu 3.5 Kaydrma ve Dndrme Komutlar 3.5.1 SHL/SAL Komutlar 3.5.2 SHR Komutu 3.5.3 SAR Komutu 3.5.4 RCL Komutu 3.5.5 ROL Komutu 3.5.6 RCR Komutu 3.5.7 ROR Komutu 3.6 Dallanma Komutlar 3.6.1 JMP (Koulsuz Dallanma) Komutu 3.6.2 JZ/JE Komutlar 3.6.3 JNZ/JNE Komutlar 3.6.4 JB/JC/JNAE Komutlar 3.6.5 JBE/JNA Komutlar 3.6.6 JNB/JNC/JAE Komutlar 3.6.7 JG/JNLE Komutlar 3.6.8 JA/JNBE Komutlar 3.6.9 JL/JNGE Komutlar 3.6.10 JLE/JNG Komutlar 3.6.11 JS ve JNS Komutlar 3.6.12 JO ve JNO Komutlar 3.6.13 JCXZ Komutu 3.7 Dng Komutlar

24 25 25 25 26 26 26 26 27 27 27 28 28 29 29 30 30 31 31 32 32 32 32 32 33 33 33 33 33 34 34 34 34 35 35 36 37 38 38 38 38 38 38 38 38 39 39 39

3.7.1 LOOP Komutu 3.7.2 LOOPZ/LOOPE Komutlar 3.7.3 LOOPNZ/LOOPNE Komutlar Blm 4 : Kesme (Interrupt) Kullanm Blm 5 : DEBUG Program Blm 6 : Linux letim Sistemi Altnda Assembly Kullanm 6.1 Intel ve AT&T Szdizimleri 6.1.1 Kaynak-Hedef Yn 6.1.2 nekler 6.1.3 Sonekler 6.1.4 Bellek lemleri 6.1.5 INT 0x80 ve Linux Sistem arlar (Syscalls) rnekler nternet Adresleri

39 40 40 40 41 44 45 46 46 46 47 47 48 52

Giri
Assembly programlama dili dk seviyeli bir dil olup C, C++, Pascal, Basic gibi yksek seviyeli programlama dillerine gre anlalmas biraz daha zordur. Assembly dili ile program yazarken kullanlan bilgisayarn donanm zellikleri programc iin nemlidir. Yazlan kodlar ounlukla donanma bal yazlr ki bu da programn tanabilirliini azaltan bir faktrdr. Assembly dili ile program yazarken programc dorudan bilgisayarn ilemcisi ve hafzas ile urar. Yani hafzadaki ( RAMdeki ) ve ilemci gzlerindeki deerleri dorudan deitirme olana vardr. Yksek seviyeli dillerdeki derleyicilerden farkl olarak, assembly kaynak dosyalarn alabilir dosya haline getirebilmek iin assembler ve linker ad verilen programlar kullanlr. Aslnda derleyiciler de bir tr assembler programdr denebilir. Fakat derleyiciler, ekstra bir parametre kullanlmad taktirde, kaynak dosyasn nce gerekli Object dosyasna eviriler daha sonra, bir hata ile karlalmaz ise, elde edilen object dosyas linker yardm ile alabilir dosya haline getirilir. Bilgisayarmzda altrlan tm programlar nce bilgisayarmzn RAMine yklenir. Daha sonra RAM zerinde altrma ilemi gerekletirilir. RAMe yklenen bilgi programmzn makine dili karlndan baka bir ey deildir. Makine dilinin kullanc tarafndan anlalabilir ekline ise assembly dili demek pek yanl olmaz. Aslnda assembly programlarnn en nemli zellikleri boyutlarnn yksek seviyeli bir dil ile yazlan programlara nazaran ok kk olmas ve buna bal olarak ok daha hzl almalardr. Programlarn hzl almalarn kodlarnn sadeliinden kaynaklanmaktadr. Fakat gnmzde kullanlan yksek hzl ilemciler ve byk kapasitelere sahip sabit diskler assembly programlarnn bu zelliklerini nemsiz klmaktadr. Aadaki rnekte ekrana A harfini basan bir program nce assembly dili ile daha sonra C ve Pascal dilleri ile yazlmtr. Programlarn yaptklar ilerin ayn olmasna karn boyutlar arasndaki byk farka dikkat edin. Assembly Program MOV AH,02 MOV DL,41 INT 21 INT 20 Assembler Bilgileri MS-DOS DEBUG Boyut : 8 bayt C Program #include <stdio.h> main() { printf(A); } Derleyici Bilgileri MS-DOS iin Turbo C 2.01 Boyut : 8330 bayt begin write(A) end. Pascal Program

Derleyici Bilgileri MS-DOS iin FreePascal 0.9 Boyut : 95644 bayt

Grdnz gibi C ile yazlan programn boyu assembly ile yazlannkinin boyunun 1000 katndan daha byk! Pascal ile yazlan programn boyu ile assembly ile yazlannkinin boyunu karlatrmaya bile gerek yok sanrm. Bu fark eski bir bilgisayar iin nemli olabilir fakat gnmz standartlarndaki bir bilgisayar iin pek nemli deildir. Bu sebepten assembly programlama dili gnmzde daha ok sistem programclar tarafndan ve inline olarak dier

programlama dilleri ierisinde kullanlmaktadr. inline assembly ile kastedilmek istenen, assembly kodlarnn olduu gibi yksek seviyeli bir dil ierisinde kullanlmasdr. Bu, bize sabit diskin herhangi bir blmne ( mesela MBR ), BIOS gibi sistem kaynaklarna veya belirli bellek blgelerine kolayca erime olana salar.

Blm 1 : Temeller
1.1 Say Sistemleri Gnlk hesaplamalarmzda kullandmz sistem onluk say sistemidir ve bu sistem 0,1,2,3,4,5,6,7,8 ve 9 rakamlarndan oluur. Dier saylar ise bu rakamlar kullanlarak elde edilir. Kullandmz bilgisayar iin (aslnda tm elektronik cihazlar iin dersek daha iyi olur) durum byle deildir. Bilgisayar binary say sistemi dediimiz ikilik say sistemini kullanr ki bu sistemde sadece 0 ve 1 vardr. Bilgisayar iin 0n anlam yanl ( FALSE ) ve 1in anlam ( TRUE ) dorudur. Buna karn assembly programlar yazlrken kullanlan say taban hexadecimal olarak bilinen on altlk say tabandr. Bu sistemde kullanlan ilk on rakam onluk sistemdeki ile ayn olup 0,1,...,9 rakamlarndan oluur. 10, 11, 12, 13, 14 ve 15 iin srasyla A, B, C, D, E ve F harfleri kullanlr. On altlk saylar gsterilirken sonlarna h veya Hharfi konur. Assembly dili ile onaltlk say sisteminin kullanlmasnn sebebi, bellek adresi gibi uzun rakamlarn ikilik sistem ile gsterilmesinin zorluudur. Say taban bydke herhangi bir sayy gstermek iin gereken basaman saysnn azalaca aktr. Mesela 1BA5:010F gibi bir bellek blgesinin adresini ikilik sistem ile gstermek isteseydik 0001101110100101:0000000100001111 eklinde olacakt ki bu hem aklda tutmas hem de yazmas zor bir say. 1.2 Veri Tipleri 1.2.1 Bit Bilgisayarn ikilik say sistemini kullandndan bahsettik. Bu sistemdeki her bir basamaa Binary Digit anlamna gelen bit denir. Yani bir bit ierisinde 0 veya 1 olmak zere iki bilgiden biri bulunabilir. Bilgisayar iin en kk bilgi birimi bittir. 1.2.2 Bayt Sekiz adet bitin oluturduu toplulua bayt denir. Bir bayt ierisinde 0-255 arasnda olmak zere 256 deiik deer tutulabilir. (ikilik) 00000000 = 0 (onluk) (ikilik) 11111111 = 255 (onluk) Grld gibi bir baytn alabilecei maksimum deer 255 ve minimum deer 0dr. 1.2.3 Word ki baytlk (16-bitlik) bilgiye Word denir. Bir wordun alabilecei maksimum deer 65535 ve minimum deer 0dr. Bu da bir word ierisinde 65536 farkl deer saklanabilecei anlamna gelir. 1.2.4 Double Word (Long) ki ayr wordun birletirilmesi ile bir Double Word elde edilir. Bir double word 32-bit uzunluundadr.

8086, 80186 ve 80286 ilemcilerde ayn anda ilenebilecek bilgi saysnn 16 bit uzunluunda olmasndan dolay bu ilemcilere 16-bit ilemci ad verilir. Intel firmas 80386 ve sonras ilemcilerinde 32 bitlik bilgi ileme sistemi kullanmtr ve bu ilemcilere de 32-bit ilemci ad verilir. 1.3 Bitler zerinde Mantksal lemler lemciler birok ilemi mantksal karlatrmalar yardm ile yaparlar. Assembly programlama dili ierisinde AND, OR, XOR ve NOT olmak zere drt adet mantksal komut kullanlr. Aada bu komutlarn doruluk tablolar verilmitir.

AND 1 0

1 1 0

0 0 0

OR 1 0

1 1 1

0 1 0

XOR 1 0

1 0 1

0 1 0

NOT

1 0

0 1

Bilgisayarmzda kullanlan baytlar da 1 ve 0lardan olutuu iin CPU her mantksal ilemde bitler zerinde ayr ayr ilem yapar. Aada birka rnek verdim. 1001 0110 1001 1111 1011 1101 0001 1110
AND _______________________________

1011 0010 1110 1010 1011 0000 0000 0000


OR ____________________________

1001 0100 0001 1110 1010 1010 1000 1111 1110 1110 1100 0001
XOR________________________________

1011 0010 1110 1010 0010 0000 0000 1111


NOT______________________________

1101 1111 1111 0000

0100 0100 0100 1110 1.4 retli ve aretsiz Saylar Daha nce veri tipleri anlatlrken bayt iin deer aral 0-255 word iin 0-65535 olarak tanmland. Peki ilemlerimizde negatif saylar kullanmak istersek ne yapmalyz? Bu durumda bayt, word veya long iin ayrlan blgenin yars negatif dier yars da pozitif saylar iin tahsis edilir. Yani bir baytn alabilecei deerler 128....-1 ve 0....127 arasnda olur. Ayn ekilde word iin bu deer 32.768......+32.767 arasnda olur. Bir bayt, word yada long iin en soldaki bite iaret biti denir. aretli saymzn iaret bitinin deeri 0 ise say pozitif, 1 ise negatif olarak deerlendirilir. Yani 0110 0101 1110 1100 pozitif bir say (word) 1000 1100 1010 0000 negatif say (bayt) Herhangi bir saynn negatifini bulmak iin ikiye tmleyeni bulunur. Bu i iin 1) Say NOT ileminden geirilir 2) Elde edilen sonuca 1 eklenir imdi, 13 bulmaya alalm. +13 = 0000 1101 (bayt) 1) Say NOT ileminden geirilir

0000 1101
NOT______________

1111 0010 2) Elde edilen sonuca 1 eklenir 1111 0010 1 +-----------1111 0011 -13 imdi elde ettiimiz sonucu bir test edelim. 13+(-13) = 0000 1101 + 1111 0011 Yukardaki ilemin sonucu sfr olaml. 0000 1101 1111 0011 +-------------1 0000 0000 Eldeki 1 gz ard edilirse sonu sfr bulunur ki bu bizim ilemimizin doru olduunu gsteriyor. 1.5 Shift ( Kaydrma ) ve Rotate ( Dndrme ) lemleri Bit dizgileri zerinde yaplan bir dier mantksal ilemler de kaydrma (shift) ve dndrme (rotate) ilemleridir. Bu iki ilem kendi ilerinde saa kaydrma (right shift), sola kaydrma (left shift) ve saa dndrme (right rotate), sola dndrme (left rotate) olarak alt kategorilere ayrlabilir. 1 0 1 1 1 0 0 1

Yukardaki gibi bir bayta saa kaydrma (right shift) ilemi uygulanrsa 7. bit 6.nn yerine, 6. bit 5.nin yerine, 5. bit 4.nn yerine .... geer. Bo kalan 7. bit pozisyonuna 0 yazlr ve 0. bit iersindeki 1 deeri bit darsna atlr. Sola kaydrma (left shift) ilemi de ayn ekilde gerekletirilmektedir. Bu sefer bo kalan 0. bit pozisyonuna 0 yazlr ve 7. bit ilem d kalr.
0 1 0 1 1 1 0 0

Saa kaydrma sonras


0

Sola kaydrma sonras

Dndrme (rotate) ileminde de yine kaydrma ileminde olduu gibi bitler bir saa veya sola kaydrlr fakat burada bo kalan 7. veya 0. bit yerine sfr deil de 7. bit iin 0. bitin ve 0. bit iin de 7. bitin deeri yerlerine yazlr. Yani yukardaki baytmza srasyla saa ve sola dndrme ilemleri uygulanrsa aadaki gibi sonular elde edilir.
1 1 0 1 1 1 0 0

Saa dndrme sonras


1

Sola dndrme sonras

10

Blm 2 : Mikro lemci (CPU) ve Bellek


2.1 Mikro lemci ve Yaps Bugn kullandmz bilgisayarlarda bilgileri yorumlayan ve ileyen ksm bilgisayarn merkezi ilem nitesidir. Merkezi ilem nitesi (Central Processing Unit CPU) bellek ve eitli giri/k niteleri ile bus ad verilen veri yollarn kullanarak haberlemektedir. lemciler, dahili ve dsal hatlarnn bilgi transferi ve ileyebilecekleri maksimum bilgi kapasitesine gre 8 bitlik, 16 bitlik ve 32 bitlik ilemciler olarak adlandrlr. Bu dokmanda anlatlan assembly dili 16 bitlik bir ilemci olan Intel 8086 (dsal ve dahili veri transferi wordler halinde yaplmaktadr) serisi iindir. Dilin 8086 serisi iin olmas, yazdnz programlarn 8088, 80186, 80286, 80386, 80486, Pentium ve Celeron serileri ve AMD ilemciler zerinde almayaca anlamna gelmemektedir. lemci, register ad verilen blmelerden oluur. Bu registerlar Data registerlar, Pointer ve Index registerlar, Segment registerlar, Instruction Pointer (komut gstergeci) ve Program Status Word (Flag register) olarak gruplandrabiliriz. Aada 8086 ilemcinin register yaps basite gsterilmitir.

2.1.1 Data Registerlar ekilde de grld gibi 8086 ilemci 14 adet 16-bit kapasiteli registera sahiptir. Bu registerlardan Data registerlar ( AX, BX, CX ve DX ) kendi ilerinde 8-bit kapasiteli iki registera blnmektedir. Bu registerlar AX iin AH ve AL, BX iin BH ve BL, CX iin CH ve CL ve DX iin DH ve DL olarak adlandrlr. AH, 16-bitlik AX registernn 8-bitlik yksek(High) seviyeli blm ve AL ise 16-bitlik AX registernn 8-bitlik alak (Low) seviyeli blm olarak adlandrlr. Programlarmz yazarken 8-bitlik verilerin ilenmesinde bu 8-bitlik registerlardan faydalanrz. Daha sonraki blmlerde de greceimiz gibi data registerlar bir ok ilemde (dnglerde, interrupt kullanlmasnda, matematiksel ilemlerde...) CPU tarafndan rezerv edilmilerdir. Bu durumlarda bizim register ierisindeki deeri deitirme ansmz yoktur.

11

Programlarmzda BH veya BL registernn deerinin deimesi dorudan BX registernn deerini deitirecektir. Ayn durum dier data registerlar iin de geerlidir. Bir rnek vermek gerekirse: BX registermzn deeri A43F olsun. Bu durumda BH=A4 ve BL=3F olur. Simdi BLnin deerini 05 olarak deitirelim. Son durumda BX=A405, BH=A4 ve BL=05 olacaktr. (Yukardaki ekil incelenirse verilen rnek daha kolay anlalacaktr) 2.1.2 Pointer ve Index Registerlar Pointer ve index registerlar bellek ierisindeki herhangi bir noktaya erimek iin kullanlr. Bu i iin eriilmek istenen noktann offset ve segment adresleri gerekli registerlara atanarak ilem gerekletirilir. ( Blm 2.2, Bellek ve Yaps ksmnda bu konu daha ayrntl ele alnacaktr.) 2.1.3 Segment Registerlar Segment registerlar (CS, DS, SS ve ES) , programmz bilgisayarn belleine yklendii zaman bellek ierisinde oluturulan blmlerin (Segment) balang adreslerini tutarlar. Yani bu registerlara bir eit yer gstergeci denebilir. CS, programmzn altrlabilir kodlarn barndran (Code Segment) bellek blgesinin balang adresini tutar. Yani CS ile gsterilen yerde makine dili kodlarmz vardr. DS, programmz ierisindeki deikenlerin sakland blmdr. SS, bellekte programmz iin ayrlan stack blmnn balang adresini tutar. Stack, ileride greceimiz PUSH ve POP komutlar ile bellee deer atlmas ve alnmas iin, programlarn ve fonksiyonlarn sonlandrldktan sonra nereye gideceklerini belirten adres bilgisini tutmak iin ve program ve fonksiyonlara gnderilen parametreleri saklamak iin kullanlr. UNIX tabanl sistemlerde kesme (interrupt) kullanm iin gerekli parametrelerin belirtilmesi iin de stack kullanlr. ES (Extra segment) daha ok dizgi ilemleri iin kullanlr. 2.1.4 Instruction Pointer Instruction Pointer register ilemci tarafndan ilenecek bir sonraki komutun bellekteki adresini saklar. Bu register zerinde programc tarafndan herhangi bir ilem yaplamaz. Her komut iletildikten sonra CPU otomatik kullanlan komuta gre gerekli deeri bu registera atar. 2.1.5 Flag Register Flag Register dier registerlardan daha farkl bir durumdadr. Dier resigterlarn 16-bit halinde bir btn olarak ele alnmalarndan farkl olarak flag registern her biti CPU iin ayr bir deere sahiptir (8086 ilemci tarafndan sadece 9 tanesi kullanlmaktadr). Bu bitlerin zel olarak isimlendirilmeleri aada verilmitir. O : Overflow flag D : Direction flag I : Interrupt flag T : Trace flag S : Sign flag Z : Zero flag A : Auxilary Carry flag P : Parity flag C : Carry flag

12

Bilgisayar ikilik say sistemini kullandna gre bu registerlar ierisindeki deer herhangi bir anda ya 1 yada 0dr. Bir bitin 1 olma durumuna Set, 0 olma durumuna ise Reset denir. lemci birok komutu icra ederken bu bitlerin durumlarndan faydalanr. 2.1.5.1 Carry Biti lemci tarafndan yaplan herhangi bir ilem srasnda alc alana yerletirilen saynn alc alana smamasndan doan olaya carry(tama) denir. CPU bir ilem sonucunda tama ile karlarsa carry flagn deeri 1 yaplar. Aada 16-bitlik iki say toplanmtr ve sonuta bir tama olmutur. (Taan bit krmz ile gsterilmitir) 1111 1001 0110 1010 F96A 0010 1010 1111 1001 2AF9 +---------------------------1 0010 0100 0110 0011 2463 CF=1 F96A ile 2AF9un toplanmas sonucu 2463 says elde edilmitir ki bu iki saydan da kktr. Elimizdeki saylar pozitif olduuna gre toplama ilemi sonucunda elimizdeki saylardan daha kk bir say elde etmemiz imkanszdr. CPU bu durumda carry flagn deerini 1 yaparak 17bitlik bir say elde eder.
C:\WINDOWS\Desktop>debug -a100 1E40:0100 MOV AX,F96A 1E40:0103 MOV BX,2AF9 1E40:0106 ADD AX,BX 1E40:0108 -t AX=F96A BX=0000 DS=1E40 ES=1E40 1E40:0103 BBF92A -t AX=F96A BX=2AF9 DS=1E40 ES=1E40 1E40:0106 01D8 -t AX=2463 BX=2AF9 DS=1E40 ES=1E40 1E40:0108 A394D3 CX=0000 DX=0000 SP=FFEE SS=1E40 CS=1E40 IP=0103 MOV BX,2AF9 CX=0000 DX=0000 SP=FFEE SS=1E40 CS=1E40 IP=0106 ADD AX,BX CX=0000 DX=0000 SP=FFEE SS=1E40 CS=1E40 IP=0108 MOV [D394],AX BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

BP=0000 SI=0000 DI=0000 NV UP EI PL NZ AC PE CY DS:D394=A2A2

Yukardaki ekran grnts verdiim rnein debug program altnda denenmesi sonucu elde edilmitir. lk nce MOV AX,F96A ile AX registernn deeri F96A yaplmtr. Bunu ilk t komutundan sonra AX=F96A ile grebiliriz (1. t komutundan sonraki blmde AXin deerini inceleyin). Daha sonra MOV BX,2AF9 ile BXin deeri 2AF9 yaplmtr (2. t komutundan sonraki blmde BXin deerini inceleyin). En son ADD AX,BX ile bu iki deer toplanp AXe atanmtr. Son t komutundan sonra AX=2463 olmutur ve en sondaki NC ifadesi CYye dnmtr ki bu da ilemin sonucunda bir tama olduunu gsterir.

13

2.1.5.2 Parity Biti Bir ilem sonucunda wordun dk seviyeli bayt iki ile tam blnyorsa bu bite 1 aksi taktirde 0 atanr. lemin yksek seviyeli baytndaki saynn iki ile blnp blnmemesi bu flag iin nemli deildir. 2.1.5.3 Auxilary Carry Biti CPU tarafndan gerekletirilen ilem sonucunda alc alann ilk drt biti zerinde bir tama gerekleiyorsa bu flagn deeri 1 yaplr. Yukarda carry flag iin verilen rnekte ilk saynn ilk drt biti olan 1010 (hex A) ve ikinci saynn ilk drt biti olan 1001 (hex 9) toplam sonucu 0011 says elde edilmi ve bir sonraki bite bir elde say aktarlmtr. ADD ilemi ncesinde NA (0) olan bitin deeri, ilem sonrasnda AC (1) olmutur. 2.1.5.4 Zero Biti Yaplan herhangi bir ilem sonucu sfr ise bu flag set edilir.
-a100 1E40:0100 mov ax,12 1E40:0103 xor ax,ax 1E40:0105 -t AX=0012 BX=0000 DS=1E40 ES=1E40 1E40:0103 31C0 -t AX=0000 BX=0000 DS=1E40 ES=1E40 1E40:0105 F0 1E40:0106 01D8 CX=0000 DX=0000 SP=FFEE SS=1E40 CS=1E40 IP=0103 XOR AX,AX CX=0000 DX=0000 SP=FFEE SS=1E40 CS=1E40 IP=0105 LOCK ADD AX,BX BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

BP=0000 SI=0000 DI=0000 NV UP EI PL ZR NA PE NC

Yukarda nce AX registernn deeri 12 yaplyor. Daha sonra bu register kendisi ile XOR ilemine tabi tutulmutur. Bir saynn kendisi ile XOR ilemine tabi tutulmas sonucu 0 elde edilir. Bu durum zero flagn deerini set etmitir ( NZ ZR ). 2.1.5.5 Sign Biti aretli saylarda bayt (8 bit) iin saynn 7. ve word (16 bit) iin saynn 15. biti iaret biti olarak adlandrlr. Yaplan bir ilem sonucunda alc alan iersindeki iaret biti sign flag ierisine kopyalanr. Yani sign bitinin deeri 0 ise elde edilen sonu pozitif, 1 ise elde edilen sonu negatif kabul edilir. 2.1.5.6 Trace Biti CPUnun sadece bir komut altrp beklemesi iin kullanlr. DEBUGn kulland Trace ilemi bu flagn set edilmesi ile gerekletirilir. 2.1.5.7 Interrupt Biti CPUnun eitli aygtlardan gelen kesme isteklerini dikkate alp almayacan bildirir. 0 olmas durumunda istekler dikkate alnmayacaktr.

14

2.1.5.8 Direction Biti Bu flagn deeri genellikle dizgi ilemleri zerindeki ilemin ynn belirtmek iin kullanlr. 2.1.5.9 Overflow Biti aretli saylar zerindeki tamay kontrol etmek iin kullanlr. Hatrlarsanz iaretsiz saylar iin carry flag kullanlmtr. Fakat durum iaretli saylar iin biraz daha farkldr. aretli saylarda meydana gelecek bir tama bayt veya wordun iaret bitini etkileyecei iin pozitif (iaret biti 0) olan bir iaretli saynn tama sonucu negatif (iaret biti 1) gibi alglanmas mmkndr. Bu durumda overflow flag set edilir ve ilem sonucunun yanl alglanmas engellenir. 2.2 Bellek ve Yaps Bilgisayarmzda bir program altrdmz zaman program nce RAMe yklenir ve daha sonra altrlr. Ykleme ilemi programn kod, data gibi blmlerinin eitli belek alanlarna ayr ayr yklenmesi ile yaplr. Bu alanlara segment ad verilir. 8086 ilemcide bu segmentlerden her birinin boyu 64 Kb (65535 bayt) boyundadr. Bu deer 32-bit ilemcilerde 4 Gb kadardr. Biz 8086 ilemci ve 16-bit uzunluundaki bellek blgeleri ile altmza gre adresleyebileceimiz maksimum alan 64 Kb boyundadr. 8086 ilemci programcya zerinde alabilecei drt adet segment salar. Bunlar : CODE, DATA, EXTRA ve STACK segmentleridir. Bu segmentlerin balang adresleri CODE SEGMENT iin CSde, DATA SEGMENT iin DSde, EXTRA SEGMENT iin ESde ve STACK SEGMENT iin SSde saklanr. Yukarda anlattmz 64 Kblk segmentler de kendi ilerinde 1 baytlk blmlere ayrlmlardr. Segmentlerin ierisindeki bu bir baytlk blmlere OFFSET ad verilir. Yani bir segment ierisinde 65535 tane offset vardr. Programc tarafndan girilen her komut tuttuu bayt says kadar offset adresini ileri alr. Bellek ierisindeki herhangi bir noktaya erimek iin SEGMET:OFFSET ikilisi kullanlr. Code segment ierisindeki bir noktaya erimek iin segmet adresi olarak CSdeki deer ve offset adresi olarak IP ierisindeki deer kullanlr. Ayn ekilde stack segment ierisindeki bir deere ulamak iin segment adresi olarak SS ierisindeki deer ve offset adresi olarak SP veya BPden biri kullanlr. Bellek ve verilerin nasl depoland konusunda aadaki rnek size yardmc olacaktr.
-A100 1E40:0100 MOV AH,01 1E40:0102 INT 21 1E40:0104 CMP AL,45 1E40:0106 JNE 0100 1E40:0108 INT 20 1E40:010A -G GGHJRE Program normal olarak sonlandrld -U 100 1E40:0100 B401 MOV AH,01 1E40:0102 CD21 INT 21 1E40:0104 3C45 CMP AL,45 1E40:0106 75F8 JNZ 0100 1E40:0108 CD20 INT 20 1E40:010A D3E8 SHR AX,CL 1E40:010C 94 XCHG SP,AX 1E40:010D 00726D ADD [BP+SI+6D],DH

15

1E40:0110 1E40:0113 1E40:0116 1E40:0118 1E40:011A 1E40:011C 1E40:011E 1E40:011F -

E87000 A396D3 8A04 3C20 740C 3400 2F 1E

CALL MOV MOV CMP JZ XOR DAS PUSH

0183 [D396],AX AL,[SI] AL,20 0128 AL,00 DS

Yukardaki ksa program klavyeden girilen her tuu okur ve girilen E oluncaya kadar okuma ilemine devam eder. (Bu arada programn boyunun sadece 10 bayt olduuna dikkat edin. C veya Pascal ile ayn program ka KB tutard acaba!! ). nce program yazdk ve daha sonra G ile altrdk. En son olarak da U 100 ile 100. offset adresinden itibaren datma (unassemble) ilemi yaptk. Dikkat ederseniz her satrn banda 1E40:0104 gibi, iki nokta ile ayrlm iki say var. Bu saylar sras ile komutun segment ve offset adresleridir. Yani bilgisayarmzn 1E40. segmenti o anki geerli kod segmentimiz ve bu segment ierisindeki 0104. offset de (aslnda 0104. ve 0105. offsetler) ierisinde CMP AL,45 komutunu barndrmaktadr. Bir sonraki satrda bu saylar 1E40:0106 halini alyor ki buda bize offset adresimizin 2 arttn gsteriyor. Yani CMP AL,45 komutu bilgisayarmzn belleinde 2 baytlk yer kaplyor. Datma ileminde segment ve offset adreslerinin sandaki saylar ise sizin girdiiniz komutlarn bellekte bulunduklar hallerinin on altlk tabandaki karlklardr. te bilgisayar asl olarak bilgiyi belleinde saylar halinde saklar ve assembly dili bu saylarn insan iin daha okunur hale gelmi halidir. Yani CPU 3C45 (0011 1100 0100 0101 = 16-bit ) ile karlat zaman bunun bir karlatrma komut olduunu anlar ve ona gre ilem yapar. Dier komutlarda ayn ekilde ilem grmektedir. Eldeki bilginin komut mu yoksa bir deiken mi olduu, bilginin bulunduu segment aracl ile anlalr. 2.3 Stack Yksek seviyeli programlama dillerinde deerler deiken ad verilen alanlarda saklanr. Assembly dilinde ise programc deerleri saklamak iin CPU registerlarn ve stack kullanlr. Stack, bilgilerin geici olarak depoland bir blmdr. 8086 ilemci programcya 64 Kb boyundu bir stack segment salar. Bu segmentin balang adresi SS ierisinde ve o anki geerli offset adresi ise SP (Stack Pointer) ierisinde bulunur. Stack ierisinde, program ierisindeki fonksiyonlarn geri dn deerleri, fonksiyonlara aktarlan argmanlar, komut satr parametreleri gibi deerler saklanr. Ayrca programc baz deerleri geici olarak bu alana depolayp daha sonra kullanabilir. Stack iersinde yerletirme ilemi kelimeler (word) halinde olur. Yani, stack zerinde bir ilemde her seferinde iki offset geriye veya ileriye gidilir. Stack programcya sral eriim salar. Stack segmentimizin 0000-FFFF arasnda deien offset adresleri ve SPnin o anki deerinin FFFF olduunu varsayarsak, stack zerine konulacak ilk deer FFFF ve FFFE adreslerine yazlr (ki bayt veri yazlp okunabilir). Daha sonra SPnin deeri yazlacak bir sonraki deerin adresini belirtmek zere FFFD olarak deitirilir.

16

Yukarda stack pointern ilk deeri FFFFdir (ekil1). Stack zerine ilk bilgi aktarmndan sonra bir sonraki bilginin yazlaca adresi belirtmek iin SP=FFFD oluyor (ekil 2). FFFF ve FFFE adreslerine srasyla 89 ve 67 saylar yazlm. Bu bize stack zerine yazlan bilginin 6789h olduunu gsteriyor. Ayn ekilde, daha sonra 1234h deeri stack zerine aktarlyor (ekil 3) ve SPnin deeri FFFB olarak deiiyor. ekil 4te stack zerinden bilgi alnyor. lk iki ilemin tersine bu sefer SPnin deeri 2 artyor ve FFFB+2=FFFD oluyor. Yani o andan sonra yazlacak ilk deer FFFD ve FFFC adreslerine yazlacaktr. Ksaca, stack zerine bilgi yazld zaman SPnin deeri azalr ve bilgi okunduu zaman artar. Stack LIFO (Last-In First-Out) prensibi ile alr. Yani stack zerine yazlan en son bilgi alnabilecek ilk bilgi ve yazlan ilk bilgi de alnabilecek son bilgidir. Yukardaki rnekte ilk nce 6789h says daha sonra 1234h says stack zerine yazld. lk yazlan deer olan 6789ha ulamak iin nce 1234h okunmal. Stack zerindeki ilemler PUSH ve POP komutlar ile gerekletirilmektedir. MOV komutu: Bir sonraki blm olan 80x86 lemcilerde Bellek Adresleme ksmnda bellek ve CPU registerlar arasndaki bilgi transferi MOV komutu kullanlarak anlatlacaktr. MOV hedef,kaynak MOV komutunun kullanm ekli yukardaki gibidir. Bu komut kaynak ierisindeki bilgiyi hedefe aktarr. Yani MOV AX, 1234h MOV BX, AX Yukarda ilk nce AX registerna 1234h deeri yazlmtr. Daha sonra bu deer AX registerndan BX registerna aktarlmtr. Yani Program sonunda AX=1234h ve BX=1234h olur. Komutun kullanmnda dikkat edilmesi gereken en nemli nokta hedef ve kaynak alanlarnn eit boyutlarda olmasdr (rneimizde 16-bit.).

17

2.4 80x86 lemcilerde Bellek Adresleme 8086 ilemci programcya bellee ulam iin 17 eit adresleme metodu salar. Assembly programlama dilinde bellek adresleme ve bellee eriim en nemli ve iyi bilinmesi gereken konulardandr. Displacement-only Base Displacement + Base Base + Indexed Displacement + Base + Indexed Kullanlan 17 eit adresleme metodu yukardaki be ana kategoriden tretilmektedir. 2.4.1 Dorudan Adresleme (Direct Addressing) Bu adresleme metodu anlalmas en kolay olandr. Bu yolla adresi verilen herhangi bir bellek gzne okuma veya yazma yaplr. Kullandmz bellek 16-bitlik adreslerden olutuuna gre adres sabitlerimiz de drt hanelik on altlk saylardan olumaldr. MOV AX, [4126] MOV CX, CS:[4A4C] MOV DS:[41C8], BX Yukarda ilk satrda MOV AX, [4126] ile bellekteki 4126h ve 4127h adreslerindeki deerler AX registerna atanmtr. 4126h adresi 1 bayt ve AX register 2 bayt olduu iin hem 4126h hem de 4127h adresindeki deerler okunmutur. kinci rnekte Code Segment ierisindeki 4A4Ch ve 4A4Dh adresindeki deerler CX registerna atanmtr. Grdnz gibi CS:[4A4C] gibi bir ifade kullanarak istediiniz herhangi bir segment ierisindeki bilgiye eriebiliyorsunuz. Son olarak da MOV DS:[41C8], BX komutu ile BX ierisindeki deer Data Segment ierisindeki 41C8h ve 41C9h adreslerine yazlyor. 2.4.2 Dolayl Adresleme (Indirect Addressing) Bu metot ile herhangi bir register ierisinde barndrlan deerin gsterdii bellek blgesindeki alan ile ilem yaplr. Bu metot iin kullanlabilecek drt register BX (Base), BP (Base Pointer), SI (Source Index) ve DI (Destionation Index)dr. Bu yol ile adreslemeye aada birka rnek verdim. Based MOV BX, 1234 MOV AX, [BX] nce BXin deeri 1234h olarak deitiriliyor. Daha sonra bellekte 1234 ile iaret edilen yerdeki deer AX ierisine atanyor. Yani yandaki komut kmesi MOV AX, [1234] ile ayn ii yapyor. BP = 45C8h MOV AX, [45C8]

Based MOV BP, 45C8 MOV AX, [BP]

18

Indexed MOV DI, 76A7 MOV AX, [DI]

DI = 76A7h MOV AX, [76A7]

Indexed MOV SI, D78C MOV AX, [SI]

SI = D78Ch MOV AX, [D78C]

lk iki adresleme ynteminde Base registerlar olan BX ve BP kullanld iin bu yntem Based olarak adlandrlr. Ayn ekilde DI ve SI ile yaplan adreslemelerde de Index registerlar kullanld iin Indexed olarak adlandrlr. Bir nceki blmde olduu gibi bu yntemde de ulalmak istenen offset iin ayr bir segment belirtilebilir. Yukarda BX, DI ve SI n tanml olarak DS (Data Segment)i kullanr. BP iin n tanml segment SS ( Stack Segmenttir). 2.4.3 Indexed Adresleme Bu metot ile istenilen yere ulamak iin hem bir sabit hem de yukardaki gibi bir register kullanlr. stenilen offset adresi kullanlan sabit ile register ierisindeki deerin toplamdr. Yine yukarda olduu gibi BX, DI ve SI n tanml olarak DSi ve BP n tanml olarak BPyi segment olarak kullanr. Tabi ki istenildii taktirde farkl segmentlerdeki verilere ulamak mmkndr. MOV BX, 7A82 MOV AL, 78[BX] BX = 7A82 7A82 + 78 = 7AFA MOV AL, [7AFA]

Grdnz gibi yukarda MOV AL, 78[BX] komutu ile BX ierisinde bulunan 7A82h deeri ile sabitimiz olan 78h deerini toplam olan 7AFAh offseti ierisindeki deer ALye atanyor. Tabi, BX kullanld iin kaynak segment olarak Data Segment kullanlmaktadr. 2.4.4 Based Indexed Adresleme Bu yntem dolayl adresleme yntemi ile benzerlik gstermektedir. Tek fark burada bir deil ,biri Base dieri Index register olmak zere iki farkl register kullanlmasdr. Hedef blgeye atanacak deer bu iki register ierisindeki deerin toplamnn gsterdii offset ierisindeki deerdir. MOV BX, D854 MOV SI, 278C MOV AL, [BX][SI] BX = 7A82 SI = 278C D854 + 278C = FFE0 MOV AL, [FFE0]

19

MOV BP, 54AC MOV DI, 4444 MOV AL, [BP][DI]

BP = 54AC DI = 4444 54AC + 4444 = 98F0 MOV AL, [98F0]

Yukardaki ilk rnekte n tanml segment Data Segment ve ikincide ise Stack Segmenttir. 2.4.5 Based Indexed + Sabit(Disp) Adresleme Bu yntem yukardaki btn yntemleri kapsar. Genel formu aadaki gibidir ve registerlar ierisindeki deer ile sabitin toplamnn verdii offset adresindeki deer ile ilem yaplr. MOV AL, DISP[BX][SI] MOV BL, DISP [BX+DI] MOV BH, [BP+SI+DISP] MOV AH, [BP][DI][DISP]

Blm 3 : 80x86 Komut Kmesi


Bu blmde Intel firmasnn 80x86 serisi ilemcilerini programlamak iin kullanlan assembly komutlarndan bir ksmn inceleyeceiz. Transfer komutlar MOV XCHG LEA PUSH PUSHF POP POPF LAHF SAHF Giri/k komutlar IN OUT Aritmetiksel Komutlar ADD ADC SUB SBB MUL IMUL DIV

20

IDIV INC DEC CMP Mantksal Komutlar AND OR XOR NOT TEST Kaydrma ve Dndrme Komutlar SAL/SHL SHR SAR RCL ROL RCR ROR Dallanma Komutlar JMP JZ/JE JNZ/JNE JB/JC/JNAE JBE/JNA JNB/JNC/JAE JG/JNLE JA/JNBE JL/JNGE JLE/JNG JS ve JNS JO ve JNO JCXZ Dng Komutlar LOOP LOOPZ/LOOPE LOOPNZ/LOOPNE 3.1 Transfer Komutlar Bu grup ierisindeki komutlar herhangi bir bilgiyi register-register, bellek-register ve registerbellek blgeleri arasnda transfer etmek iin kullanlr.

21

3.1.1 MOV Komutu MOV komutuna daha nce bellek adresleme blmnde ksaca deinilmiti. Bu ksmda komutun kullanm hakknda daha ayrntl bilgi verilecektir. Mov komutunun eitli kullanm biimleri aadaki gibidir. Genel Form : mov hedef, kaynak mov register, register mov bellek, register mov register, bellek mov bellek, sabit deer mov register, sabit deer Yukarda mov komutunun eitli kullanm ekilleri gsterilmitir. Dikkat ederseniz kullanm ekilleri arasnda bellek-bellek arasnda transfer yok. Yukardaki register ifadeleri hem genel amal registerlar hem de segment registerlarn temsil etmektedir. Yalnz, kesinlikle bir sabit deer dorudan bir segment registerna atlamaz. Byle bir ilem aadaki gibi iki aamada gerekletirilir. mov ax, 1234 mov cs, ax Yukardaki rnekte CS ierisine 1234h deeri atanmtr. Dikkat edilmesi gereken bir baka nemli nokta da transferi yaplacak deerlerin boylarnn ayn olmasdr. Yani AH ierisine 16-bitlik bir deer atams yaplamaz. Ayn ekilde 8-bitlik bir registerdan 16-bitlik bir resgistera da transfer yaplamaz. Herhangi bir bellek blgesi dolayl adresleme ile adreslenip ierisine sabit bir deer atanmak istendii zaman atanacak deerin uzunluu belirtilmelidir. mov [bx], 12 Hata !

mov byte ptr [bx], 12 yada mov word ptr [bx], 1234

byte ptr ve word ptr nekleri ile transfer edilecek bilginin boyu hakknda ilemciye bilgi verilmektedir. NOT: 32-bit ilemcilerde ( 80386 ve sonrasnda ) dword ptr neki ile 32-bit bilgi transferi yaplabilmektedir. MOV komutu flag registerlar zerinde herhangi bir deiiklik yapmamaktadr.

22

3.1.2 XCHG Komutu XCHG (exchange) komutu iki deeri karlkl olarak deitirmek iin kullanlr. Tabi yine deiiklik yaplacak deerlerin ayn boyda olmas gerekmektedir. Genel formu aadaki gibidir. xchg register, register xchg bellek, register xchg komutunun kullanmnda operandlarn yerleri nemli deildir. Yani xchg bellek, register ile xchg register, bellek ayn ii yapmaktadr. mov ax,1234 mov bx, 5678 xchg ax,bx AX=1234h BX=5678h AX=5678h BX=1234h

XCHG komutu flag registerlar zerinde herhangi bir deiiklik yapmamaktadr. 3.1.3 LEA Komutu LEA komutunun kullanm MOV komutu ile benzerlik gstermesine karn baz durumlarda programcya iki yada komut ile yaplacak bir ilemi tek komut ile yapma olana salamaktadr. Genel formu aadaki gibidir. lea register, bellek Komutun kullanmna birka rnek verince programcya salad kolaylklar daha basit anlalacaktr. lea ax, [bx] lea bx, 3[bx] mov ax, [bx] BX = BX+3

Yukardaki kullanmlar lea komutu dnda tek bir komut ile icra edilebilecek durumlardr. (BX = BX+3 ifadesinin assembly dilindeki karl daha anlatlmad iin normal bir gsterim kullanlmtr) Aadaki rnekler incelenirse komutun salad kolaylk aka fark edilecektir.

lea ax, 3[bx] lea ax, 8[bx+di]

BX = BX+3

mov ax, bx

LEA komutunun genel kullanm amac herhangi bir registera bir bellek adresi saklamaktr. Komut kullanm srasnda flag registerlar zerinde herhangi bir etki yapmamaktadr.

23

3.1.4 PUSH Komutu PUSH komutu herhangi bir bilgiyi bilgisayarn stack ad verilen blmne kaydetmek iin kullanlr. PUSH komutu ile stack zerine atlacak bilgi 16-bit uzunluunda olmaldr. Komutun genel formu aadaki gibidir. PUSH deer Yukarda deer ile gsterilen ksm daha ncede belirtildii gibi 16-bit uzunluunda olmaldr. Bunun yan sra deer ile gsterilen ksm sabit bir deer alamaz. Yani PUSH ile stack zerine yazlacak deer ya bir register ierisindeki deer yada bir bellek blgesindeki deer olmaldr. PUSH komutu ile stack zerine bilgi yazld iin SPnin deeri deimektedir. cra edilen her PUSH komutu SPnin deerini 2 azaltacaktr (PUSH ile 2 bayt bilgi aktarld iin). Aada PUSH komutu ile stack zerine bilgi aktarlmasna bir rnek verilmitir. mov ax,1234 push ax AX = 1234h AX > STACK , SP = SP-2

Stack zerine bilgi yazma ilemi gerekli deerlerin geici bir sre saklanmas iin ve baz UNIX sistemlerde kesme kullanmnda gerekli parametrelerin aktarlmas iin iaretiler ile birlikte kullanlr. 3.1.5 PUSHF Komutu PUSHF komutu ile PUSH komutuna benzer olarak stack zerine bilgi aktarlr. Yalnz burada tek fark, PUSHF komutu ile aktarlacak bilginin herhangi bir register yada bellek blgesinden deil de flag registerdan alnmasdr. Komutun kullanm aadaki gibidir. PUSHF Grld gibi komutun kullanm srasnda hibir register yada bellek adresi kullanlmamtr. Onun yerine stack zerine atlacak bilgi dorudan 16-bit uzunluundaki flag resigter ierisindeki deerdir. Komut herhangi bir ilem srasnda flag registern mevcut deerini korumak iin kullanlr. Yine PUSH komutunda olduu gibi PUSHF komutu da SPnin deerini 2 azaltacaktr. 3.1.6 POP Komutu POP komutu ile stack zerinden bilgi okumas yaplr. Yani PUSH komutu ile stack zerine yazlan bilgi POP komutu ile geri okunur. Okunan bilgi 16-bit uzunluunda olmaldr. POP komutu ile alnacak bilgi stack zerine yazlan son bilgidir. PUSH ve POP komutlar ile bilgi transferi yaplrken yazlan ve okunan bilgilerin sralamas nemlidir. Programlar yazlrken stack zerindeki ilemlerde hesaplama hatas yaplmas sk karlalan durumlardandr. Komutun genel kullanm aadaki gibidir. POP alc_alan Yukarda alc alan bir bellek blgesi veya register olabilir.

24

mov ax,1234 push ax mov ah,01 pop ax

AX = 1234h AX > STACK , SP = SP-2 AH = 01 ,AXin deeri deiti! AX = 1234h

rneimizde nce AXe bir deer atanyor ve daha sonra AHn deeri deitirilmek sureti ile dolayl olarak AXinde deeri deitiriliyor. Son ilemde de POP komutu ile AXin nceden stack zerine PUSH ile atlan eski deeri geri alnyor. 3.1.7 POPF Komutu POP komutu ile PUSH eletirilir ise PUSHF komutu ile de POPF komutunu eletirmek yanl olmaz. POPF komutu ile stack zerinden 16-bitlik bilgi flag registera yazlr. Alnan 16 bitin hepsi ilemci tarafndan dikkate alnmaz. Bitlerin word ierisindeki sralarna gre ilemci iin ifade ettikleri deerler aada verilmitir. 0. bit 2. bit 4. bit 6. bit 7. bit 8. bit 9. bit 10. bit 11. bit Carry biti Parity biti Auxilary biti Zero biti Sign biti Trap biti Interrupt biti Direction biti Overflow biti

POPF komutu anlalaca zere flag registern deerini tamamen deitirmektedir. Komut tpk PUSHF komutunda olduu gibi tek bana kullanlr. PUSH, PUSHF, POP ve POPF komutlarnn stack zerinde ileyilerini tam olarak kavrayabilmek iin yaznn daha nceki blmlerinde yer alan Stack ksmn tekrar okumanz tavsiye ederim. 3.1.8 LAHF Komutu LAHF (Load AH from Flags) komutu AH registerna flag registern dk seviyeli baytn kopyalar. Kopyalanan bitler sign, zero, auxilary, parity ve carry bitleridir. Bunlarn dnda kalan overflow, direction, interrupt ve trace bitlerinin komut ile bir ilgisi yoktur. Komutun kullanm aadaki gibidir. lahf Grld gibi komut tek bana kullanlmaktadr. Komutun icras srasnda flag registerda herhangi bir deiiklik olmaz. 3.1.9 SAHF Komutu SAHF (Store AH into Flags) komutu da LAHF komutu gibi flag register zerinde ilem yapar. AH ierisindeki deer flag registern dk seviyeli baytna kopyalanr. Yine ilemden

25

etkilenen bitler sign, zero, auxilary, parity ve carry bitleridir. Komutun kullanm LAHF komutunda olduu gibi tek banadr. 3.2 Giri/k Komutlar 80x86 serisi ilemcilerde giri ve k birimlerine ulamak iin in ve out komutlar kullanlr. Aslnda bu komutlar bir bakma MOV komutu ile benzer ekilde i yapmaktadr. Tek fark bu komutlarn zel olarak bilgisayarn G/ birimi iin ayrlm olan bellek blgesi ile almalardr. 3.2.1 IN Komutu in ax/al, port in ax/al, dx IN komutunun genel kullanm yukarda gsterilmitir. IN komutu ile port veya dx ile belirtilen port adresinden okunan bilgi boyutuna gre AX yada AL ierisine kopyalanr. Eriilmek istene port 0-255 arasnda ise port numaras kullanlr. Aksi taktirde, yani eriilmek istenen port 256 ve 80x86 ilemcinin maksimum destekledii port numaras olan 65535 arasnda ise istenen port numaras DX ierisine atlr ve daha sonra IN komutu ile eriim salanr. Komutun icrasnda flag register herhangi bir deiiklie uramaz. 3.2.2 OUT Komutu out port, ax/al out dx, ax/al OUT komutunun kullanm IN komutu ile benzerlik gstermektedir. Tek fark IN komutunda port ierisindeki bilgi AX/ALye atanrken OUT komutunda AX/AL ierisindeki bilgi porta gnderilir. Yine IN komutunda olduu gibi 0-255 aras adreslerde dorudan port numaras girilirken 256-65535 aras adreslerde DX ile adresleme yaplr. Komutun icrasnda flag register herhangi bir deiiklie uramaz. mov al, 2e out 70, al in al,71 AL = 2Eh 70h. Porta 2E deeri gnderiliyor Gnderilen istee karlk 71h. porttan geliyor. Gelen deer AL ierisine alnyor.

Yukarda OUT komutu ile 70h CMOS portuna bilgi yollanyor. CMOS gelen sinyale 71h portundan cevap veriyor ve biz gelen cevab IN komutu ile AL ierisine kaydediyoruz. 3.3 Aritmetiksel Komutlar 80x86 programcya toplama, karma, arpma, blme gibi temel aritmetiksel ilemlerin yan sra elde edilen sonular deiik biimlerde saklama olana salar. Aritmetiksel komutlarn icras srasnda flag register deiiklie uramaktadr.

26

3.3.1 ADD Komutu ADD komutu toplama ilemini gerekletirmek iin kullanlr. Genel formu aadaki gibidir. add hedef, kaynak ADD komutu ile kaynak ierisindeki deer hedef ile toplanp hedef ierisine kaydedilir. hedef ve kaynak alanlar register-register, bellek-register, register-bellek iftlerinden birisi olabilir. mov ax, 1234 mov word ptr [4444], 1000 add word ptr ax, [4444] AX = 1234h [4444] = 1000h AX = AX + [4444] = 1234h + 1000h = 2234h

Yukardaki rnekte ilk nce AXe 1234h deeri atanmtr. Daha sonra 4444h adresli bellek gzne word uzunluklu 1000h deeri yazlmtr (Bu ilem iin iki bellek gz kullanlmtr). En son olarak da AX ierisindeki deeri 4444h bellek gz ile iaret edilen word ile toplanp sonu yine AX ierisine atlmtr. 3.3.2 ADC Komutu ADC komutu da tpk ADD komutu gibi toplama ilemi iin kullanlr. Tek fark ADC komutunda toplama bir de carry flagn deerinin eklenmesidir. Genel formu aadaki gibidir. adc hedef, kaynak Yaplan ilemi aritmetiksel olarak gstermek gerekirse aadaki gsterim yanl olmayacaktr. hedef = hedef + kaynak + carry flagn deeri ADC komutu ile pe pee yaplan toplama ilemlerinde eldelik saynn gz ard edilmemesi salanmaktadr. 3.3.3 SUB Komutu SUB komutu karma ilemi iin kullanlr. Kullanm ADD komutunda olduu gibidir. sub hedef, kaynak kaynak ierisindeki deer hedef ierisinden kartlp sonu hedef ierisinde saklanr. lemin aritmetiksel gsterimi hedef = hedef kaynak

27

eklindedir. Aslnda CPU, SUB komutu ile hedef ile -kaynak deerlerini toplamaktadr. Gerekte yaplan ilem yine bir toplama ilemidir. mov ax, 8da7 mov bx, 4a43 sub ax, bx AX = 8DA7h BX = 4A43h AX = AX BX = 8DA7h 4A43h = 4364h

3.3.4 SBB Komutu sbb hedef, kaynak SBB komutu ile SUB arasndaki iliki, ADD komutu ile ADC arasndaki iliki ile ayndr. SUB komutu ile ayn ie yaplr yalnz burada hedef alana atlan deerden carry flagn deeri de kartlr. lemin aritmetiksel gsterimi hedef = hedef kaynak carry flagn deeri 3.3.5 MUL Komutu MUL komutu arpma ilemini gerekletirmek iin kullanlan komuttur. Aritmetiksel olarak arpma ilemi iki deer ile gerekletirilmesine karn MUL komutu sadece bir deer alr. MUL komutu ile kullanlan deer gizli olarak ax/al ierisindeki deer ile arpma ilemine tabi tutulur. mov ax,0045 mov bx,11ac mul bx AX = 0045h BX = 11ACh AX = AX * BX = 0045h * 11Ach = C35Ch

Yukarda arpma ileminin bir elaman olan 0045h says AX ierisine atlmtr. Bir sonraki admda ileme sokulmak istenen dier say olan 11ACh says BX ierisine atldktan sonra mul bx komutu ile BX ierisindeki say dorudan AL (AH=00) ile ileme sokuluyor ve elde edilen arpm AX ierisinde saklanyor. mov ax, 0005 mov word ptr [4000], 1212 mul word ptr [4000] AX = 0005h [4000] = 12 , [4001] = 12 AX = AX*[4001][4000]

28

Yukarda arpma ilemi iin kullanlacak ikinci saymz bir bellek blgesinden okunmaktadr. Dikkat ederseniz ilemlerimde word ptr ile atama yaptm deerin uzunluu hakknda ilemciye bilgi veriyorum. MUL komutunu kullanrken ilem yapacanz say bir bellek blgesinde ise word ptr ve byte ptr gibi yardmc bilgilerle ilemciye zerinde ilem yaplacak bilginin uzunluu hakknda bilgi vermeniz gerekmektedir Diyelim ki arpma ilemi sonunda bulduunuz sonu 16-bitlik bir alana smyor. Byle bir durumda bulunan sonu DX:AX ikilisi ierisinde saklanr. mov ax, 4321 mov cx, 4586 mul cx AX = 4321h CX = 4586h AX * CX = 4321h * 4586h = 123B0846h (32-bit) = DX = 123Bh , AX = 0846h

3.3.6 IMUL Komutu IMUL komutu da MUL komutu gibi arpma ilemi iin kullanlr tek fark IMUL komutunun iaretli saylar zerindeki ilemler iin kullanlan bir komut olmasdr. IMUL komutu ile gerekletirilen bir ilem sonucunda AH (sonu AX ierisine syor ise) veya DX (sonu AX ierisine smyor ise) sfrdan farkl ise arpma ileminin sonucu negatiftir. Eer ilem sonucunda bir tama olmu ve AH veya DX ierisinde sonucun iaretine deil de kendisine ait bir deer varsa carry ve overflow flaglar set edilmi olacaktr. 3.3.7 DIV Komutu Blme ilemi iin kullanlan bir komuttur. DIV komut da MUL komutundan olduu gibi sadece bir deer ile ileme girer ve gizli olarak AX registern kullanr. Genel formu aadaki gibidir. div blen_deer Blme ileminde blen_deeriin uzunluu, ilem srasnda kullanlacak blnen deerin uzunluunu da belirler. Szgelimi, blen_deeriin 8-bitlik bir deer olmas halinde blnen olarak 16-bitlik AX register ileme alnacaktr. lem sonunda blm deeri AL, kalan deeri de AH ierisine kopyalanr. Ayn ekilde blen_deeri 16-bitlik bir deer ise blnn deeri olarak DX:AX ifti ileme alnr. Yine ilem sonundaki blm deeri AX ve kalan deeri de DX ierisine atlr. 8-bitlik bir sayy yine 8-bitlik bir sayya ve 16-bitlik bir sayy yine 16-bitlik bir sayya blmek iin srasyla AH ve DX registerlarna 0 deeri atanr. blen_deer olarak bir bellek blgesi kullanlmas halinde ilemciye kullanlan deerin uzunluu hakknda bilgi verilmelidir. mov ax, 4a2c div byte ptr [2155]

29

DIV komutunu kullanrken dikkat edilmesi gereken bir husus da sfr ile blme durumu ile karlamamak ve blm ksmndaki deerin alc alana sp smaddr. Mesela aadaki gibi bir ilem sonunda hata ile karlalacaktr. mov ax, aaaa div 4 Yukardaki ilemin sonucu ( AAAAh / 4H = 2AAAH 16-bit ) olan 2AAAh says 8-bit bir register olan AL ierisine smayaca iin hatal olacaktr. 3.3.8 IDIV Komutu IDIV komutu DIV komutu gibi blme ilemi iin kullanlr. DIV komutundan fark, IDIV komutunun iaretli saylar zerinde ilem yapmak iin kullanlmasdr. DIV komutu iin yukarda anlatlanlarn dnda IDIV komutunun kullanmnda dikkat edilmesi gereken bir nokta AH veya DX deerleri sfrlanrken saynn iaret bitinin korunmasdr. Mesela ileme konulacak blen deer 8-bit bir negatif say ve blnen de 8-bit bir say ise AHn btn bitlerine AL ierisindeki 8-bitlik negatif saynn iaret biti olan 1 deeri atanmaldr. 3.3.9 INC Komutu INC komutu kendisine verilen register yada bellek blgesi ierisindeki deeri bir arttrr. C dilindeki ++ komutu ile ayn ii yapmaktadr. Aada, komutun kullanmn C dilindeki gibi gstermeye altm. mov ax, 000f inc ax degisken = 15 ; degisken++ ;

Flag register zerinde, carry flag dnda, ADD komutu ile ayn etkiyi yapar. add ax,1 inc ax Yukardaki iki komut da ayn ii yapmaktadr. Fakat INC komutu ile gerekletirilen ilem, ilemci tarafndan daha hzl bir ekilde gerekletirilir ve bellekte kaplad alan ilkinin te biri kadardr. Bu sebeplerden add ax,1 gibi kullanmlar yerine inc ax komutu kullanlmaktadr. inc byte ptr [125a] inc word ptr [7ad8] inc byte ptr [bx+di]

30

Bir bellek blgesindeki deer INC komutu ile ileme alnacaksa, ilemciye zerinde ilem yaplacak bilginin uzunluu belirtilmelidir. 3.3.10 DEC Komutu DEC komutu kendisine verilen register yada bellek blgesi ierisindeki deeri bir azaltr. Yine INC komutundan olduu gibi C dilinden bir rnek vermek istiyorum. mov ax, 000f dec ax degisken = 15 ; degisken-- ;

Yukarda da grld gibi DEC komutu C dilindeki -- komutuna karlk gelmektedir. DEC komutu ile yaplan bir azaltma ilemi sub ax,1 komutu ile de gerekletirilebilirdi fakat DEC komutu SUB komutuna gre bellekte daha az yer kaplar ve daha hzl alr. dec word ptr a8[bx+di] DEC komutu ile azaltlacak deer bir bellek blgesinde ise deerin uzunluu word ptr yada byte ptr ile ilemciye bildirilmelidir. 3.3.11 CMP Komutu CMP komutu SUB komutu gibi alr. cmp deger1, deger2 Yukarda deger1 ve deger2 yerine srasyla register-register, register-bellek blgesi, bellek blgesi-register ve register-sabit deer deerleri kullanlabilir. CMP komutu ksaca deger1den deger2yi karmaktadr. Fakat SUB komutundan farkl olarak sonu herhangi bir yere kaydedilmez. Onun yerine, ilem sonucunda deien flag register bitlerinin deerine gre programda dallanma yaplr. CMP komutundan sonra sonuca gre genellikle koullu dallanma komutlar ile programn ak deitirilir. cmp ax, bx Komut flag register zerinde ksaca u gibi etkilerde bulunur : AX, BXe eit ise ilemin sonucu sfr olur ve zero flag 1 deerini alr. AXin deeri BXinkinden kk ise karma ilemi sonunda carry flag 1 deerini alr. Sonu negatif ise sign biti 1, pozitif ise 0 deerini alr.

31

3.4 Mantksal Komutlar Bu komutlar herhangi bir ilem srasnda mantksal karlatrmalar yapmak iin kullanlr. Blm ierisindeki komutlar incelenmeden nce dokmann Bitler zerinde Mantksal lemler ksmnn tekrar gzden geirilmesinde fayda var. Bu komutlar icra grrken kullanlan register yada bellek blgesinin ierisindeki deerler ayr ayr bitler halinde ileme sokulur. 3.4.1 AND Komutu and hedef, kaynak Komutun kullanmnda hedef ve kaynak alanlarna srasyla register-register, bellek blgesi-register, register-bellek blgesi, register-sabit deer ve sabit deer-register iftlerinden biri kullanlabilir. lem srasnda hedef ve kaynak blgesindeki deerler mantksak VE ilemine sokulur ve ilemin sonuncu hedef alana kaydedilir. mov ah, a5 mov al, c1 and ah, al AH = A5h = 1010 0101 (binary) AL = C1h = 1100 0001 (binary) AND_________________ 1000 0001 (binary) = 81h

Yukarda AHa A5h ve ALye C1h deerleri atanm ve daha sonra and ah, al komutu ile iki deer mantksal ve ilemine sokulmutur. lem sonucunda 81h deeri elde edilmitir. Elde edilen deer AH registeri ierine atlmtr. 3.4.2 TEST Komutu TEST komutu tamamen AND komutu gibi alr. Tek fark elde edilen sonucun hedef alana aktarlmamas onun yerine deien flag bitlerine gre programn aknn kontrol edilmesidir. 3.4.3 OR Komutu or hedef, kaynak OR komutu mantksal veya ilemini gerekletirmek iin kullanlr. hedef ve kaynak alanlar yerine kullanlabilecek deerler AND komutu ile ayndr. lem gerekletikten sonra elde edilen sonu hedef alan ierisine kaydedilir. 3.4.4 XOR Komutu xor hedef, kaynak hedef ve kaynak alanlar iin kullanlabilecek deerler AND komutu ile ayndr. lem sonucunda elde edilen deer hedef alan ierisine kaydedilir. XOR komutu herhangi bir registern deerini sfr yapmak iin ska kullanlr. xor ax, ax komutu mov ax, 0 komutundan daha hzl alr ve bellekte daha az yer kaplar.

32

3.4.5 NOT Komutu not hedef NOT komutu dier mantksal komutlardan ayr olarak flag register zerine etki etmeyen tek komuttur. Kullanm ekli ile de dier komutlardan farkllk gsterir. hedef alan ierisindeki deerin bitleri ters evrilip yine ayn alana yazlr. 3.5 Kaydrma ve Dndrme Komutlar Bu blmde daha nce anlatlan Shift ( Kaydrma ) ve Rotate ( Dndrme ) lemleri balkl ksmdaki ilemlerin assembly komutlar ile gerekletirilmesi anlatlacaktr. 3.5.1 SHL/SAL Komutlar SHL (Shift Left) ve SAL (Shift Arithmetic Left) komutlar etir. shl hedef, saya Her iki komut da hedef alan ierisindeki bit pozisyonunu saya defa sola kaydrr. Kaydrma ilemi srasnda 0. bit pozisyonuna sfr yazlr ve 7. veya 15. bit pozisyonundaki deer de carry flag ierisine yazlr. 3.5.2 SHR Komutu SHL (Shift Right) komutunun kullanm aadaki gibidir. shr hedef, saya SHR komutu ile hedef blgesindeki bayt dizilimi saya defa saa kaydrlr. Saa kaydrma ileminde bota kalan 7. yada 15. bit pozisyonuna 0 deeri atanr ve 0. Bit pozisyonundaki deer de carry flaga yazlr. Sign biti sonucun her zaman sfr olan yksek seviyeli bit deerini alr. Aritmetiksel olarak herhangi iaretsiz bir sayy SHR say, a ilemine sokmak, sayy 2 ile blmek ile ayn eydir. 3.5.3 SAR Komutu sar hedef, saya SAR (Shift Arithmetic Right) komutu SHR komutunda olduu gibi hedef alan ierisindeki bit dizilimini saya kere saa kaydrr. SHR komutundan fark, sondaki 7. veya 15. bit pozisyonuna sfr deil de yine 7. veya 15. bit pozisyonundaki deerin yazlmasdr. Flaglar zerine etkisi, SHRden farkl olarak, sign flag ierisine 7. veya 15. bit pozisyonundaki deerin yazlmasdr.

33

3.5.4 RCL Komutu rcl hedef, saya RCL (Rotate through Carry Left) komutu hedef alandaki bit diziliini sola dndrme hareketine sokar. lem sonrasnda carry flag ierisindeki deer 0. bit pozisyonuna yazlr ve arta kalan bit de carry flag ierisine aktarlr. 3.5.5 ROL Komutu rol hedef, saya ROL (Rotate Left) komutu da RCL komutu gibi sola dndrme ilemi iin kullanlr. Tek fark en sonda bo kalan 0. bit pozisyonuna carry flagn deerinin deil de en yksek seviyeli bitin deerinin yazlmasdr. Bu ilemde de yine yksek seviyeli bit deeri carry flag ierisine kopyalanr. 3.5.6 RCR Komutu rcr hedef, kaynak RCR (Rotate through Carry Right) komutu da aynen RCL komutu gibi almaktadr. Adndan da anlalaca gibi tek fark sadece dndrme ileminin sola deil saa doru yaplmasdr. Yine dk seviyeli bit pozisyonundaki deer carry flag ierisine ve carry flag ierisindeki deer de yksek seviyeli bit pozisyonuna kopyalanr. 3.5.7 ROR Komutu ror hedef, kaynak ROR (Rotate Right) komutunu RCR komutu ile ROL komutunu RCL komutu ile ilikilendirdiimiz ekilde ilikilendirebiliriz. Yani ROR komutu da RCR komutu gibi almaktadr. Tek fark ROR komutundan yksek seviyeli bit pozisyonuna atanan deer carry flag ierisindeki deil alak seviyeli bit pozisyonu iindeki deerdir. NOT: Yukarda shift ve rotate ilemlerini gerekletirilen komutlarda kullanlan saya ifadesi normalde 1 olarak kullanlr. 80286 ve sonras ilemcilerde herhangi bir sabit deer kullanm getirilmitir. Daha nceki ilemcilerde 1 dnda bir deer kullanmak iin aadaki yol izlenmelidir. mov cl, saya shr ax, saya Yukardaki gibi CL ierisine istenilen deer atanr ve daha sonra hedef alan ile ileme sokulur.

34

3.6 Dallanma Komutlar Dallanma komutlar, programn normalde yukardan aa doru giden akn herhangi bir koula bal olarak yada koulsuz olarak baka bir yere ynlendirmek amac ile kullanlr. Kullanlan bu dallanma komutlar yksek seviyeli dillerdeki if veya goto komutlar gibi dnlebilir. Assembly dilinde kullanlan dallanma komutlar atlama yaptklar yere gre FAR veya NEAR zellii tar. NEAR zellii tayan komutlar 2-3 bayt yer tutarken FAR zellikli olanlar 5 bayt yer tutmaktadr. Komutlar arasndaki fark, FAR zellii tayanlarn farkl segment ierisindeki noktalara dallanma iin kullanlmasdr. Gerekli olmamakla beraber dallanmann tr FAR PTR yada NEAR PTR ile belirtilebilir. 3.6.1 JMP (Koulsuz Dallanma) Komutu jmp hedef JMP komutu belirtilen herhangi bir noktaya koulsuz olarak dallanma yamak iin kullanlr. DEBUG kullanlarak yazlan programlarda gidilecek noktann offset adresi hedef ksmna yazlr. Eer farkl bit segment ierisindeki bir adrese dallanma yaplyorsa hedef ksmnda SEGMENT:OFFSET eklinde bir adresleme kullanlr. Eer ayn segment ierisinde 128 veya +127 baytdan daha uzak noktalara dallanma yaplyorsa bu dallanma da FAR zellii tar. Bellekte kaplad alan 3 bayt olacaktr. Aslnda JMP komutu ile yaplan sadece IP deerine gidilecek_adres - bulunulan_adres deerini eklemektir. JMP komutunun icras srasnda IPye eklenecek deer JMP komutundan bir sonraki komutun adresinden itibaren hesaplanr. Dallanama yaplrken dorudan gidilecek adres yazlmayp, bellek adresleme yolu ile de ilem gerekletirilebilir. mov bx, 0401 mov si, 0002 mov word ptr [bx+si+04], 1a8c jmp far ptr [bx+si+04] Yukardaki rnek JMP komutu ile gidilecek nokta BX+SI+04 = 0407h deeri deil ayn segment ierisinde 0407h numaral offset ierisindeki deerin gsterdii yerdir. rneimizde bu deer 1A8Ch deeridir. Benzer ekilde herhangi bir genel amal16-bit register kullanlarak da dallanma ilemi gerekletirilebilir. mov ax, 1111 jmp ax Yukarda JMP AX komutundan sonra programn ak 1111h numaral offset adresinden devam edecektir.

35

Baka bir segment ierisine dallanma yapmak iin SEGMENT:OFFSET kalb kullanlr. Yani 4C70:0100 adresine dallanma yapmak iin JMP 4C70:0100 komutunu kullanmak gerekir. Komut bellekte 5 bayt yer kaplayacaktr. Yukarda ele alnan JMP komutu dnda assembly dilinde kullanlan koullu dallanma komutlar da vardr. Bu komutlar herhangi bir ilem sonucunda flag registerlarn deerine gre programn akn etkilerler. Bu komutlar Cdeki if ve Pascaldaki if...then kalb ile eletirilebilir. Karlatrma ilemi herhangi bir aritmetiksel ilem olabilecei gibi bir karlatrma (CMP) yada dndrme olabilir. Fakat koullu dallanma komutlar ounlukla CMP komutundan sonra karlatrma amal kullanlr. 3.6.2 JZ/JE Komutlar JZ/JE (Jump if Zero/Jump if Equal) komutlar herhangi bir ilem sonrasnda zero flagn deerine gre programn akn dzenler. Komutun icras srasnda zero flag ierisindeki bit deeri 1 ise program JZ komutu ile gsterilen yere atlar aksi taktirde ilemci JZ komut yokmu gibi programn akna devam eder. dec cx cmp cx,0 jz 010a jmp 0110 Yukardaki rnekte CX ierisindeki deer bir azaltlyor. Daha sonra elde edilen deer sfr ile karlatrlyor ve eer sonu sfr ise 010Ah adresine atlanyor. Sonu sfrdan farkl ise program normal akna devam ediyor ve bir sonraki komut olan JMP 0110 altrlyor. Bu sefer koulsuz olarak 0110h adresine bir dallanma yaplyor. rneimizdeki yazm ekli DEBUG ierisinde kullanlan yazm eklidir. Assembly programlarn bir assembler program aracl ile birletiren programclar iin yazm ekli biraz daha farkldr. Assembler kullanan programclar offset adresleri yerine programn eitli yerlerine koyduklar etiketleri kullanrlar. .model small .code org 0100h basla: mov dl,41h mov ah,02h int 21h dongu: inc dl int 21h cmp dl,5Ah jnz dongu mov ah,4Ch

36

int 21h end basla

Yukarda MASM ile yazlm bir assembly program grlmektedir. Bu aamada program anlamaya almayn yalnzca program ierisinde kullanlan etikete dikkat edin. INC DL komutunun olduu satr dongu etiketi ile iaretlenmitir. JNZ dongu komutu ile bir offset adresi belirtilmeyip bir etiket yardm ile istenilen noktaya atlama yaplmtr. Yukarda DL ierisindeki deer 41htan balayp 5Ah olana kadar arttrlmaktadr. Pratikte, DEBUG program yazmak iin uygun bir ortam deildir. Yazacanz assembly programn herhangi bir assembler yazlm ile birletirip kullanrsnz. Yukardaki program COM dosyas olarak derlenirse 19 bayt alan kaplar ve ekrana alfabedeki byk harfleri yazar. 3.6.3 JNZ/JNE Komutlar JNZ/JNE (Jump if Not Zero/Jump if Not Equal) komutlar JZ ve JE komutlarnn ztt olarak kullanlr. Herhangi bir ilem sonrasnda zero flag ierisindeki deer sfr deil ise program komutun gsterdii yere dallanarak akna devam eder. rnek olarak JZ iin verilen MASM program incelenebilir. jnz dongu komutu ile zero flag ierisindeki deer kontrol ediliyor. Deerin sfrdan farkl olmas halinde dongu ile iaretli yere gidiliyor ve dng tekrar iletiliyor. En son olarak DL ierisindeki deer 5Aha ulanca programn ak bir sonraki komut olan mov ah, 4ch satrna geiyor. Yukardaki program ile ayn ii yapan C programn aada verdim. Assembly ile yazla COM dosyasnn boyu 19 bayt iken C ile yazlannki 8378 bayt! #include <stdio.h> int main() { int ch=65; /* hex 41 */ dongu: if (ch!=90) /* hex 5A */ { printf("%c",ch); ch++; goto dongu; } return 0; }

37

C rneinde, ilk programdaki cmp ve jnz ile gerekletirilen ilemler if ve goto deyimleri ile gerekletirilmitir. 3.6.4 JB/JC/JNAE Komutlar JB/JC/JNAE (Jump if Below/Jump if Carry/Jump if Not Above or Equal) komutlar carry flagn deerine gre dallanma gerekletirirler. Herhangi bir ilem sonrasnda carry flag ierisinde 1 deeri varsa programn ak JB komutu ile gsterilen yere gider. Aksi taktirde JB komutu dikkate alnmadan programn normal akna devam edilir. 3.6.5 JBE/JNA Komutlar JBE/JNA (Jump if Below or Equal/Jump if Not Above) komutlarnn icras srasnda carry ve zero flaglar kontrol edilir. Bir ilem sonrasnda iki flagdan birinin 1 olmas durumunda JBE komutu ile gsterilen noktaya dallanma yaplr. 3.6.6 JNB/JNC/JAE Komutlar JNB/JNC/JAE (Jump if Not Below/Jump if Not Carry/Jump if Above or Equal) komutlarndan birisi ile karlald zaman CPU carry flagn deerini kontrol eder. Carry flag ierisindeki deerin sfr olmas halinde JNB komutu ile gsterilen noktaya dallanma gerekletirilir. 3.6.7 JG/JNLE Komutlar JG/JNLE (Jump if Greater than/Jump if Not Less than or Equal) komutlarnn gereklemesi iin gerekli koul sign ve overflow flaglarnn deerlerinin eit olmas veya zero flag ierisinde sfr deerinin bulunmasdr. Gerekli koullarn salanmas halinde JG komutu ile gsterilen noktaya dallanma yaplacak ve programn ak o noktadan devam edecektir. 3.6.8 JA/JNBE Komutlar JA/JNBE (Jump if Above/Jump if Not Below or Equal) komutlarnn icras srasnda dikkate alnan flaglar carry ve zero flaglardr. Eer herhangi bir ilem sonrasnda bu iki flag bitinin de deeri sfr ise programn ak JA komutu ile gsterilen yerden devam eder. ki flag bitinden birisinin sfr olmamas halinde program normal akna devam edecektir. 3.6.9 JL/JNGE Komutlar JL/JNGE (Jump if Less than/Jump if Not Greater or Equal) komutlarnn gereklemesi iin gerekli koul carry ve overflow flag bitlerinin birbirinden farkl deerler tamasdr. ki bitin farkl deerler iermesi durumunda programn ak JL komutu ile gsterilen noktaya ynlendirilir. 3.6.10 JLE/JNG Komutlar JLE/JNG (Jump if Less than or Equal/Jump if Greater) komutlarnn icras srasnda zero, sign ve overflow flaglarnn deerleri dikkate alnr. Komut ile gsterilen yere dallanmak iin zero flag ierisinde 1 deerinin olmas yada sign ve overflow flaglarnn deerlerinin farkl olmas gerekmektedir. Gerekli koul salanrsa programn ak JLE komutu ile gsterilen noktaya kaydrlacaktr. 3.6.11 JS ve JNS Komutlar JS (Jump if Sign) ve JNS (Jump if No Sign) komutlarnn icras srasnda sign flag kontrol edilir. Sign flag ierisindeki deerin 1 olmas JS iin, sfr olmas JNS iin gerekli kouldur.

38

Gerekli koulun salanmas durumunda program JS veya JNS komutu ile gsterilen noktadan akna devam edecektir. 3.6.12 JO ve JNO Komutlar JO (Jump if Overflow) ve JNO (Jump if No Overflow) komutlarnn icras srasnda overflow flag ierisindeki deere baklr. Overflow flag ierisinde 1 JO komutu iin ve sfr olmas JNO komutu iin gerekli kouldur. 3.6.13 JCXZ Komutu JCXZ (Jump if CX is Zero) komutu CX registernn deerini kontrol eder. Eer CX ierisindeki deer sfr ise program JCXZ komutu ile gsterilen yerden akna devam eder. Yukarda verilen koullu dallanma komutlar ile sadece +128/-128 baytlk bir atlama gerekletirilebilir. Eer program ierisinde daha uzak bir mesafeye dallanma yapmak gerekiyorsa aadaki gibi bir yol izlenmelidir. JMP komutu ile istenilen noktaya dallanma yaplr JMP komutundan sonraki noktaya bir etiket verilir Kullanlacak komutun tersi JMP komutunun nne yazlarak JMP komutundan sonraki etikete dallanma yaplr rnein DEBUG ierisinde 0100 numaral offsetde iken JE 184 komutunu veremezsiniz. Bu komutu altrmak iin yapmanz gerekenler srasyla ???? : 0100 jne 105 ???? : 0102 jmp 184 ???? : 0105 komutlarn vermektir. Dikkatli bir ekilde incelenirse yukardaki komut kmesinin JE 184 komutu ile ayn eyi yapt grlecektir. 3.7 Dng Komutlar Bu kategorideki komutlar herhangi bir rutini belirli kereler tekrarlamak iin kullanlr. Assembly dilinde kullanlan dng komutlar bir bakma C dilindeki for ve while dngleri ile eletirilebilir. 3.7.1 LOOP Komutu Bu komut herhangi bir durumu belirli kereler tekrarlamak iin kullanlr. Saya olarak CX register ierisindeki deer alnr. Her dngde CX ierisindeki deer bir azaltlr ve CXin deeri sfr oluncaya kadar ilem devam eder. Komutun genel kullanm kalb aadaki gibidir. loop hedef hedef ile belirtilen deer DEBUG iin bir offset adresi, herhangi bir assembler kullanlarak birletirilecek bir program iin bir etiket olmaldr. LOOP komutu ile yaplabilecek maksimum atlama +128/-128 bayttr. Komutun kullanm gerei atlanlacak nokta LOOP komutundan nceki adreslerden birisi olduu iin maksimum gidilebileceimiz adres 128 bayt mesafededir.

39

1E27:0100 XOR AX, AX 1E27:0102 MOV CX,0005 1E27:0105 INC AX 1E27:0106 LOOP 0105 Yukardaki programn sonunda AXin deeri 5 olacaktr. Programn banda CX ierisine atlan 5 deeri LOOP ile gerekletirilecek dng saysn belirlemektedir. 1E27:0100 XOR AX, AX 1E27:0102 MOV CX,0005 1E27:0105 INC AX 1E27:0106 DEC CX 1E27:0107 JNZ 0105 Yukardaki program bir nceki rnekteki program ile ayn ilemi gerekletirmektedir. Tek fark LOOP 0105 komutu yerine INC CX ve JNZ 0105 komutlarnn kullanlmasdr. Gerekte de LOOP ile yaplan bu iki komutun yapt ilemden baka bir ey deildir. 3.7.2 LOOPZ/LOOPE Komutlar LOOPZ/LOOPE komutlar da herhangi bir durumu belirli kereler tekrarlamak iin kullanlr. Komutun kullanm LOOP komutu ile ayndr. Tek fark LOOPZ komutu icras srasnda CX registernn deerinin yan sra zero flag da kontrol eder. CXin deeri sfrdan farkl olduu srece ve zero flag ierisindeki deer 1 olduu srece komut ile gsterilen yere dallanma yaplr. Her iki durumdan birisinin gereklememesi halinde dngden klr. 3.7.3 LOOPNZ/LOOPNE Komutlar LOOPNZ/LOOPNE komutlar da LOOP komutu gibi CX registern saya olarak kabul ederek bir koulu belirli kereler tekrar etmek iin kullanlr. Dng ilemi CXin deeri sfrdan farkl iken ve zero flag ierisindeki deer 1 deil iken devam eder.

Blm 4 : Kesme (Interrupt) Kullanm


Normal olarak ilemci, kod segment ierisindeki komutlar sras ile iletir. Baz durumlarda bilgisayara ait evre aygtlar ile ilem yapmak zere, RAM veya BIOS zerindeki belirli rutinleri kullanmak zere yada baz geersiz sonularn olumas durumunda ilemci tarafndan kesme (interrupt) ad verilen rutinler altrlr. Benim burada ksaca deineceim RAM yada BIOS zerinde tanml alt rutinlerin programlar tarafndan arlmas ile oluan kesmelerdir. Bu alt rutinler bir ok ii programcnn yerine yapmaktadr. Bu alt rutinleri yksek seviyeli dillerdeki hazr ktphane fonksiyonlar ile eletirmek yanl olmaz. Kullanlabilecek her kesmenin nceden tanml bir numaras vardr. Kesmenin kullanm bu numarann INT komutuna parametre olarak aktarlmas ve gerekli registerlara deerlerin atanmas ile gerekletirilir. rnek olarak DOS altnda ok sk kullanlan INT 21 verilebilir. Bir DOS kesmesi olan INT 21in AH = 01 numaral fonksiyonunu kullanalm.

40

lem iin AH registernn deeri 01h olmal ve ardndan INT 21 komutu ile kesme arlmaldr. INT 21 komutu ile kesme arld zaman AH ierisindeki deere baklr. AH ierisinde bulunan deere gre altrlacak alt rutin bellee yklenir.
C:\WINDOWS\Desktop>debug -a 100 1E27:0100 mov ah,01 1E27:0102 int 21 1E27:0104 cmp al,41 1E27:0106 jnz 100 1E27:0108 mov ah,4c 1E27:010A int 21 1E27:010C -g ssdfaA C:\WINDOWS\Desktop>

Yukardaki program AH ierisine 01h deerini atadktan sonra INT 21 komutu ile gerekli komutlar bellee yklyor. Program klavyeden girilen tular okur, okunan her tu deerinin ASCII kodu AL ierisine yazlr (INT 21 AH=01h gerei). CMP komutu ile okunan tuun deeri 41h (A) olana kadar programn altrmasn salyoruz. Daha sonra yeni bir INT 21 alt rutini ile karlayoruz. AH = 4Ch alt rutini altrlmakta olan programdan kp kontrol tekrar DOS iletim sistemine brakmaktadr. Ayn ekilde, UNIX ve benzeri iletim sistemlerinde de sistem arlar (system calls) denen alt rutinler INT 80 ile bellee yklenip icralar gerekletirilmektedir. Bu dokmanda sekmelerin fonksiyonlar tek tek ele alnmayacaktr. Konu hakknda edinilebilecek en ayrntl kaynak Ralf Browns Interrupt List adl dokmandr. Dokmanlarn yannda RBILViewer adl yardmc program da size uzun kesme listelerini dzenli bir ekilde grntleme olana salayacaktr.

Blm 5 : DEBUG Program


DEBUG, MS-DOS altnda kullanlan ve kullancya altrlabilir dosyalar bellek zerinde deitirip kaydedebilme olana salayana bir yazlmdr. Bugn piyasada ayn ii yapan ok daha fonksiyonel ve gelimi programlar mevcuttur fakat DEBUGn MS-DOS ile birlikte gelmesi programn elde edilmesi konusundaki zorluu ortadan kaldrmaktadr. Bu blmde DEBUG program ierisinde kullanlan baz komutlar rnekleri ile ele aldm. DEBUG programn balatmak iin MS-DOS kipinde debug komutun vermeniz yeterlidir. Komutu verdikten sonra aadaki gibi bir ekran grnts ile karlarsnz.

Microsoft(R) Windows 98 (C)Telif Hakk Microsoft Corp 1981-1999. C:\WINDOWS\Desktop>debug -

41

Yukardaki ekran debug programn ilk altrdnz zaman karnza gelecek ekrandr. Program alt zaman sadece ekrann sol kenarnda bir izgi belirir. Bu aamada debug sizden bir sonraki ilem iin komut beklemektedir. Aadaki tabloda en ok kullanlan komutlar aklamalar ile birlikte verdim. A Assemble G Go L Load N Name Q Quit R Register T Trace U Unassemble W - Write ? - Yardm Belirli bir adresten itibaren program yazm Bellekteki programn altrlmas Bellee ykleme yaplmas Yklenecek veya yazlacak programn ismi DEBUGtan kmak Register deeri atama Adm adm iletim Ykl programn datlmas Bellekten diske yazma ilemi Kullanlabilecek komutlarn listesi

Yukarda sadece kullanacamz komutlar aklamalar ile birlikte verdim. imdi isterseniz MS-DOS kipinde debug altrp bir program yazalm ve program diske kaydedelim.
C:\WINDOWS\Desktop>debug -A 100 1E27:0100 mov ah,02 1E27:0102 mov dh,07 1E27:0104 mov dl,0c 1E27:0106 int 10 1E27:0108 mov ah,4c 1E27:010A int 21 1E27:010C -N set_curs.com -R CX CX 0000 :000C -W 0000C bayt yazlyor -

Yukardaki program ile imle DH ve DL ile belirtilen noktaya tanyor. ncelikle programn debug ierisinde yazlmas iin A komutu kullanld. A komutu ile kullanlan 100 parametresi programn yazlmaya balanaca offset adresini gsteriyor. Yazacamz program bir COM dosyas olduu iin balang offseti 0100 olarak belirledik. Bir sonraki satrda assembly programmz yazmaya baladk. Programn yazm ksm bittikten sonra N komutu ile bellekte bulunan bilgiyi diske yazacamz zaman kaydedilecek dosya ismini belirledik. R komutu ile CX register ierisindeki deere programmzn bayt olarak uzunluunu atyoruz (rneimizde 010C 0100 = 000C ). En son olarak da W komutu ile bellekteki komutlar set_curs.com dosya ad ile diske kaydediliyor. imdi de yazdmz program tekrar DEBUG yardm ile datalm.

42

C:\WINDOWS\Desktop>debug -N set_curs.com -L -U 1E4A:0100 B402 MOV 1E4A:0102 B607 MOV 1E4A:0104 B20C MOV 1E4A:0106 CD10 INT 1E4A:0108 B44C MOV 1E4A:010A CD21 INT 1E4A:010C D6 DB 1E4A:010D C70619DFAD82 MOV 1E4A:0113 E8C901 CALL 1E4A:0116 0BC0 OR 1E4A:0118 7478 JZ 1E4A:011A 8BE8 MOV 1E4A:011C BF02D2 MOV 1E4A:011F 8B36C6DB MOV -Q C:\WINDOWS\Desktop>

AH,02 DH,07 DL,0C 10 AH,4C 21 D6 WORD PTR [DF19],82AD 02DF AX,AX 0192 BP,AX DI,D202 SI,[DBC6]

Yukarda yine komut satrndan debug komutu verilerek DEBUG program altrlyor. Bu sefer N komutu diske yazlacak dosyann ismini deil, diskten bellee aktarlacak dosyann ismini vermek iin kullanlyor. Daha sonra L komutu ile ismi verilen dosya bellee ykleniyor. Bellee yklenen program U komutu ile datlyor. Kodlar dikkatli incelerseniz programn ilk alt satrnn bizim bir nceki rnekte yazdmz assembly kodlarndan olutuunu greceksiniz. Kodlarn solundaki saylar assembly komutlarnn bellekte bulunduklar eklidir (makine dili). 010C ve sonrasndaki satrlardaki assembly komutlar o anda bellekte rasgele bulunan kodlardr. Bizim programmz ile bir ilgileri yoktur. En son olarak da Q komutu ile DEBUGtan klyor. T komutu ile bellekteki herhangi bir program adm adm iletilebilir. Komutun kullanmna basit bir rnek aada verilmitir.
Microsoft(R) Windows 98 (C)Telif Hakk Microsoft Corp 1981-1999. C:\WINDOWS\Desktop>debug -A 100 1E2C:0100 mov ax,1234 1E2C:0103 mov bx,4567 1E2C:0106 mov ax,bx 1E2C:0108 -T = 100 AX=1234 BX=0000 DS=1E2C ES=1E2C 1E2C:0103 BB6745 -T AX=1234 BX=4567 DS=1E2C ES=1E2C 1E2C:0106 89D8 CX=0000 DX=0000 SP=FFEE SS=1E2C CS=1E2C IP=0103 MOV BX,4567 CX=0000 DX=0000 SP=FFEE SS=1E2C CS=1E2C IP=0106 MOV AX,BX BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

43

-T AX=4567 BX=4567 DS=1E2C ES=1E2C 1E2C:0108 107420 CX=0000 DX=0000 SP=FFEE SS=1E2C CS=1E2C IP=0108 ADC [SI+20],DH BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC DS:0020=FF

Grdnz gibi DEBUG ile yazlan program adm adm iletilmektedir. T komutunu yazdnz ksa kodlarn hata kontrol iin kullanabilirsiniz.

Blm 6 : Linux letim Sistemi Altnda Assembly Kullanm


Bu dokmanda linuxun kullanm ve sistemin ileyii hakknda bilgi verilmeyecektir. Bu blmde kullancnn daha nce Linux yada benzeri bir UNIX trevi sistemi kullanm olduu varsaylmaktadr. Linux iletim sisteminin alabilecei en eski CPU modeli 80386 mimarisidir. Yani linux 8086, 80186 yada 80286 kullanan bir bilgisayar zerine kurulamaz. Intel firmasnn 80386 ile getirdii en byk yenilik, eski modellerde (8086, 80186 yada 80286) kullanlan 16-bit registerlar yerine 32-bit registerlarn kullanmna olanak salamasdr. Bu da programcya daha ok adreslenebilir bellek alan salamaktadr. 80386dan nceki modellerde bir segment 64KB boyutunda olurken bu rakam 80386 ve sonrasnda 4GBdan daha fazladr. (Bu dokman yazdm sralarda Intel firmas yeni 64-bit kapasiteli ilemciler zerinde alyordu!) 80386da, daha nce kullanlan registerlara ek yaplm ve baz yeni registerlar eklenmitir. Her biri 16-bit olan AX, BX, CX, DX, SI, DI, BP ve SP registerlar yerine her biri 32-bit olan, srasyla EAX, EBX, ECX, EDX, ESI, EDI, EBP ve ESP registerlar kullanlmaktadr. Daha nceki ilemcilerde kullanlan 16-bit segment registerlar olan CS, DS, ES ve SSe ek olarak iki 16-bitlik segment register olan FS ve GS eklenmitir. 80386da nceki modeller gibi 16bitlik segment registerlar kullanmaktadr. Tm bunlara ek olarak flag register da 32-bit kapasiteye sahip olmutur. Geniletilmi yeni flag registern 16. biti debug resume(RF) ve 17. biti virtual mode (VM) bitleri olarak adlandrlrlar. lemci sanal mod (virtual mode) altnda alrken 8086 mimarisi ile ilem yapar. Bunalara ek olarak, 80486da alignment check flag biti 18. bit pozisyonuna eklenmitir. 32-bit programlar yazlrken 16-bitlik ve 8-bitlik registerlar kullanlabilmektedir. 80386nn kulland register emas aadaki gibidir.

44

Linux altnda yazacamz programlarn hepsi 80386nin salad 32-bit kapasiteli registerlar kullanabilmektedir. Linux altnda assembly dili kullanm programcya DOS altndaki kadar byk avantajlar salamamaktadr. altrlan programlar korumal mod (protected mode) altnda alt iin programcnn BIOS tarafndan salanan kaynaklara eriimi kstlanmtr. (Aslnda bu korumal modda alan tm sistemler iin geerlidir) Linux altnda kullanlacak assembly rutinleri ounlukla C gibi diller ierisinde satr ii (inline) olarak kullanlmaktadr. Yazlan programlarn DOS altnda yksek seviyeli bir dil ile ve assmbly ile yazlm iki program arasndaki kadar byk bir boyut fark gstermemesi ve korumal moddan dolay kullanmdaki kstlamalar dilin Linux (yada herhangi bir UNIX trevi sistem) altndaki poplaritesini azaltmtr. Fakat yine de baz noktalarda baka alternatif bulunmamakta ve assembly dilinin kullanm zorunlu olmaktadr. (Linux Kernel Ver1.0 kaynandaki boot dosyalar, http://www.kernel.org) Linux altnda kaydedilen assembly dosyalar .s yada .S uzantsn alr. Program kullanlan assembler programna gre AT&T yada Intel szdizimi kullanlarak yazlr. Eer assembler olarak linux ve DOS altnda kullanlan NASM (Netwide Assembler) kullanlacaksa yazlan program Intel szdizimi kullanlarak yazlr. Dokmanda buraya kadar anlatlan assembly dili kurallar Intel szdizimi iindir. Buna karn linux altnda ska kullanlan debugger programlarndan birisi olan GDB ile yazlacak kodlarda, C ile kullanlacak satr ii kodlarda ve linux ekirdeindeki kodlarda hep AT&T szdizimi kullanlmaktadr. Aslnda GCC derleme srasnda as adnda bir assembler program kullanr. as, AT&T szdizimini kulland iin GCC ile derlenen C dosyalarndaki kodlar da mecburen AT&T szdizimi ile yazlmaldr. Bu dokmanda temel olarak Intel ve AT&T szdizimleri arasdaki farklar zerinde durulacaktr ve GNU Assembler kullanmna baz rnekler verilecektir. 6.1 Intel ve AT&T Szdizimleri Yukarda da belirttiim gibi linux altnda assembly programlar yazlrken kullanlan szdizimi AT&T standartlarndadr. DOS altnda kullanlan assembler programlar Intel szdizimi ile yazlm kodlar birletirirken, linux (ve UNIX trevi sistemlerde) kullanlanlar, bir iki istisna dnda AT&T szdizimini art komaktadr.

45

Intel mov eax, 01h mov bx,1234h

AT&T movl $0x01, %eax movw $0x1234, %bx

Yukarda da grld gibi AT&T szdizimi Intelinkine gre biraz daha karmaktr. imdi isterseniz sra ile farklar inceleyelim. 6.1.1 Kaynak-Hedef Yn Intel szdiziminde genel form komut hedef, kaynak olmasna karn AT&Tde bu dizilim komut kaynak, hedef eklindedir. Aslnda, gze normal gelen de deerin soldan saa tanmasdr. Intel komut hedef, kaynak mov ebp ,esp AT&T komut kaynak, hedef movl %esp, %ebp

6.1.2 nekler AT&T szdiziminde registerlar % ve sabit deerler de $ iareti ile neklerini alr. Sabit deer olarak kullanlan say onaltlk sistemde yazlyor ise 0xsay gibi bir ifade kullanlr. Intel mov ah, 12h AT&T movb $0x12, %ah

Yukardaki rnekte AH ierisine 12h (onluk 18) deeri atanmtr. AT&T szdiziminde sabit deerin banda $ iareti olduuna ve 12h deerini temsil etmek iin 0x12 yazm biimini kullandmza dikkat edin. movb $0x12, %ah ile movb $12, %ah arasnda ok fark vardr. kinci komutun GDB ierisindeki karl movb $0xC, %ah eklinde olacaktr. 6.1.3 Sonekler Szdizimleri arasndaki bir dier fark da AT&T szdiziminde komutlarn sonuna konulan l, w ve b sonekleridir. Bu sonekler zerinde ilem yaplan bilginin boyu hakknda bilgi vermek iin kullanlr. Intel szdiziminde kullanlan dword ptr, word ptr ve byte ptr eklerine karlk gelmektedirler. 32-bit veri ilemleri iin l (long), 16-bit veri ilemleri iin w (word) ve 8-bit veri ilemeleri iin b (byte) sonekleri kullanlr. Intel mov byte ptr bh, 45h mov eax, dword ptr [ebx] AT&T movb $0x45, %bh movl (%ebx), %eax

46

6.1.4 Bellek lemleri 80386nn yeni registerlarn yan sra programclara salad en byk yenilik bellek adresleme metotlarndadr. Bu blm okumadan nce 8086 serisinde bellek adresleme konusunda bilgi sahibi olmanz gerekmektedir. 8086 serisinde dolayl adresleme yaplrken sadece BX register kullanlrken, 80386 ve sonras ilemcilerde herhangi bir genel amal (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP) register kullanlabilmektedir. Yani aadaki yazm 80386 ncesi bir ilemcide almazken 80386 ve sonrasnda sorunsuz almaktadr. mov al, [edx] Dikkat edilmesi gereken bir nokta da 80386 ilemcide programnz 16-bit gerek modda (real mode) altryorsanz yine adresleyebileceiniz belek blgesi 64KB boyundadr ve eriim srasnda 32-bit registerlar kullanmanz gerekmektedir. 80386 herhangi bir register base yada index adresleme iin kullanmanza olanak salar. Tek kstlama ESPyi bir index deer olarak kullanamayacanzdr. Bunlarn yan sra 80386da index deeri 1, 2, 4 veya 8 gibi sabitlerden birisi ile arplp daha etkin bir bellek eriimi salanabilmektedir. Genel Intel ve AT&T szdizimi ekilleri aada verilmitir. INTEL komut hedef, segment_register:[base + index * n + yer_deitirme] AT&T komut %segment_register:yer_deitirme(base, index, n ), hedef ( n = 1, 2, 4 veya 8 ) Aadaki rnekler, yukardaki formalrn kafanzda oluturabilecei soru iaretlerini silecektir sanrm. Intel mov eax, [ecx*8h] mov edx, [ebx+ecx*08h-05h] AT&T movl 0x08(%ecx), %eax movl 0x05(%ebx,%ecx,0x08)

Bu noktada AT&T szdizimi Intelinki ile kyaslandnda, gerekten hi de programc dostu deil! 80386 ile yazlan kodlarda bellek adresleme yaplrken kullanlan registerlardan ilkinin base ve ikincisinin index olduu varsaylr. Programc bu noktada dikkatli olmaldr. nk ilemci bilgiyi alaca segmenti kullanlan base registera gre belirler. Sadece base olarak ESP yada EBP kullanld zaman geerli segment Stack Segmenttir. Dier durumlarda varsaylan olarak Data Segment kullanlr. 6.1.5 INT 0x80 ve Linux Sistem arlar (Syscalls) Linux altnda assembly programlar yazlrken ok kullanlan rutinlerden bazlar da sistem arlardr. Herhangi bir sitem arsnn kullanlabilmesi iin, sistem arsna ait numara EAX ierisine atlr ve eer sistem ars en fazla be agrman alyorsa gerekli argmanlar sras ile EBX, ECX, EDX, ESI ve EDI registerlarna atlr. Alt ve daha fazla argman alan

47

sistem arlarnda ise yine sistem ar numaras EAX ierisine atlr. Daha sonra gerekli agrmanlar sondan baa doru stack ierisine atlr ve ESP EBX ierisine kopyalanr. Sistem arlar /usr/include/asm/unistd.h ierisinde listelenmitir. Ayrca sistem arlar hakknda bilgiyi de man 2 sistem_arsnn_ad komutu ile alabilirsiniz. rnekler : ilk.s
fnoyan@tux:~$ cd asm fnoyan@tux:~/asm$ vi ilk.s

ilk.s dosyas ierisine aadaki kodlar yazn. .text .globl _start _start: movl $12,%eax movl $0x12, %eax xorl %eax, %eax inc %eax int $0x80

fnoyan@tux:~/asm$ as ilk.s o ilk.obj fnoyan@tux:~/asm$ ld ilk.obj o ilk fnoyan@tux:~/asm$ ./ilk fnoyan@tux:~/asm$ fnoyan@tux:~/asm$ gdb -q (gdb) file ilk Reading symbols from ilk...(no debugging symbols found)...done. (gdb) disas _start Dump of assembler code for function _start: 0x8048074 <_start>: mov $0xc,%eax 0x8048079 <_start+5>: mov $0x12,%eax 0x804807e <_start+10>: xor %eax,%eax 0x8048080 <_start+12>: inc %eax 0x8048081 <_start+13>: int $0x80 End of assembler dump. (gdb)

Yukarda ilk.s dosyasnn adm adm birletirilmesi ve GDB yardm ile ierisindeki assembly kodlarn incelenmesi gsterilmitir. rneimizde, GDB ile kullanlan file komutu debug

48

ierisindeki n komutu ile ve disas komutu da debug ierisindeki u komutu ile ayn ii yapmaktadr. Bu rnekte yukarda verdiim movl $12,%eax ve movl $0x12, %eax komutlar arasndaki fark rahat bir ekilde grebilirsiniz. disas _start komutu ile GDB programmz ierisindeki _start noktasndan itibaren datma ilemi yapar. iki.s Bu rneimizde bir sistem ars olan chmodun kullanm rneklendirilmitir. Sistem ar numarasn (chmod iin 15) /usr/include/asm/unistd.h dosyasndan rendikten sonra gerekli agrmanlar linux yardm dosyalarn okuyarak renebilirsiniz.
fnoyan@tux:~$ man 2 chmod

Gerekli argmanlar renildikten sonra aadaki kodu iki.s ad kaydedin. .data path: .ascii "./dosya" .text .globl _start _start: movl $15, %eax movl $path, %ebx xorl %ecx, %ecx int $0x80 xorl %eax, %eax incl %eax int $0x80

Yukardaki program, bulunduu dizindeki dosya isimli dosyann eriim haklarn sfrlamaktadr. Yani programmz chmod 000 ./dosya komutu ile ayn ii yapmaktadr.
fnoyan@tux:~/asm$ touch dosya; chmod 777 dosya fnoyan@tux:~/asm$ ls l dosya fnoyan@tux:~/asm$ as iki.s o iki.obj fnoyan@tux:~/asm$ ld iki.obj o iki fnoyan@tux:~/asm$ ./iki fnoyan@tux:~/asm$ ls l dosya .... .... fnoyan@tux:~/asm$ gdb -q (gdb) file iki Reading symbols from iki...(no debugging symbols found)...done.

49

(gdb) disas _start Dump of assembler code for function _start: 0x8048074 <_start>: mov $0xf,%eax 0x8048079 <_start+5>: mov $0x8049088,%ebx 0x804807e <_start+10>: xor %ecx,%ecx 0x8048080 <_start+12>: int $0x80 0x8048082 <_start+14>: xor %eax,%eax 0x8048084 <_start+16>: inc %eax 0x8048085 <_start+17>: int $0x80 End of assembler dump. (gdb)

dosya isimli bir dosya oluturduk ve eriim haklarn rwxrwxrwx (777) olarak dzenledik. Daha sonra yazdmz program ile dosya isimli dosyann eriim haklarn ----------(000) olarak deitirdik. man 2 chmoda gre fonksiyon iki argman alyor. Birincisi dosyaya giden yol (path) ve ikincisi yeni eriim yetkileri (bizim rneimizde sfr). sterseniz adm adm program inceleyelim. .data path: .ascii "./dosya" Yukardaki parada program ierisinde ascii trnde sabit tanmlamas yaplyor. .data Data Segment ierisinde olduumuzu belirtir. .text .globl _start _start: Code Segmente geiliyor. movl $15, %eax movl $path, %ebx xorl %ecx, %ecx int $0x80 te burada chmod sistem ars arlyor. EAX iersine sistem ar numaras atldktan sonra gerekli argmanlar registerlara ykleniyor. Burada movl $path, %ebx komutu ile yaplan sabitimizin adresini EBX ierisine yklemektir (programn GDB ktsnda bu grlmektedir.). Daha sonra ECX ierisine sfr atanyor ve en son olarak int $0x80 altrlyor.

50

xorl %eax, %eax incl %eax int $0x80 Programmzn sonunda da, program bitirmek iin _exit() sistem ars (sistem ar numaras 1) kullanlyor. Bu DOS altndaki AH=4Ch INT 21h ars ile ayn ii yapmaktadr. uc.s Son rneimizde de yukarda oluturduumuz dosya isimli dosyann adn yeni_dosya olarak deitiriyoruz. Bu ie iin yine bir sistem arsn kullandk: rename (sistem ar numaras 38). Kodumuz aadaki gibi. .data old_path: new_path: .text .globl _start _start:

.ascii "./dosya\0" .ascii "./dosya_yeni\0"

movl $38, %eax movl $old_path, %ebx xorl $new_path, %ecx int $0x80 xorl %eax, %eax incl %eax int $0x80

Yukarda da yine bir nceki rnekte olduu gibi sistem ars kullanld. Bu sefer de sistem ar numarasna ek olarak iki argman gerekti ve ilki EBX ikincisi de ECX ierisine yazld. movl $old_path, %ebx komutuyla belirtilen old_path sabiti derlenme srasnda gerekli offset adresi ile deitirilmektedir. Aadaki GDB kts bunu daha kolay anlamanz salayacaktr.
fnoyan@tux:~/asm$ gdb -q (gdb) file uc Reading symbols from uc...(no debugging symbols found)...done. (gdb) disas _start Dump of assembler code for function _start: 0x8048074 <_start>: mov $0x26,%eax 0x8048079 <_start+5>: mov $0x804908c,%ebx 0x804807e <_start+10>: xor $0x8049094,%ecx 0x8048084 <_start+16>: int $0x80 0x8048086 <_start+18>: xor %eax,%eax

51

0x8048088 <_start+20>: 0x8048089 <_start+21>: End of assembler dump.

inc int

%eax $0x80

GDB ile grntlenen kodda komutlarn soneklerinin olmadna dikkat ediniz.

nternet Adresleri :
Dokmann bu son ksmnda assembly ile daha geni apta uramak isteyenler iin baz internet sitelerinin adresleri bulunmaktadr. http://linuxassembly.org Linux ve dier UNIX tabanl sistemler altnda assembly dili ve kullanm hakknda kaynak bulabileceiniz bir site. Linux altnda assembly dilinin kullanmn anlatan bir baka yaz. Linux altnda GCC ile satr ii assembly kullanm hakknda bilgi bulabileceiniz bir adres. GCC ile satr ii assembly hakknda baka bir dokman. Adresleri yukarda verilen baz dokmanlarn Trke evirilerinin bulunduu bir site. Sadece assembly deil daha birok programlama dili hakknda rnek kod ve kaynak bulabileceiniz geni ierikli bir site. Linux ve MS-Windows iletim sistemleri altnda kullanlan bir assembler olan NASMn sitesi. Windows iletim sistemi altnda 32-bit assembly programlamay renebileceiniz en iyi sitelerden biri.

http://www.janw.easynet.be/eng.html http://www.geocities.com/SiliconValley /Ridge/2544/ ftp://www6.software.ibm.com/software/ developer/library/l-ia.pdf http://members.lycos.co.uk/kasiasyg/ http://www.programmersheaven.com

http://www.web-sites.co.uk/nasm/ http://win32asm.cjb.net

Yukardakilerin dnda adreslerini bilmediim ama sizin bir arama motorunda gerekli bilgileri yazarak kolayca eriebileceiniz baz faydal kaynaklar. The Art Of Assembly Language PC Assembly Language Ralf Browns Interrupt List Yazar : Paul.A Carter Yazar : Ralf Brown

52

53

You might also like