1 / 55

Sistem Programlama

Sistem Programlama. Bilgisayar. Bilgisayar Bileşenleri. Bilgisayar Bileşenleri. Sabit diskten veri okumak çok yavaş olduğu için programlar çalıştırılmadan önce RAM’e yüklenir. Programlar Sabit diskte saklanır. Klavyeden " hello " komutu okunuyor. " hello " programı hafızaya yükleniyor.

rinah-hicks
Download Presentation

Sistem Programlama

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Sistem Programlama

  2. Bilgisayar

  3. Bilgisayar Bileşenleri

  4. Bilgisayar Bileşenleri

  5. Sabit diskten veri okumak çok yavaş olduğu için programlar çalıştırılmadan önce RAM’e yüklenir Programlar Sabit diskte saklanır

  6. Klavyeden "hello" komutu okunuyor

  7. "hello" programı hafızaya yükleniyor

  8. Programın mesajı ekrana çıkartılıyor

  9. İşlemcinin Dili • İşlemci makine dili adı verilen komutları işletebilmektedir. • Bu komutlar ile oldukça basit işlemler gerçekleştirilebilmektedir. • Toplama, Çıkarma , Çarpma ,vb. • Makine komutları ikili sayı sistemi ile temsil edilmektedir.

  10. Assembly İkili sayı sistem ile program yazmak insanlar için oldukça zordur. Bunun yerine her bir makine komutuna sembolik bir isim verilerek ara bir dil oluşturulmuştur Bu dile sembolik (Assembly) dil adı verilmiştir Assembly dilinde yazılmış bir kodu makine diline çeviren programa Assembler adı verilmektedir.

  11. Çalıştırılabilir Dosya Formatı Windows Linux

  12. gcc ile assembly intsonuc=0; inttopla(inta,int b) { intt=a+b; sonuc+=t; returnt; } gcc -O1 -fno-omit-frame-pointer -c 1.c Obje Kodu 1.o

  13. gcc ile assembly Assembly kod karşılıkları Adres Makine Kodu 16 lık sistem (HEX)

  14. gcc ile assembly çıktısı .file "1.c" .text .globl _topla .def _topla;.scl 2;.type32;.endef _topla: LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 movl 12(%ebp), %eax addl 8(%ebp), %eax addl %eax, _sonuc cmpl $9, %eax jg L2 incl %eax L2: popl %ebp .cfi_def_cfa 4, 4 .cfi_restore 5 ret .cfi_endproc LFE0: .globl _sonuc .bss .align 4 _sonuc: .space 4 intsonuc=0; int topla(inta,int b) { int t=a+b; sonuc+=t; if(t<10) t++; return t; } 1.s gcc -O1 -fno-omit-frame-pointer -S1.c

  15. Derleyicinin kullandığı Makrolar .file "1.c" .text .globl _topla .def _topla;.scl 2;.type32;.endef _topla: LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 movl 12(%ebp), %eax addl 8(%ebp), %eax addl %eax, _sonuc cmpl $9, %eax jg L2 incl %eax L2: popl %ebp .cfi_def_cfa 4, 4 .cfi_restore 5 ret .cfi_endproc LFE0: .globl _sonuc .bss .align 4 _sonuc: .space 4

  16. Makroları kaldırma .file "1.c" .text .globl _topla .def _topla;.scl 2;.type32;.endef _topla: LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 movl 12(%ebp), %eax addl 8(%ebp), %eax addl %eax, _sonuc cmpl $9, %eax jg L2 incl %eax L2: popl %ebp .cfi_def_cfa 4, 4 .cfi_restore 5 ret .cfi_endproc LFE0: .globl _sonuc .bss .align 4 _sonuc: .space 4 .file "1.c" .text .globl _topla .def _topla;.scl 2;.type32;.endef _topla: LFB0: pushl %ebp movl %esp, %ebp movl 12(%ebp), %eax addl 8(%ebp), %eax addl %eax, _sonuc cmpl $9, %eax jg L2 incl %eax L2: popl %ebp ret LFE0: .globl _sonuc .bss .align 4 _sonuc: .space 4

  17. Veri Türleri

  18. Veriye Erişim

  19. Operatör işlemleri

  20. Örnek

  21. Taşıma operasyonları

  22. mov komutu movl $0x4050,%eaxImmediate--Register,4 bayt eax’e 0x4050 değeri yüklenir movw%bp,%spRegister--Register,2bayt bp’nin değeri sp’e yüklenir. movb(%edi,%ecx),%ahMemory--Register,1 bayt edi+ecx adresindeki veri ah’a yüklenir. movb$-17,(%esp)Immediate--Memory,1bayt esp’nin gösterdiği adrese -17 değeri yazılır movl%eax,-12(%ebp)Register--Memory,4 bayt ebp-12 adresine eax’ın değeri yazılır.

  23. movs ve movz komutları Başlangıçta %dh= CD, %eax = 98765432 değerlerine sahip olsun movb %dh,%al %eax=987654CD sadece veri taşıması yapılıyor. movsbl %dh,%eax %eax=FFFFFFCD eax’in ilk 8 baytı dh’ın değerini alırken kalanını dh’ın ilk bit değeri ile dolduruyor. movzbl %dh,%eax %eax=000000CD eax’inilk 8 baytı dh’ın değerini alırken kalanını 0 ile dolduruyor.

  24. push

  25. Örnek Aşağıdaki komutların sonuna uygun harfleri yazınız. (Örneğin mov yerine movb,movw,movl)

  26. Örnek Aşağıdaki assembly satırlarından hangisi hatalı yazılmıştır

  27. leal (Loadeffectiveaddress) Komutu leal7(%edx,%edx,4), %eax Adres bilgisini registerlara kopyalamak için kullanılır. Aşağıdaki komuttan önce edx a değerine sahip olduğunu düşünürsek eax’in sahip olacağı değer 5a+7 olacaktır. Derleyiciler leal komutunu adres yükleme ile alakası olmayan bir çok işlem için kullanabilmektedir.

  28. Örnek edx değerlerini bulunuz.

  29. Temel İşlemler

  30. Örnek

  31. Örnek

  32. Çarpma Çarpam ve bölme işlemleri işaretli(signed) ve işaretsiz(unsigned) sayı türleri üzerine yapılabilmektedir. Çarma işlemi ile 32 bitlik iki sayı çarpılıp sonuç olarak 64 bitlik bir sayı elde edilir. Mul komutuna verilen register ile eaxregisterındaki değer çarpılır. Sonuç edx:eaxregisterlarının birleştirilmesiyle elde edilir.

  33. Örnek X ve Y değişkenleri ebp+8 ve ebp+12 adreslerinde bulunsun. Bu iki sayıyı çarpıp sonucu esp+4 adresine yazıyoruz. Makinemizin little-endian olduğuna dikkat etmeliyiz.

  34. Bölme Bölme işlemi 64 bitlik bir sayının 32 bitlik bir sayıya bölünmesiyle elde edilir. Bölme işleminde edx:eaxregisterları istenilen registera bölünür. Bölüm eax kalan edx içerisine yerleştirilir.

  35. Fonksiyon çağırma Fonksiyon çağırma işlemi için callkomutu kullanılır. Fonksiyon parametreleri call komutu ile yollanamaz. Bu sebeple fonksiyona ait parametreler, fonksiyon çağrılmadan önce programa ait olan yığına yerleştirilir. Fonksiyon gövdesinde ilk olarak parametreler yığından sırası ile alınır.

  36. Yığın Yığın hafızada aşağı doğru büyür. Her bir fonksiyon yığın içerisinde bir alana sahiptir. Bu alana yığın çerçevesi (stackframe) adı verilir. Fonksiyon sonlandığında yığın çerçevesi de sisteme iade edilir. Yığın çerçevesinde yerel değişkenler ve parametreler saklanmaktadır. Yığında en son yazılan adresi gösteren register’aesp adı verilir.

  37. Fonksiyon çağırma _topla: LFB0: pushl %ebp movl %esp, %ebp movl12(%ebp), %eax addl8(%ebp), %eax addl %eax, _sonuc popl %ebp ret LFE0: .def ___main; .scl 2; .type 32; .endef .globl _main .def _main; .scl 2; .type 32; .endef _main: LFB1: pushl %ebp movl %esp, %ebp andl$-16, %esp subl $16, %esp call ___main movl $4,4(%esp) movl $3,(%esp) call _topla leave ret İkinci parametre yükleniyor 2.c İlk parametre yükleniyor 2.s intsonuc=0; int topla(inta,int b) { int t=a+b; sonuc+=t; return t; } int main() { topla(3,4); }

  38. call komutu callkomutu çağrılacak fonksiyonun adresine ihtiyaç duymaktadır. Çağrılan fonksiyonun işlemi bittikten sonra işlemcinin programa kaldığı yerden devam edebilmesi gerekir. Bu yüzden call komutu fonksiyonu çağırmadan önce kendisinden sonra gelen komutun adresini yığına yükler. Bu sayede çağrılan fonksiyon işlemi bittikten sonra ret komutunu çağırarak işlemciyi bu adrese yönlendirebilir. eip çalıştırılacak olan sıradaki komutun adresini tutmaktadır.

  39. Fonksiyon çağırma ve yığın

  40. Çağıran ve Çağrılan Registerlar bütün fonksiyonlar tarafından paylaşılmaktadır. Bir fonksiyon başka bir fonksiyonu çağırdığında çağrılan fonksiyon çağıran fonksiyonun önemli değerler sakladığı registerları değiştirebilir. Böyle bir problem oluşmaması için çağıran ve çağrılan belirli registerları yığında saklarlar. eax,ecx,edxregisterları çağıran fonksiyon tarafından saklanır ebx,esi,ediregisterları ise çağrılan fonksiyon tarafından saklanır.

  41. Çağıran ve Çağrılan Y değişkeni için ebxregisterını Kullanacağından ebx yığına yedekleniyor. 3.c P fonksiyonu Yığındaki eski y değeri fonksiyon bitmeden Hemen önce tekrardan registera yerleştiriliyor. 3.s

  42. Kontrol EIP EIP EIP Programlar çalıştığında sahip oldukları kodlar sıra ile işletiliyor. jmp türü komutlar ile akışın sırası değiştirilebilmektedir. jmp hiçbir koşul olmadan EIP’nin istenilen adrese gitmesini sağlamaktadır.

  43. Koşul Bayrakları • jmp koşulsuz atlama yaparken çeşitli şartların oluşması durumunda atlama yapan komutlarda mevcuttur. • Bu komutlar bayrak registerında bulunan bitlerin değerlerine göre atma yapmaktadır. • Bayrak registerının her bir biti ayrı ayrı isimlendirilmiştir. • Biz bunlardan 4 bit üzerinde duracağız • CF (CarryFlag- Elde bayrağı ):Son yapılan işlemin sonucunda elde edilirse bu bite 1 atanır. • ZF(Zero Flag-Sıfır bayrağı): Son yapılan işlemin sonucunda 0 çıkarsa bu bite 1 atanır. • ZF(SignFlag – İşaret bayrağı) : Son yapılan işlemin sonucunda negatif bir sayı çıkarsa bu bite 1 atanır. • OF(OverflowFlag-Taşma bayrağı):Son yapılan işlemin sonucunda elde edilirse bu bite 1 atanır. Negatif veya pozitif taşma olabilir.

  44. Karşılaştırma komutları

  45. SET komutu

  46. Örnek 3.c 3.s

  47. Atlama Komutları

  48. Örnek 2.satırdaki jmp komutu .L1 adresine atlama yaptıracaktır. Bu yüzden 3. satırdaki komut asla işletilemeyecektir.

  49. Örnek

  50. Örnek Assembly karşılığı sağda verilmiş olan C programının boşluklarını doldurunuz.

More Related