Assembly 2003

Embed Size (px)

Citation preview

  • 8/6/2019 Assembly 2003

    1/53

    1

    AssemblyProgramlama Dili

    T e m m u z 2 0 0 3

    Hazrlayan : Fehmi Noyan [email protected]@yahoo.com

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

    mailto:[email protected]:[email protected]://www2.gantep.edu.tr/~fni18444http://www2.gantep.edu.tr/~fni18444mailto:[email protected]:[email protected]
  • 8/6/2019 Assembly 2003

    2/53

    2

  • 8/6/2019 Assembly 2003

    3/53

    3

    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 altndaassembly dilinin kullanm anlatlmaktadr.

    Assembly programlama dili ile ilgili elinize geecek birok kaynakta baz temel terim veifadeler srekli orijinal ngilizce halleriyle kullanldklar iin ben de birok terimin ve ifadeninTrke karln kullanmadm. Bu, baz durumlarda anlatm biraz vasatlatrmsa da kavramlarnok bilinen adlar ile renmenin daha faydal olacan dnyorum.

    Fehmi Noyan S

  • 8/6/2019 Assembly 2003

    4/53

    4

    indekiler

    Giri

    Blm 1 : Temeller1.1 Say Sistemleri1.2 Veri Tipleri

    1.2.1 Bit1.2.2 Bayt1.2.3 Word1.2.4 Double Word (Long)

    1.3 Bitler zerinde Mantksal lemler1.4 retli ve aretsiz Saylar1.5 Shift ( Kaydrma ) ve Rotate ( Dndrme )

    lemleri

    Blm 2 : Mikro lemci (CPU) ve Bellek2.1 Mikro lemci ve Yaps

    2.1.1 Data Register'lar2.1.2 Pointer ve Index Register'lar2.1.3 Segment Register'lar2.1.4 Instruction Pointer2.1.5 Flag Register

    2.1.5.1 Carry Biti2.1.5.2 Parity Biti

    2.1.5.3 Auxilary Carry Biti2.1.5.4 Zero Biti2.1.5.5 Sign Biti2.1.5.6 Trace Biti2.1.5.7 Interrupt Biti2.1.5.8 Direction Biti2.1.5.9 Overflow Biti

    2.2 Bellek ve Yaps2.3 Stack2.4 80x86 lemcilerde Bellek Adresleme

    2.4.1 Dorudan Adresleme (Direct Addressing)

    2.4.2 Dolayl Adresleme (Indirect Addressing)2.4.3 Indexed Adresleme2.4.4 Based Indexed Adresleme2.4.5 Based Indexed + Sabit(Disp) Adresleme

    Blm 3 : 80x86 Komut Kmesi3.1 Transfer Komutlar

    3.1.1 MOV Komutu3.1.2 XCHG Komutu3.1.3 LEA Komutu3.1.4 PUSH Komutu

    3.1.5 PUSHF Komutu

    7

    888888899

    10

    111111121212121314

    1414141414151515161818

    18191920

    202122232324

    24

  • 8/6/2019 Assembly 2003

    5/53

    5

    3.1.6 POP Komutu3.1.7 POPF Komutu3.1.8 LAHF Komutu3.1.9 SAHF Komutu

    3.2 Giri/k Komutlar3.2.1 IN Komutu3.2.2 OUT Komutu

    3.3 Aritmetiksel Komutlar3.3.1 ADD Komutu3.3.2 ADC Komutu3.3.3 SUB Komutu3.3.4 SBB Komutu3.3.5 MUL Komutu3.3.6 IMUL Komutu3.3.7 DIV Komutu

    3.3.8 IDIV Komutu3.3.9 INC Komutu3.3.10 DEC Komutu3.3.11 CMP Komutu

    3.4 Mantksal Komutlar3.4.1 AND Komutu3.4.2 TEST Komutu3.4.3 OR Komutu3.4.4 XOR Komutu3.4.5 NOT Komutu

    3.5 Kaydrma ve Dndrme Komutlar3.5.1 SHL/SAL Komutlar3.5.2 SHR Komutu3.5.3 SAR Komutu3.5.4 RCL Komutu3.5.5 ROL Komutu3.5.6 RCR Komutu3.5.7 ROR Komutu

    3.6 Dallanma Komutlar3.6.1 JMP (Koulsuz Dallanma) Komutu3.6.2 JZ/JE Komutlar

    3.6.3 JNZ/JNE Komutlar

    3.6.4 JB/JC/JNAE Komutlar3.6.5 JBE/JNA Komutlar3.6.6 JNB/JNC/JAE Komutlar3.6.7 JG/JNLE Komutlar3.6.8 JA/JNBE Komutlar3.6.9 JL/JNGE Komutlar3.6.10 JLE/JNG Komutlar3.6.11 JS ve JNS Komutlar3.6.12 JO ve JNO Komutlar3.6.13 JCXZ Komutu

    3.7 Dng Komutlar

    24252525

    2626262627272728282929

    303031313232323232333333333334343434353536

    3738383838383838383939

    39

  • 8/6/2019 Assembly 2003

    6/53

    6

    3.7.1 LOOP Komutu3.7.2 LOOPZ/LOOPE Komutlar3.7.3 LOOPNZ/LOOPNE Komutlar

    Blm 4 : Kesme (Interrupt) Kullanm

    Blm 5 : DEBUG Program

    Blm 6 : Linux letim Sistemi Altnda AssemblyKullanm

    6.1 Intel ve AT&T Szdizimleri6.1.1 Kaynak-Hedef Yn6.1.2 nekler6.1.3 Sonekler6.1.4 Belleklemleri

    6.1.5 INT 0x80 ve Linux Sistem arlar (Syscalls)rnekler

    nternet Adresleri

    394040

    40

    41

    444546464647

    4748

    52

  • 8/6/2019 Assembly 2003

    7/53

    7

    GiriAssembly programlama dili dk seviyeli bir dil olup C, C++, Pascal, Basic gibi yksek

    seviyeli programlama dillerine gre anlalmas biraz daha zordur. Assembly dili ile programyazarken 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 deitirmeolana vardr. Yksek seviyeli dillerdeki derleyicilerden farkl olarak, assembly kaynak dosyalarnalabilir dosya haline getirebilmek iin assembler ve linker ad verilen programlarkullanlr. Aslnda derleyiciler de bir tr assembler programdr denebilir. Fakat derleyiciler,ekstra bir parametre kullanlmad taktirde, kaynak dosyasn nce gerekli Object dosyasnaeviriler daha sonra, bir hata ile karlalmaz ise, elde edilen object dosyas linker yardm ilealabilir dosya haline getirilir.

    Bilgisayarmzda altrlan tm programlar nce bilgisayarmzn RAMine yklenir. Dahasonra RAM zerinde altrma ilemi gerekletirilir. RAMe yklenen bilgi programmznmakine dili karlndan baka birey deildir. Makine dilinin kullanc tarafndan anlalabilirekline ise assembly dili demek pek yanl olmaz.

    Aslnda assembly programlarnn en nemli zellikleri boyutlarnn yksek seviyeli bir dil ileyazlan programlara nazaran ok kk olmas ve buna bal olarak ok daha hzlalmalardr.Programlarn hzl almalarn kodlarnn sadeliinden kaynaklanmaktadr. Fakat gnmzdekullanlan yksek hzl ilemciler ve byk kapasitelere sahip sabit diskler assembly

    programlarnn bu zelliklerini nemsiz klmaktadr. Aadaki rnekte ekrana A harfinibasan bir program nce assembly dili ile daha sonra C ve Pascal dilleri ile yazlmtr.

    Programlar

    n yapt

    klar

    ilerin ayn

    olmas

    na kar

    n boyutlar

    aras

    ndaki byk farka dikkatedin.

    Assembly Program C Program Pascal Program

    MOV AH,02MOV DL,41INT 21INT 20

    #include

    main(){printf(A);

    }

    beginwrite(A)

    end.

    Assembler BilgileriMS-DOS DEBUG

    Derleyici BilgileriMS-DOS iin Turbo C 2.01

    Derleyici BilgileriMS-DOS iin FreePascal0.9

    Boyut : 8 bayt Boyut : 8330 bayt Boyut : 95644 bayt

    Grdnz gibi C ile yazlan programn boyu assembly ile yazlannkinin boyunun 1000katndan daha byk! Pascal ile yazlan programn boyu ile assembly ile yazlannkinin boyunukarlatrmaya bile gerek yok sanrm. Bu fark eski bir bilgisayar iin nemli olabilir fakatgnmz standartlarndaki bir bilgisayar iin pek nemli deildir. Bu sebepten assembly

    programlama dili gnmzde daha ok sistem programclar tarafndan ve inline olarak dier

  • 8/6/2019 Assembly 2003

    8/53

    8

    programlama dilleri ierisinde kullanlmaktadr. inline assembly ile kastedilmek istenen,assembly kodlarnn olduu gibi yksek seviyeli bir dil ierisinde kullanlmasdr. Bu, bizesabit diskin herhangi bir blmne ( mesela MBR ), BIOS gibi sistem kaynaklarna veya belirli

    bellek blgelerine kolayca erime olana salar.

    Blm 1 : Temeller1.1Say Sistemleri

    Gnlk hesaplamalarmzda kullandmz sistem onluk say sistemidir ve bu sistem0,1,2,3,4,5,6,7,8 ve 9 rakamlarndan oluur. Dier saylar ise bu rakamlar kullanlarak eldeedilir. 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 1inanlam( TRUE ) dorudur. Buna karn assembly programlar yazlrken kullanlan say tabanhexadecimal olarak bilinen on altlk say tabandr. Bu sistemde kullanlan ilk on rakamonluk sistemdeki ile ayn olup 0,1,...,9 rakamlarndan oluur. 10, 11, 12, 13, 14 ve 15 iinsrasyla A, B, C, D, E ve F harfleri kullanlr. On altlk saylar gsterilirken sonlarna hveya Hharfi konur. Assembly dili ile onaltlk say sisteminin kullanlmasnn sebebi, bellekadresi 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 isteseydik0001101110100101:0000000100001111 eklinde olacakt ki bu hem aklda tutmas hem deyazmas zor bir say.

    1.2Veri Tipleri

    1.2.1 BitBilgisayarn ikilik say sistemini kullandndan bahsettik. Bu sistemdeki her birbasamaaBinary Digitanlamna gelen bit denir. Yani bir bit ierisinde 0 veya 1 olmakzere 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 arasndaolmak 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 deer65535 ve minimum deer 0dr. Bu da bir word ierisinde 65536 farkl deersaklanabilecei anlamna gelir.

    1.2.4 Double Word (Long) ki ayr wordun birletirilmesi ile bir Double Word elde edilir. Bir double word 32-bituzunluundadr.

  • 8/6/2019 Assembly 2003

    9/53

    9

    8086, 80186 ve 80286 ilemcilerde ayn anda ilenebilecek bilgi saysnn 16 bituzunluunda olmasndan dolay bu ilemcilere 16-bit ilemci ad verilir. Intel firmas80386 ve sonras ilemcilerinde 32 bitlik bilgi ileme sistemi kullanmtr ve bu ilemcilerede 32-bit ilemci ad verilir.

    1.3Bitler 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 komutkullanlr. 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 01 0 1

    0 1 0

    NOT 1 00 1

    Bilgisayarmzda kullanlan baytlar da 1 ve 0lardan olutuu iin CPU her mantksal ilemdebitler zerinde ayr ayr ilem yapar. Aada birka rnek verdim.

    1001 0110 1001 11111011 1101 0001 1110

    AND _______________________________

    1001 0100 0001 1110

    1011 0010 1110 10101011 0000 0000 0000

    OR ____________________________

    1011 0010 1110 1010

    1010 1010 1000 11111110 1110 1100 0001

    XOR________________________________

    0100 0100 0100 1110

    0010 0000 0000 1111NOT______________________________

    1101 1111 1111 0000

    1.4retli ve aretsiz Saylar Daha nce veri tipleri anlatlrken bayt iin deer aral 0-255 word iin 0-65535 olaraktanmland. Peki ilemlerimizde negatif saylar kullanmak istersek ne yapmalyz? Budurumda bayt, word veya long iin ayrlan blgenin yars negatif dier yars da pozitifsaylar iin tahsis edilir. Yani bir baytn alabilecei deerler 128....-1 ve 0....127 arasnda

    olur. Aynekilde word iin bu deer 32.768......+32.767 arasnda olur. Bir bayt, word yadalong iin en soldaki bite iaret biti denir. aretli saymzn iaret bitinin deeri 0 ise say

    pozitif, 1 ise negatif olarak deerlendirilir. Yani0110 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 iin1) Say NOT ileminden geirilir2) Elde edilen sonuca 1 eklenir

    imdi, 13 bulmaya alalm.+13 = 0000 1101 (bayt)1) Say NOT ileminden geirilir

  • 8/6/2019 Assembly 2003

    10/53

    10

    0000 1101NOT______________

    1111 0010

    2)

    Elde edilen sonuca 1 eklenir1111 00101

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

    1.5Shift ( Kaydrma ) ve Rotate ( Dndrme ) lemleriBit 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 aynekilde 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 1 1 1 0 0 1 0 Sola kaydrma sonras

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

    1 1 0 1 1 1 0 0 Saa dndrme sonras

    0 1 1 1 0 0 1 1 Sola dndrme sonras

  • 8/6/2019 Assembly 2003

    11/53

    11

    Blm 2 : Mikro lemci (CPU) ve Bellek2.1Mikro lemci ve Yaps Bugn kullandmz bilgisayarlarda bilgileri yorumlayan ve ileyen ksm bilgisayarn

    merkezi ilem nitesidir. Merkezi ilem nitesi (Central Processing Unit CPU) bellek veeitli giri/k niteleri ile bus ad verilen veri yollarn kullanarak haberlemektedir. lemciler, dahili ve dsal hatlarnn bilgi transferi ve ileyebilecekleri maksimum bilgikapasitesine gre 8 bitlik, 16 bitlik ve 32 bitlik ilemciler olarak adlandrlr. Bu dokmandaanlatlan assembly dili 16 bitlik bir ilemci olan Intel 8086 (dsal ve dahili veri transferiwordler halinde yaplmaktadr) serisi iindir. Dilin 8086 serisi iin olmas, yazdnz

    programlarn 8088, 80186, 80286, 80386, 80486, Pentium ve Celeron serileri ve AMDilemciler zerinde almayaca anlamna gelmemektedir. lemci, registerad verilen blmelerden oluur. Bu registerlar Data registerlar, Pointerve Index registerlar, Segment registerlar, Instruction Pointer (komut gstergeci) veProgram Status Word (Flag register) olarak gruplandrabiliriz. Aada 8086 ilemcininregister yaps basite gsterilmitir.

    2.1.1 Data Registerlarekilde de grld gibi 8086 ilemci 14 adet 16-bit kapasiteli registera sahiptir. Buregisterlardan Data registerlar ( AX, BX, CX ve DX ) kendi ilerinde 8-bit kapasiteli ikiregistera blnmektedir. Bu registerlar AX iin AH ve AL, BX iin BH ve BL, CX iin CHve CL ve DX iin DH ve DL olarak adlandrlr. AH, 16-bitlik AX registernn 8-bitlikyksek(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 dataregisterlar bir ok ilemde (dnglerde, interrupt kullanlmasnda, matematikselilemlerde...) CPU tarafndan rezerv edilmilerdir. Bu durumlarda bizim register ierisindekideeri deitirme ansmz yoktur.

  • 8/6/2019 Assembly 2003

    12/53

  • 8/6/2019 Assembly 2003

    13/53

    13

    Bilgisayar ikilik say sistemini kullandna gre bu registerlar ierisindeki deer herhangibir anda ya 1 yada 0dr. Bir bitin 1 olma durumuna Set, 0 olma durumuna ise Resetdenir. lemci birok komutu icra ederken bu bitlerin durumlarndan faydalanr.

    2.1.5.1 Carry Bitilemci tarafndan yaplan herhangi bir ilem srasnda alc alana yerletirilen saynn alcalana smamasndan doan olaya carry(tama) denir. CPU bir ilem sonucunda tama ilekarlarsa carry flagn deeri 1 yaplar.Aada 16-bitlik iki say toplanmtr ve sonuta bir tama olmutur. (Taan bit krmz ilegsterilmitir)

    1111 1001 0110 1010 F96A0010 1010 1111 1001 2AF9

    +---------------------------- 1 0010 0100 0110 0011 2463 CF=1F96A ile 2AF9un toplanmas sonucu 2463 says elde edilmitir ki bu iki saydan da kktr.

    Elimizdeki saylar pozitif olduuna gre toplama ilemi sonucunda elimizdeki saylardan dahakk bir say elde etmemiz imkanszdr. CPU bu durumda carry flagn deerini 1 yaparak 17-

    bitlik bir say elde eder.

    C:\WINDOWS\Desktop>debug-a1001E40:0100 MOV AX,F96A1E40:0103 MOV BX,2AF91E40:0106 ADD AX,BX1E40:0108-t

    AX=F96A BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=1E40 ES=1E40 SS=1E40 CS=1E40 IP=0103 NV UP EI PL NZ NA PO NC1E40:0103 BBF92A MOV BX,2AF9-t

    AX=F96A BX=2AF9 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=1E40 ES=1E40 SS=1E40 CS=1E40 IP=0106 NV UP EI PL NZ NA PO NC1E40:0106 01D8 ADD AX,BX-t

    AX=2463 BX=2AF9 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=1E40 ES=1E40 SS=1E40 CS=1E40 IP=0108 NV UP EI PL NZ AC PE CY1E40:0108 A394D3 MOV [D394],AX DS:D394=A2A2

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

  • 8/6/2019 Assembly 2003

    14/53

    14

    2.1.5.2 Parity BitiBir 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 buflag iin nemli deildir.

    2.1.5.3 Auxilary Carry BitiCPU 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 ikincisaynn 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, ilemsonrasnda AC (1) olmutur.

    2.1.5.4 Zero BitiYaplan herhangi bir ilem sonucu sfr ise bu flag set edilir.

    -a1001E40:0100 mov ax,121E40:0103 xor ax,ax1E40:0105-t

    X=0012 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000S=1E40 ES=1E40 SS=1E40 CS=1E40 IP=0103 NV UP EI PL NZ NA PO NC

    1E40:0103 31C0 XOR AX,AX-t

    X=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

    S=1E40 ES=1E40 SS=1E40 CS=1E40 IP=0105 NV UP EI PL ZR NA PE NC1E40:0105 F0 LOCK1E40:0106 01D8 ADD AX,BX

    Yukarda nce AX registernn deeri 12 yaplyor. Daha sonra bu register kendisi ile XORilemine tabi tutulmutur. Bir saynn kendisi ile XOR ilemine tabi tutulmas sonucu 0 eldeedilir. Bu durum zero flagn deerini set etmitir ( NZ ZR ).

    2.1.5.5 Sign Bitiaretli saylarda bayt (8 bit) iin saynn 7. ve word (16 bit) iin saynn 15. biti iaret bitiolarak 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 edilensonu negatif kabul edilir.

    2.1.5.6 Trace BitiCPUnun sadece bir komut altrp beklemesi iin kullanlr. DEBUGn kulland Trace

    ilemi bu flagn set edilmesi ile gerekletirilir.

    2.1.5.7 Interrupt BitiCPUnun eitli aygtlardan gelen kesme isteklerini dikkate alp almayacan bildirir. 0 olmasdurumunda istekler dikkate alnmayacaktr.

  • 8/6/2019 Assembly 2003

    15/53

    15

    2.1.5.8 Direction BitiBu 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 saylariin carry flag kullanlmtr. Fakat durum iaretli saylar iin biraz daha farkldr. aretlisaylarda 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 alglanmasmmkndr. Bu durumda overflow flag set edilir ve ilem sonucunun yanl alglanmasengellenir.

    2.2Bellek ve YapsBilgisayarmzda bir program altrdmz zaman program nce RAMe yklenir ve daha

    sonra altrlr. Ykleme ilemi programn kod, data gibi blmlerinin eitli belek alanlarnaayr 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 4Gb kadardr. Biz 8086 ilemci ve 16-bit uzunluundaki bellek blgeleri ile altmza greadresleyebileceimiz maksimum alan 64 Kb boyundadr. 8086 ilemci programcya zerindealabilecei drt adet segment salar. Bunlar : CODE, DATA, EXTRA ve STACKsegmentleridir. Bu segmentlerin balang adresleri CODE SEGMENT iin CSde, DATASEGMENT iin DSde, EXTRA SEGMENT iin ESde ve STACK SEGMENT iin SSdesaklanr.Yukarda anlattmz 64 Kblk segmentler de kendi ilerinde 1 baytlk blmlere

    ayrlmlardr. Segmentlerin ierisindeki bu bir baytlk blmlere OFFSET ad verilir. Yani birsegment 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 veoffset adresi olarak IP ierisindeki deer kullanlr. Aynekilde stack segment ierisindeki birdeere ulamak iin segment adresi olarak SS ierisindeki deer ve offset adresi olarak SP veyaBPden biri kullanlr.Bellek ve verilerin nasl depoland konusunda aadaki rnek size yardmc olacaktr.

    -A1001E40:0100 MOV AH,011E40:0102 INT 211E40:0104 CMP AL,45

    1E40:0106 JNE 01001E40:0108 INT 201E40:010A-GGGHJREProgram normal olarak sonlandrld-U 1001E40:0100 B401 MOV AH,011E40:0102 CD21 INT 211E40:0104 3C45 CMP AL,451E40:0106 75F8 JNZ 01001E40:0108 CD20 INT 201E40:010A D3E8 SHR AX,CL

    1E40:010C 94 XCHG SP,AX1E40:010D 00726D ADD [BP+SI+6D],DH

  • 8/6/2019 Assembly 2003

    16/53

  • 8/6/2019 Assembly 2003

    17/53

    17

    Yukarda stack pointern ilk deeri FFFFdir (ekil1). Stack zerine ilk bilgi aktarmndansonra bir sonraki bilginin yazlaca adresi belirtmek iin SP=FFFD oluyor (ekil 2). FFFF veFFFE adreslerine srasyla 89 ve 67 saylar yazlm. Bu bize stack zerine yazlan bilginin6789h olduunu gsteriyor. Aynekilde, daha sonra 1234h deeri stack zerine aktarlyor(ekil 3) ve SPnin deeri FFFB olarak deiiyor. ekil 4te stack zerinden bilgi alnyor. lkiki ilemin tersine bu sefer SPnin deeri 2 artyor ve FFFB+2=FFFD oluyor. Yani o andansonra yazlacak ilk deer FFFD ve FFFC adreslerine yazlacaktr. Ksaca, stack zerine bilgiyazld 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 ilknce 6789h says daha sonra 1234h says stack zerine yazld. lk yazlan deer olan 6789haulamak iin nce 1234h okunmal.

    Stack zerindeki ilemler PUSH ve POP komutlar ile gerekletirilmektedir.

    MOV komutu: Bir sonraki blm olan 80x86 lemcilerde Bellek Adresleme ksmnda bellekve CPU registerlar arasndaki bilgi transferi MOV komutu kullanlarak anlatlacaktr.

    MOV hedef,kaynakMOV komutunun kullanm ekli yukardaki gibidir. Bu komut kaynak ierisindeki bilgiyi

    hedefe aktarr. YaniMOV AX, 1234hMOV BX, AX

    Yukarda ilk nce AX registerna 1234h deeri yazlmtr. Daha sonra bu deer AXregisterndan BX registerna aktarlmtr. Yani Program sonunda AX=1234h ve BX=1234holur.

    Komutun kullanmnda dikkat edilmesi gereken en nemli nokta hedef ve kaynakalanlarnn eit boyutlarda olmasdr (rneimizde 16-bit.).

  • 8/6/2019 Assembly 2003

    18/53

    18

    2.480x86 lemcilerde Bellek Adresleme8086 ilemci programcya bellee ulam iin 17 eit adresleme metodu salar. Assembly

    programlama dilinde bellek adresleme ve bellee eriim en nemli ve iyi bilinmesi gerekenkonulardandr.

    Displacement-only Base Displacement + Base Base + Indexed Displacement + Base + IndexedKullanlan 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 greadres 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 adreslerindekideerler AX registerna atanmtr. 4126h adresi 1 bayt ve AX register 2 bayt olduu iinhem 4126h hem de 4127h adresindeki deerler okunmutur. kinci rnekte Code Segment ierisindeki 4A4Ch ve 4A4Dh adresindeki deerler CXregisterna atanmtr. Grdnz gibi CS:[4A4C] gibi bir ifade kullanarak istediinizherhangi bir segment ierisindeki bilgiye eriebiliyorsunuz.

    Son olarak da MOV DS:[41C8], BX komutu ile BX ierisindeki deer Data Segment

    ierisindeki 41C8h ve 41C9h adreslerine yaz

    l

    yor.

    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 adreslemeyeaada birka rnek verdim.

    BasedMOV BX, 1234MOV AX, [BX]

    nce BXin deeri 1234h olarakdeitiriliyor. Daha sonra bellekte

    1234 ile iaret edilen yerdeki deerAX ierisine atanyor. Yaniyandaki komut kmesiMOV AX, [1234]

    ile ayn ii yapyor.

    BasedMOV BP, 45C8MOV AX, [BP]

    BP = 45C8hMOV AX, [45C8]

  • 8/6/2019 Assembly 2003

    19/53

  • 8/6/2019 Assembly 2003

    20/53

    20

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

    BP = 54ACDI = 444454AC + 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) AdreslemeBu 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 KmesiBu blmde Intel firmasnn 80x86 serisi ilemcilerini programlamak iin kullanlan

    assembly komutlarndan bir ksmn inceleyeceiz.

    Transfer komutlar

    MOVXCHGLEAPUSHPUSHFPOPPOPFLAHFSAHF

    Giri/k komutlarINOUT

    Aritmetiksel KomutlarADDADCSUBSBBMULIMUL

    DIV

  • 8/6/2019 Assembly 2003

    21/53

    21

    IDIVINCDECCMP

    Mantksal KomutlarANDORXOR

    NOTTEST

    Kaydrma ve Dndrme KomutlarSAL/SHLSHR

    SARRCLROLRCRROR

    Dallanma KomutlarJMPJZ/JEJNZ/JNE

    JB/JC/JNAEJBE/JNAJNB/JNC/JAEJG/JNLEJA/JNBEJL/JNGEJLE/JNGJS ve JNSJO ve JNOJCXZ

    Dng KomutlarLOOPLOOPZ/LOOPELOOPNZ/LOOPNE

    3.1 Transfer KomutlarBu grup ierisindeki komutlar herhangi bir bilgiyi register-register, bellek-register ve register-

    bellek blgeleri arasnda transfer etmek iin kullanlr.

  • 8/6/2019 Assembly 2003

    22/53

    22

    3.1.1 MOV KomutuMOV komutuna daha nce bellek adresleme blmnde ksaca deinilmiti. Bu ksmda

    komutun kullanm hakknda daha ayrntl bilgi verilecektir. Mov komutunun eitli kullanmbiimleri aadaki gibidir.

    Genel Form : mov hedef, kaynak

    mov register, registermov bellek, registermov register, bellekmov bellek, sabit deermov register, sabit deer

    Yukarda mov komutunun eitli kullanm ekilleri gsterilmitir. Dikkat ederseniz kullanmekilleri arasnda bellek-bellek arasnda transfer yok. Yukardaki register ifadeleri hem genel

    amal registerlar hem de segment registerlarn temsil etmektedir. Yalnz, kesinlikle bir sabitdeer dorudan bir segment registerna atlamaz. Byle bir ilem aadaki gibi iki aamadagerekletirilir.

    mov ax, 1234mov 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. Aynekilde 8-bitlikbir registerdan 16-bitlik bir resgistera da transfer yaplamaz.

    Herhangi bir bellek blgesi dolayl adresleme ile adreslenip ierisine sabit bir deer atanmakistendii zaman atanacak deerin uzunluu belirtilmelidir.

    mov [bx], 12 Hata !

    mov byte ptr [bx], 12yada

    mov word ptr [bx], 1234

    byte ptr ve word ptr nekleri ile transfer edilecek bilginin boyu hakknda ilemciye bilgiverilmektedir.

    NOT: 32-bit ilemcilerde ( 80386 ve sonrasnda ) dword ptr neki ile 32-bit bilgi transferiyaplabilmektedir.

    MOV komutu flag registerlar zerinde herhangi bir deiiklik yapmamaktadr.

  • 8/6/2019 Assembly 2003

    23/53

    23

    3.1.2 XCHG KomutuXCHG (exchange) komutu iki deeri karlkl olarak deitirmek iin kullanlr. Tabi yine

    deiiklik yaplacak deerlerin ayn boyda olmas gerekmektedir. Genel formu aadakigibidir.

    xchg register, registerxchg bellek, register

    xchg komutunun kullanmnda operandlarn yerleri nemli deildir. Yani xchg bellek,register ile xchg register, bellek ayn ii yapmaktadr.

    mov ax,1234 AX=1234hmov bx, 5678 BX=5678hxchg ax,bx AX=5678h BX=1234h

    XCHG komutu flag registerlar zerinde herhangi bir deiiklik yapmamaktadr.

    3.1.3 LEA KomutuLEA komutunun kullanm MOV komutu ile benzerlik gstermesine karn baz durumlarda

    programcya iki yada komut ile yaplacak bir ilemi tek komut ile yapma olanasalamaktadr. Genel formu aadaki gibidir.

    lea register, bellek

    Komutun kullanmna birka rnek verince programcya salad kolaylklar daha basitanlalacaktr.

    lea ax, [bx] mov ax, [bx]lea bx, 3[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

    kullan

    lm

    t

    r) Aa

    daki rnekler incelenirse komutun salad

    kolayl

    k a

    ka farkedilecektir.

    lea ax, 3[bx] BX = BX+3 mov ax, bxlea ax, 8[bx+di]

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

  • 8/6/2019 Assembly 2003

    24/53

    24

    3.1.4 PUSH KomutuPUSH 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 uzunluundaolmaldr. Bunun yan sra deer ile gsterilen ksm sabit bir deer alamaz. Yani PUSH ilestack zerine yazlacak deer ya bir register ierisindeki deer yada bir bellek blgesindekideer olmaldr.

    PUSH komutu ile stack zerine bilgi yazld iin SPnin deeri deimektedir. cra edilenher 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 AX = 1234hpush ax AX > STACK , SP = SP-2

    Stack zerine bilgi yazma ilemi gerekli deerlerin geici bir sre saklanmas iin ve bazUNIX 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 buradatek fark, PUSHF komutu ile aktarlacak bilginin herhangi bir register yada bellek blgesindendeil de flag registerdan alnmasdr. Komutun kullanm aadaki gibidir.

    PUSHF

    Grld gibi komutun kullanm srasnda hibir register yada bellek adresikullanlmamtr. Onun yerine stack zerine atlacak bilgi dorudan 16-bit uzunluundaki flagresigter 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 zerineyazlan 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 ilebilgi transferi yaplrken yazlan ve okunan bilgilerin sralamas nemlidir. Programlaryazlrken stack zerindeki ilemlerde hesaplama hatas yaplmas sk karlalandurumlardandr. Komutun genel kullanm aadaki gibidir.

    POP alc_alan

    Yukarda alc alan bir bellek blgesi veya register olabilir.

  • 8/6/2019 Assembly 2003

    25/53

    25

    mov ax,1234 AX = 1234hpush ax AX > STACK , SP = SP-2

    mov ah,01 AH = 01 ,AXin deeri deiti!pop ax AX = 1234h

    rneimizde nce AXe bir deer atanyor ve daha sonra AHn deeri deitirilmek suretiile dolayl olarak AXinde deeri deitiriliyor. Son ilemde de POP komutu ile AXin ncedenstack 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 eletirmekyanl 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 ilemciiin ifade ettikleri deerler aada verilmitir.

    0. bit Carry biti2. bit Parity biti4. bit Auxilary biti6. bit Zero biti7. bit Sign biti8. bit Trap biti9. bit Interrupt biti10. bit Direction biti11. bit Overflow biti

    POPF komutu anlalaca zere flag registern deerini tamamen deitirmektedir. Komuttpk PUSHF komutunda olduu gibi tek bana kullanlr.

    PUSH, PUSHF, POP ve POPF komutlarnn stack zerinde ileyilerini tam olarakkavrayabilmek iin yaznn daha nceki blmlerinde yer alan Stack ksmn tekrarokumanz tavsiye ederim.

    3.1.8 LAHF KomutuLAHF (Load AH from Flags) komutu AH registerna flag registern dk seviyeli baytn

    kopyalar. Kopyalanan bitler sign, zero, auxilary, parity ve carry bitleridir. Bunlar

    n d

    ndakalan overflow, direction, interrupt ve trace bitlerinin komut ile bir ilgisi yoktur. Komutunkullanm aadaki gibidir.

    lahf

    Grld gibi komut tek bana kullanlmaktadr. Komutun icras srasnda flag registerdaherhangi bir deiiklik olmaz.

    3.1.9 SAHF KomutuSAHF (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

  • 8/6/2019 Assembly 2003

    26/53

    26

    etkilenen bitler sign, zero, auxilary, parity ve carry bitleridir. Komutun kullanm LAHFkomutunda olduu gibi tek banadr.

    3.2 Giri/k Komutlar

    80x86 serisi ilemcilerde giri ve k birimlerine ulamak iin in ve out komutlarkullanlr. Aslnda bu komutlar bir bakma MOV komutu ile benzerekilde i yapmaktadr. Tekfark bu komutlarn zel olarak bilgisayarn G/ birimi iin ayrlm olan bellek blgesi ilealmalardr.

    3.2.1 IN Komutu

    in ax/al, portin 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 eriilmekistenen port 256 ve 80x86 ilemcinin maksimum destekledii port numaras olan 65535arasnda ise istenen port numaras DX ierisine atlr ve daha sonra IN komutu ile eriimsalanr. Komutun icrasnda flag register herhangi bir deiiklie uramaz.

    3.2.2 OUT Komutu

    out port, ax/alout dx, ax/al

    OUT komutunun kullanm IN komutu ile benzerlik gstermektedir. Tek fark IN komutundaport ierisindeki bilgi AX/ALye atanrken OUT komutunda AX/AL ierisindeki bilgi portagnderilir. Yine IN komutunda olduu gibi 0-255 aras adreslerde dorudan port numarasgirilirken 256-65535 aras adreslerde DX ile adresleme yaplr. Komutun icrasnda flag registerherhangi bir deiiklie uramaz.

    mov al, 2e AL = 2Ehout 70, al 70h. Porta 2E deeri gnderiliyor

    in al,71

    Gnderilen istee kar

    l

    k 71h.porttan geliyor. Gelen deer ALierisine alnyor.

    Yukarda OUT komutu ile 70h CMOS portuna bilgi yollanyor. CMOS gelen sinyale 71hportundan 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 yansra elde edilen sonular deiik biimlerde saklama olana salar. Aritmetiksel komutlarn

    icras srasnda flag register deiiklie uramaktadr.

  • 8/6/2019 Assembly 2003

    27/53

    27

    3.3.1 ADD KomutuADD komutu toplama ilemini gerekletirmek iin kullanlr. Genel formu aadaki gibidir.

    add hedef, kaynak

    ADD komutu ile kaynak ierisindeki deer hedef ile toplanp hedef ierisinekaydedilir. hedef ve kaynak alanlar register-register, bellek-register, register-bellekiftlerinden birisi olabilir.

    mov ax, 1234 AX = 1234hmov word ptr [4444], 1000 [4444] = 1000hadd word ptr ax, [4444] AX = AX + [4444]

    = 1234h + 1000h

    = 2234h

    Yukardaki rnekte ilk nce AXe 1234h deeri atanmtr. Daha sonra 4444h adresli bellekgzne 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 toplanpsonu yine AX ierisine atlmtr.

    3.3.2 ADC Komutu ADC komutu da tpk ADD komutu gibi toplama ilemi iin kullanlr. Tek fark ADCkomutunda toplama bir de carry flagn deerinin eklenmesidir. Genel formu aadaki gibidir.

    adc hedef, kaynak

    Yaplan ilemi aritmetiksel olarak gstermek gerekirse aadaki gsterim yanlolmayacaktr.

    hedef = hedef + kaynak + carry flagn deeri

    ADC komutu ile pe pee yaplan toplama ilemlerinde eldelik saynn gz ard edilmemesisalanmaktadr.

    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

  • 8/6/2019 Assembly 2003

    28/53

  • 8/6/2019 Assembly 2003

    29/53

    29

    Yukarda arpma ilemi iin kullanlacak ikinci saymz bir bellek blgesinden okunmaktadr.Dikkat ederseniz ilemlerimde word ptr ile atama yaptm deerin uzunluu hakkndailemciye 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 gerekmektedirDiyelim ki arpma ilemi sonunda bulduunuz sonu 16-bitlik bir alana smyor. Byle bir

    durumda bulunan sonu DX:AX ikilisi ierisinde saklanr.

    mov ax, 4321 AX = 4321hmov cx, 4586 CX = 4586hmul cx AX * CX = 4321h * 4586h

    = 123B0846h (32-bit)= DX = 123Bh , AX = 0846h

    3.3.6 IMUL KomutuIMUL komutu da MUL komutu gibi arpma ilemi iin kullanlr tek fark IMUL komutunun

    iaretli saylar zerindeki ilemler iin kullanlan bir komut olmasdr. IMUL komutu ilegerekletirilen bir ilem sonucunda AH (sonu AX ierisine syor ise) veya DX (sonu AXierisine smyor ise) sfrdan farkl ise arpma ileminin sonucu negatiftir. Eer ilemsonucunda 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 KomutuBlme 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 aadakigibidir.

    div blen_deer

    Blme ileminde blen_deeriin uzunluu, ilem srasnda kullanlacak blnen deerinuzunluunu da belirler. Szgelimi, blen_deeriin 8-bitlik bir deer olmas halinde blnenolarak 16-bitlik AX register ileme alnacaktr. lem sonunda blm deeri AL, kalan deeride AH ierisine kopyalanr. Aynekilde blen_deeri 16-bitlik bir deer ise blnn deeri

    olarak DX:AX ifti ileme al

    n

    r. Yine ilem sonundaki blm deeri AX ve kalan deeri deDX 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, 4a2cdiv byte ptr [2155]

  • 8/6/2019 Assembly 2003

    30/53

    30

    DIV komutunu kullanrken dikkat edilmesi gereken bir husus da sfr ile blme durumu ilekarlamamak ve blm ksmndaki deerin alc alana sp smaddr. Mesela aadakigibi bir ilem sonunda hata ile karlalacaktr.

    mov ax, aaaadiv 4

    Yukardaki ilemin sonucu ( AAAAh / 4H = 2AAAH 16-bit ) olan 2AAAh says 8-bit birregister olan AL ierisine smayaca iin hatal olacaktr.

    3.3.8 IDIV KomutuIDIV 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 birnokta AH veya DX deerleri sfrlanrken saynn iaret bitinin korunmasdr. Mesela ilemekonulacak 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 KomutuINC komutu kendisine verilen register yada bellek blgesi ierisindeki deeri bir arttrr. C

    dilindeki ++ komutu ile ayn ii yapmaktadr. Aada, komutun kullanmn C dilindeki gibigstermeye altm.

    mov ax, 000f degisken = 15 ;inc ax degisken++ ;

    Flag register zerinde, carry flag dnda, ADD komutu ile ayn etkiyi yapar.

    add ax,1inc ax

    Yukardaki iki komut da ayn ii yapmaktadr. Fakat INC komutu ile gerekletirilen ilem,ilemci tarafndan daha hzl birekilde gerekletirilir ve bellekte kaplad alan ilkinin te

    biri kadardr. Bu sebeplerden add ax,1 gibi kullanmlar yerine inc ax komutukullanlmaktadr.

    inc byte ptr [125a]inc word ptr [7ad8]inc byte ptr [bx+di]

  • 8/6/2019 Assembly 2003

    31/53

  • 8/6/2019 Assembly 2003

    32/53

    32

    3.4 Mantksal KomutlarBu komutlar herhangi bir ilem srasnda mantksal karlatrmalar yapmak iin kullanlr.

    Blm ierisindeki komutlar incelenmeden nce dokmann Bitler zerinde Mantksallemler ksmnn tekrar gzden geirilmesinde fayda var.

    Bu komutlar icra grrken kullanlan register yada bellek blgesinin ierisindeki deerlerayr ayr bitler halinde ileme sokulur.

    3.4.1 AND Komutu

    and hedef, kaynak

    Komutun kullanmnda hedef ve kaynak alanlarna srasyla register-register, bellekblgesi-register, register-bellek blgesi, register-sabit deer ve sabit deer-register iftlerindenbiri kullanlabilir. lem srasnda hedef ve kaynak blgesindeki deerler mantksak VE ilemine sokulur ve

    ilemin sonuncu hedef alana kaydedilir.

    mov ah, a5 AH = A5h = 1010 0101 (binary)mov al, c1 AL = C1h = 1100 0001 (binary)and ah, al AND_________________

    1000 0001 (binary) = 81h

    Yukarda AHa A5h ve ALye C1h deerleri atanm ve daha sonra and ah, al komutu ileiki deer mantksal ve ilemine sokulmutur. lem sonucunda 81h deeri elde edilmitir.Elde edilen deer AH registeri ierine atlmtr.

    3.4.2 TEST KomutuTEST 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 mant

    ksal veya ilemini gerekletirmek iin kullan

    l

    r. hedef ve kaynakalanlar yerine kullanlabilecek deerler AND komutu ile ayndr. lem gerekletikten sonraelde 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. lemsonucunda 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.

  • 8/6/2019 Assembly 2003

    33/53

    33

    3.4.5 NOT Komutu

    not hedef

    NOT komutu dier mantksal komutlardan ayr olarak flag register zerine etki etmeyen tekkomuttur. Kullanm ekli ile de dier komutlardan farkllk gsterir. hedef alan ierisindekideerin bitleri ters evrilip yine ayn alana yazlr.

    3.5 Kaydrma ve Dndrme KomutlarBu blmde daha nce anlatlan Shift ( Kaydrma ) ve Rotate ( Dndrme ) lemleri

    balkl ksmdaki ilemlerin assembly komutlar ile gerekletirilmesi anlatlacaktr.

    3.5.1 SHL/SAL KomutlarSHL (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 pozisyonundakideer de carry flag ierisine yazlr.

    3.5.2 SHR KomutuSHL (Shift Right) komutunun kullanm aadaki gibidir.

    shr hedef, saya

    SHR komutu ile hedef blgesindeki bayt dizilimi saya defa saa kaydrlr. Saakaydrma 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 yksekseviyeli bit deerini alr.

    Aritmetiksel olarak herhangi iaretsiz bir sayy SHR say, a ilemine sokmak, sayy 2 ileblmek ile ayneydir.

    3.5.3 SAR Komutu

    sar hedef, saya

    SAR (Shift Arithmetic Right) komutu SHR komutunda olduu gibi hedef alan ierisindekibit dizilimini saya kere saa kaydrr. SHR komutundan fark, sondaki 7. veya 15. bitpozisyonuna sfr deil de yine 7. veya 15. bit pozisyonundaki deerin yazlmasdr. Flaglarzerine etkisi, SHRden farkl olarak, sign flag ierisine 7. veya 15. bit pozisyonundaki deerinyazlmasdr.

  • 8/6/2019 Assembly 2003

    34/53

    34

    3.5.4 RCL Komutu

    rcl hedef, saya

    RCL (Rotate through Carry Left) komutu hedef alandaki bit diziliini sola dndrmehareketine sokar. lem sonrasnda carry flag ierisindeki deer 0. bit pozisyonuna yazlr vearta 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. Tekfark 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 doruyaplmasdr. Yine dk seviyeli bit pozisyonundaki deer carry flag ierisine ve carry flagierisindeki 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 ileilikilendirdiimiz ekilde ilikilendirebiliriz. Yani ROR komutu da RCR komutu gibialmaktadr. Tek fark ROR komutundan yksek seviyeli bit pozisyonuna atanan deer carryflag ierisindeki deil alak seviyeli bit pozisyonu iindeki deerdir.

    NOT: Yukarda shift ve rotate ilemlerini gerekletirilen komutlarda kullanlan saya

    ifadesi normalde 1 olarak kullan

    l

    r. 80286 ve sonras

    ilemcilerde herhangi bir sabit deerkullanm getirilmitir. Daha nceki ilemcilerde 1 dnda bir deer kullanmak iin aadakiyol izlenmelidir.

    mov cl, sayashr ax, saya

    Yukardaki gibi CL ierisine istenilen deer atanr ve daha sonra hedef alan ile ilemesokulur.

  • 8/6/2019 Assembly 2003

    35/53

    35

    3.6 Dallanma KomutlarDallanma 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 5bayt yer tutmaktadr. Komutlar arasndaki fark, FAR zellii tayanlarn farkl segmentierisindeki noktalara dallanma iin kullanlmasdr. Gerekli olmamakla beraber dallanmanntr 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 ksmnayazlr. Eer farkl bit segment ierisindeki bir adrese dallanma yaplyorsa hedef ksmndaSEGMENT:OFFSET eklinde bir adresleme kullanlr.

    Eer ayn segment ierisinde 128 veya +127 baytdan daha uzak noktalara dallanmayaplyorsa bu dallanma da FAR zellii tar. Bellekte kaplad alan 3 bayt olacaktr.

    Aslnda JMP komutu ile yaplan sadece IP deerine gidilecek_adres - bulunulan_adresdeerini 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, 0401mov si, 0002mov 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 aynsegment ierisinde 0407h numaral offset ierisindeki deerin gsterdii yerdir. rneimizde

    bu deer 1A8Ch deeridir.

    Benzerekilde herhangi bir genel amal

    16-bit register kullan

    larak da dallanma ilemigerekletirilebilir.

    mov ax, 1111jmp ax

    Yukarda JMP AX komutundan sonra programn ak 1111h numaral offset adresindendevam edecektir.

  • 8/6/2019 Assembly 2003

    36/53

    36

    Baka bir segment ierisine dallanma yapmak iin SEGMENT:OFFSET kalb kullanlr.Yani 4C70:0100 adresine dallanma yapmak iin JMP 4C70:0100 komutunu kullanmakgerekir. Komut bellekte 5 bayt yer kaplayacaktr.

    Yukarda ele alnan JMP komutu dnda assembly dilinde kullanlan koullu dallanmakomutlar da vardr. Bu komutlar herhangi bir ilem sonucunda flag registerlarn deerine gre

    programn akn etkilerler. Bu komutlar Cdeki if ve Pascaldaki if...then kalb ileeletirilebilir.

    Karlatrma ilemi herhangi bir aritmetiksel ilem olabilecei gibi bir karlatrma (CMP)yada dndrme olabilir. Fakat koullu dallanma komutlar ounlukla CMP komutundan sonrakarlatrma amal kullanlr.

    3.6.2 JZ/JE KomutlarJZ/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 yokmugibi programn akna devam eder.

    dec cxcmp cx,0

    jz 010ajmp 0110

    Yukardaki rnekte CX ierisindeki deer bir azaltlyor. Daha sonra elde edilen deer sfrile 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. Busefer koulsuz olarak 0110h adresine bir dallanma yaplyor.

    rneimizdeki yazm ekli DEBUG ierisinde kullanlan yazm eklidir. Assemblyprogramlarn bir assembler program aracl ile birletiren programclar iin yazm ekli birazdaha farkldr. Assembler kullanan programclar offset adresleri yerine programn eitliyerlerine koyduklar etiketleri kullanrlar.

    .model small

    .codeorg 0100hbasla:

    mov dl,41hmov ah,02hint 21h

    dongu: inc dlint 21hcmp dl,5Ahjnz dongu

    mov ah,4Ch

  • 8/6/2019 Assembly 2003

    37/53

    37

    int 21hend basla

    Yukarda MASM ile yazlm bir assembly program grlmektedir. Bu aamada programanlamaya almayn yalnzca program ierisinde kullanlan etikete dikkat edin. INC DLkomutunun olduu satr dongu etiketi ile iaretlenmitir. JNZ dongu komutu ile bir offsetadresi belirtilmeyip bir etiket yardm ile istenilen noktaya atlama yaplmtr. Yukarda DLierisindeki deer 41htan balayp 5Ah olana kadar arttrlmaktadr.

    Pratikte, DEBUG program yazmak iin uygun bir ortam deildir. Yazacanz assemblyprogramn herhangi bir assembler yazlm ile birletirip kullanrsnz.

    Yukardaki program COM dosyas olarak derlenirse 19 bayt alan kaplar ve ekrana alfabedekibyk harfleri yazar.

    3.6.3 JNZ/JNE KomutlarJNZ/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 programkomutun gsterdii yere dallanarak akna devam eder.

    rnek olarak JZ iin verilen MASM program incelenebilir. jnz dongu komutu ile zero flagierisindeki deer kontrol ediliyor. Deerin sfrdan farkl olmas halinde dongu ile iaretliyere 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

    int main(){

    int ch=65; /* hex 41 */

    dongu:if (ch!=90) /* hex 5A */

    { printf("%c",ch);ch++;goto dongu;

    }

    return 0;}

  • 8/6/2019 Assembly 2003

    38/53

    38

    C rneinde, ilk programdaki cmp ve jnz ile gerekletirilen ilemler if ve gotodeyimleri 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 carryflagn deerine gre dallanma gerekletirirler. Herhangi bir ilem sonrasnda carry flagierisinde 1 deeri varsa programn ak JB komutu ile gsterilen yere gider. Aksi taktirde JBkomutu dikkate alnmadan programn normal akna devam edilir.

    3.6.5 JBE/JNA KomutlarJBE/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 JBEkomutu 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 flagierisindeki deerin sfr olmas halinde JNB komutu ile gsterilen noktaya dallanmagerekletirilir.

    3.6.7 JG/JNLE KomutlarJG/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 ierisindesfr deerinin bulunmasdr. Gerekli koullarn salanmas halinde JG komutu ile gsterilennoktaya dallanma yaplacak ve programn ak o noktadan devam edecektir.

    3.6.8 JA/JNBE KomutlarJA/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 bitininde 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 KomutlarJL/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 bitinfarkl deerler iermesi durumunda programn ak JL komutu ile gsterilen noktaya

    ynlendirilir.

    3.6.10 JLE/JNG KomutlarJLE/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 iinzero flag ierisinde 1 deerinin olmas yada sign ve overflow flaglarnn deerlerinin farklolmas gerekmektedir. Gerekli koul salanrsa programn ak JLE komutu ile gsterilennoktaya kaydrlacaktr.

    3.6.11 JS ve JNS KomutlarJS (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.

  • 8/6/2019 Assembly 2003

    39/53

    39

    Gerekli koulun salanmas durumunda program JS veya JNS komutu ile gsterilen noktadanakna devam edecektir.

    3.6.12 JO ve JNO Komutlar

    JO (Jump if Overflow) ve JNO (Jump if No Overflow) komutlarnn icras srasnda overflowflag ierisindeki deere baklr. Overflow flag ierisinde 1 JO komutu iin ve sfr olmas JNOkomutu iin gerekli kouldur.

    3.6.13 JCXZ KomutuJCXZ (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 atlamagerekletirilebilir. Eer program ierisinde daha uzak bir mesafeye dallanma yapmakgerekiyorsa 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 sonrakietikete 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 birekilde incelenirse yukardaki komut kmesinin JE 184komutu ile ayneyi yapt grlecektir.

    3.7 Dng KomutlarBu kategorideki komutlar herhangi bir rutini belirli kereler tekrarlamak iin kullanlr.

    Assembly dilinde kullanlan dng komutlar bir bakma C dilindeki for ve while dngleriile eletirilebilir.

    3.7.1 LOOP KomutuBu komut herhangi bir durumu belirli kereler tekrarlamak iin kullanlr. Saya olarak CX

    register ierisindeki deer alnr. Her dngde CX ierisindeki deer bir azaltlr ve CXindeeri 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 kullanlarakbirletirilecek bir program iin bir etiket olmaldr. LOOP komutu ile yaplabilecek maksimumatlama +128/-128 bayttr. Komutun kullanm gerei atlanlacak nokta LOOP komutundannceki adreslerden birisi olduu iin maksimum gidilebileceimiz adres 128 baytmesafededir.

  • 8/6/2019 Assembly 2003

    40/53

    40

    1E27:0100 XOR AX, AX1E27:0102 MOV CX,00051E27:0105 INC AX

    1E27:0106 LOOP 0105

    Yukardaki programn sonunda AXin deeri 5 olacaktr. Programn banda CX ierisineatlan 5 deeri LOOP ile gerekletirilecek dng saysn belirlemektedir.

    1E27:0100 XOR AX, AX1E27:0102 MOV CX,00051E27:0105 INC AX1E27:0106 DEC CX

    1E27:0107 JNZ 0105

    Yukardaki program bir nceki rnekteki program ile ayn ilemi gerekletirmektedir. Tekfark LOOP 0105 komutu yerine INC CX ve JNZ 0105 komutlarnn kullanlmasdr.Gerekte de LOOP ile yaplan bu iki komutun yapt ilemden baka birey deildir.

    3.7.2 LOOPZ/LOOPE KomutlarLOOPZ/LOOPE komutlar da herhangi bir durumu belirli kereler tekrarlamak iin kullanlr.

    Komutun kullanm LOOP komutu ile ayndr. Tek fark LOOPZ komutu icras srasnda CXregisternn deerinin yan sra zero flag da kontrol eder. CXin deeri sfrdan farkl olduusrece ve zero flag ierisindeki deer 1 olduu srece komut ile gsterilen yere dallanmayaplr.Her iki durumdan birisinin gereklememesi halinde dngden klr.

    3.7.3 LOOPNZ/LOOPNE KomutlarLOOPNZ/LOOPNE komutlar da LOOP komutu gibi CX registern saya olarak kabul

    ederek bir koulu belirli kereler tekrar etmek iin kullanlr. Dng ilemi CXin deeri sfrdanfarkl 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 durumlardabilgisayara ait evre aygtlar ile ilem yapmak zere, RAM veya BIOS zerindeki belirlirutinleri kullanmak zere yada baz geersiz sonularn olumas durumunda ilemci tarafndankesme (interrupt) ad verilen rutinler altrlr.

    Benim burada ksaca deineceim RAM yada BIOS zerinde tanml alt rutinlerin programlartarafndan arlmas ile oluan kesmelerdir. Bu alt rutinler bir ok ii programcnn yerineyapmaktadr. Bu alt rutinleri yksek seviyeli dillerdeki hazr ktphane fonksiyonlar ileeletirmek yanl olmaz.

    Kullanlabilecek her kesmenin nceden tanml bir numaras vardr. Kesmenin kullanm bunumarann INT komutuna parametre olarak aktarlmas ve gerekli registerlara deerlerinatanmas ile gerekletirilir. rnek olarak DOS altnda ok sk kullanlan INT 21 verilebilir.

    Bir DOS kesmesi olan INT 21in AH = 01 numaral fonksiyonunu kullanalm.

  • 8/6/2019 Assembly 2003

    41/53

  • 8/6/2019 Assembly 2003

    42/53

  • 8/6/2019 Assembly 2003

    43/53

    43

    C:\WINDOWS\Desktop>debug-N set_curs.com-L-U

    1E4A:0100 B402 MOV AH,021E4A:0102 B607 MOV DH,071E4A:0104 B20C MOV DL,0C1E4A:0106 CD10 INT 101E4A:0108 B44C MOV AH,4C1E4A:010A CD21 INT 211E4A:010C D6 DB D61E4A:010D C70619DFAD82 MOV WORD PTR [DF19],82AD1E4A:0113 E8C901 CALL 02DF1E4A:0116 0BC0 OR AX,AX1E4A:0118 7478 JZ 01921E4A:011A 8BE8 MOV BP,AX1E4A:011C BF02D2 MOV DI,D202

    1E4A:011F 8B36C6DB MOV SI,[DBC6]-Q

    C:\WINDOWS\Desktop>

    Yukarda yine komut satrndan debug komutu verilerek DEBUG program altrlyor.Bu sefer N komutu diske yazlacak dosyann ismini deil, diskten bellee aktarlacakdosyann ismini vermek iin kullanlyor. Daha sonra L komutu ile ismi verilen dosya belleeykleniyor. Bellee yklenen program U komutu ile datlyor. Kodlar dikkatli incelerseniz

    programn ilk alt satrnn bizim bir nceki rnekte yazdmz assembly kodlarndanolutuunu greceksiniz. Kodlarn solundaki saylar assembly komutlarnn bellekte

    bulunduklareklidir (makine dili). 010C ve sonrasndaki satrlardaki assembly komutlar oanda bellekte rasgele bulunan kodlardr. Bizim programmz ile bir ilgileri yoktur. En sonolarak da Q komutu ile DEBUGtan klyor.

    T komutu ile bellekteki herhangi bir program adm adm iletilebilir. Komutun kullanmnabasit bir rnek aada verilmitir.

    Microsoft(R) Windows 98(C)Telif Hakk Microsoft Corp 1981-1999.

    C:\WINDOWS\Desktop>debug

    -A 1001E2C:0100 mov ax,12341E2C:0103 mov bx,45671E2C:0106 mov ax,bx1E2C:0108-T = 100

    AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=1E2C ES=1E2C SS=1E2C CS=1E2C IP=0103 NV UP EI PL NZ NA PO NC1E2C:0103 BB6745 MOV BX,4567-T

    AX=1234 BX=4567 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

    DS=1E2C ES=1E2C SS=1E2C CS=1E2C IP=0106 NV UP EI PL NZ NA PO NC1E2C:0106 89D8 MOV AX,BX

  • 8/6/2019 Assembly 2003

    44/53

    44

    -T

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

    -

    Grdnz gibi DEBUG ile yazlan program adm adm iletilmektedir. T komutunuyazdnz 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 olduuvarsaylmaktadr.

    Linux iletim sisteminin alabilecei en eski CPU modeli 80386 mimarisidir. Yani linux8086, 80186 yada 80286 kullanan bir bilgisayar zerine kurulamaz. Intel firmasnn 80386 ilegetirdii en byk yenilik, eski modellerde (8086, 80186 yada 80286) kullanlan 16-bitregisterlar yerine 32-bit registerlarn kullanmna olanak salamasdr. Bu da programcyadaha ok adreslenebilir bellek alan salamaktadr. 80386dan nceki modellerde bir segment64KB boyutunda olurken bu rakam 80386 ve sonrasnda 4GBdan daha fazladr. (Bu dokmanyazdm 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. Dahanceki ilemcilerde kullanlan 16-bit segment registerlar olan CS, DS, ES ve SSe ek olarakiki 16-bitlik segment register olan FS ve GS eklenmitir. 80386da nceki modeller gibi 16-

    bitlik segment registerlar

    kullanmaktad

    r. Tm bunlara ek olarak flag register da 32-bitkapasiteye sahip olmutur. Geniletilmi yeni flag registern 16. biti debug resume(RF) ve17. biti virtual mode (VM) bitleri olarak adlandrlrlar. lemci sanal mod (virtual mode)altnda alrken 8086 mimarisi ile ilem yapar. Bunalara ek olarak, 80486da alignmentcheck flag biti 18. bit pozisyonuna eklenmitir.

    32-bit programlar yazlrken 16-bitlik ve 8-bitlik registerlar kullanlabilmektedir.80386nn kulland registeremas aadaki gibidir.

  • 8/6/2019 Assembly 2003

    45/53

    45

    Linux altnda yazacamz programlarn hepsi 80386nin salad 32-bit kapasiteliregisterlar kullanabilmektedir. Linux altnda assembly dili kullanm programcya DOSaltndaki kadar byk avantajlar salamamaktadr. altrlan programlar korumal mod(protected mode) altnda alt iin programcnn BIOS tarafndan salanan kaynaklaraeriimi 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 vekorumal moddan dolay kullanmdaki kstlamalar dilin Linux (yada herhangi bir UNIX trevisistem) altndaki poplaritesini azaltmtr. Fakat yine de baz noktalarda baka alternatif

    bulunmamakta ve assembly dilinin kullanm zorunlu olmaktadr. (Linux Kernel Ver1.0kaynandaki boot dosyalar, http://www.kernel.org)

    Linux altnda kaydedilen assembly dosyalar .s yada .S uzantsn alr. Program kullanlanassembler programna gre AT&T yada Intel szdizimi kullanlarak yazlr. Eer assemblerolarak linux ve DOS altnda kullanlan NASM (Netwide Assembler) kullanlacaksa yazlan

    program Intel szdizimi kullanlarak yazlr. Dokmanda buraya kadar anlatlan assembly dilikurallar 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 derlemesrasnda as adnda bir assembler program kullanr. as, AT&T szdizimini kulland iinGCC ile derlenen C dosyalarndaki kodlar da mecburen AT&T szdizimi ile yazlmaldr.

    Bu dokmanda temel olarak Intel ve AT&T szdizimleri arasdaki farklar zerindedurulacaktr ve GNU Assembler kullanmna baz rnekler verilecektir.

    6.1 Intel ve AT&T SzdizimleriYukarda da belirttiim gibi linux altnda assembly programlar yazlrken kullanlan

    szdizimi AT&T standartlarndadr. DOS altnda kullanlan assembler programlar Intelszdizimi ile yazlm kodlar birletirirken, linux (ve UNIX trevi sistemlerde) kullanlanlar,

    bir iki istisna dnda AT&T szdizimini art komaktadr.

  • 8/6/2019 Assembly 2003

    46/53

  • 8/6/2019 Assembly 2003

    47/53

    47

    6.1.4 Belleklemleri80386nn yeni registerlarn yan sra programclara salad en byk yenilik bellek

    adresleme metotlarndadr. Bu blm okumadan nce 8086 serisinde bellek adreslemekonusunda bilgi sahibi olmanz gerekmektedir.

    8086 serisinde dolayl adresleme yaplrken sadece BX register kullanlrken, 80386 vesonras ilemcilerde herhangi bir genel amal (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP)register kullanlabilmektedir. Yani aadaki yazm 80386 ncesi bir ilemcide almazken80386 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 ekilleriaada 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 silecektirsanrm.

    Intel AT&T

    mov eax, [ecx*8h]mov edx, [ebx+ecx*08h-05h]

    movl 0x08(%ecx), %eaxmovl 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 ilkininbase ve ikincisinin index olduu varsaylr. Programc bu noktada dikkatli olmaldr.nk ilemci bilgiyi alaca segmenti kullanlan base registera gre belirler. Sadece baseolarak ESP yada EBP kullanld zaman geerli segment Stack Segmenttir. Dier durumlardavarsaylan 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 numaraEAX 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

  • 8/6/2019 Assembly 2003

    48/53

    48

    sistem arlarnda ise yine sistem ar numaras EAX ierisine atlr. Daha sonra gerekliagrmanlar sondan baa doru stack ierisine atlr ve ESP EBX ierisine kopyalanr. Sistemarlar /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 asmfnoyan@tux:~/asm$ vi ilk.s

    ilk.s dosyas ierisine aadaki kodlar yazn.

    .text

    .globl _start_start:

    movl $12,%eaxmovl $0x12, %eax

    xorl %eax, %eaxinc %eaxint $0x80

    fnoyan@tux:~/asm$ as ilk.s o ilk.objfnoyan@tux:~/asm$ ld ilk.obj o ilkfnoyan@tux:~/asm$ ./ilkfnoyan@tux:~/asm$fnoyan@tux:~/asm$ gdb -q(gdb) file ilkReading symbols from ilk...(no debugging symbols found)...done.(gdb) disas _startDump of assembler code for function _start:0x8048074 : mov $0xc,%eax0x8048079 : mov $0x12,%eax0x804807e : xor %eax,%eax0x8048080 : inc %eax0x8048081 : int $0x80End of assembler dump.(gdb)

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

  • 8/6/2019 Assembly 2003

    49/53

  • 8/6/2019 Assembly 2003

    50/53

  • 8/6/2019 Assembly 2003

    51/53

    51

    xorl %eax, %eaxincl %eaxint $0x80

    Programmzn sonunda da, program bitirmek iin _exit() sistem ars (sistem ar numaras1) 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_dosyaolarak deitiriyoruz. Bu ie iin yine bir sistem arsn kullandk: rename (sistem arnumaras 38).

    Kodumuz aadaki gibi.

    .dataold_path: .ascii "./dosya\0"new_path: .ascii "./dosya_yeni\0"

    .text

    .globl _start_start:

    movl $38, %eaxmovl $old_path, %ebxxorl $new_path, %ecxint $0x80

    xorl %eax, %eaxincl %eaxint $0x80

    Yukarda da yine bir nceki rnekte olduu gibi sistem ars kullanld. Bu sefer de sistemar numarasna ek olarak iki argman gerekti ve ilki EBX ikincisi de ECX ierisine yazld.

    movl $old_path, %ebx komutuyla belirtilen old_path sabiti derlenme s

    ras

    nda gerekli offsetadresi ile deitirilmektedir. Aadaki GDB kts bunu daha kolay anlamanz salayacaktr.

    fnoyan@tux:~/asm$ gdb -q(gdb) file ucReading symbols from uc...(no debugging symbols found)...done.(gdb) disas _startDump of assembler code for function _start:0x8048074 : mov $0x26,%eax0x8048079 : mov $0x804908c,%ebx0x804807e : xor $0x8049094,%ecx0x8048084 : int $0x80

    0x8048086 : xor %eax,%eax

  • 8/6/2019 Assembly 2003

    52/53

    52

    0x8048088 : inc %eax0x8048089 : int $0x80End of assembler dump.

    GDB ile grntlenen kodda komutlarn soneklerinin olmadna dikkat ediniz.

    nternet Adresleri :

    Dokmann bu son ksmnda assembly ile daha geni apta uramak isteyenler iin bazinternet sitelerinin adresleri bulunmaktadr.

    http://linuxassembly.org Linux ve dier UNIX tabanl sistemler altnda

    assembly dili ve kullanm hakknda kaynakbulabileceiniz bir site.

    http://www.janw.easynet.be/eng.html Linux altnda assembly dilinin kullanmn anlatanbir baka yaz.

    http://www.geocities.com/SiliconValley/Ridge/2544/

    Linux altnda GCC ile satr ii assembly kullanmhakknda bilgi bulabileceiniz bir adres.

    ftp://www6.software.ibm.com/software/developer/library/l-ia.pdf

    GCC ile satr ii assembly hakknda baka birdokman.

    http://members.lycos.co.uk/kasiasyg/ Adresleri yukarda verilen baz dokmanlarn Trkeevirilerinin bulunduu bir site.

    http://www.programmersheaven.com Sadece assembly deil daha birok programlama dilihakknda rnek kod ve kaynak bulabileceiniz geniierikli bir site.

    http://www.web-sites.co.uk/nasm/ Linux ve MS-Windows iletim sistemleri altndakullanlan bir assembler olan NASMn sitesi.

    http://win32asm.cjb.net Windows iletim sistemi altnda 32-bit assemblyprogramlamay renebileceiniz en iyi sitelerden biri.

    Yukardakilerin dnda adreslerini bilmediim ama sizin bir arama motorunda gerekli bilgileriyazarak kolayca eriebileceiniz baz faydal kaynaklar.

    The Art Of Assembly Language

    PC Assembly Language Yazar : Paul.A Carter

    Ralf Browns Interrupt List Yazar : Ralf Brown

    http://linuxassembly.org/http://www.janw.easynet.be/eng.htmlhttp://www.geocities.com/SiliconValley/Ridge/2544/http://www.geocities.com/SiliconValley/Ridge/2544/ftp://www6.software.ibm.com/software/developer/library/l-ia.pdfftp://www6.software.ibm.com/software/developer/library/l-ia.pdfhttp://members.lycos.co.uk/kasiasyg/http://www.programmersheaven.com/http://www.web-sites.co.uk/nasm/http://win32asm.cjb.net/http://win32asm.cjb.net/http://www.web-sites.co.uk/nasm/http://www.programmersheaven.com/http://members.lycos.co.uk/kasiasyg/ftp://www6.software.ibm.com/software/developer/library/l-ia.pdfftp://www6.software.ibm.com/software/developer/library/l-ia.pdfhttp://www.geocities.com/SiliconValley/Ridge/2544/http://www.geocities.com/SiliconValley/Ridge/2544/http://www.janw.easynet.be/eng.htmlhttp://linuxassembly.org/
  • 8/6/2019 Assembly 2003

    53/53