Şimdi Ara

makine kodu ve derleme???

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
11
Cevap
1
Favori
2.020
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
1 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • merhaba arkadaşlar. bilgisayar konusunda kafam çok karıştı. anlayamadığım bazı noktalar var. bilgisayarın 0 ve 1 ile işlem yaptığını biliyoruz. burası temel nokta. burda bir problem yok. insanlar makine koduyla program yazmak zor olduğu için assembly icat edilmiş(yanlışım yoksa). şuan kullanılan bir çok programlama dilininde temeli aslında assembly(yine yanlışım yoksa). biz bir programlama dili kullandığımız zaman onu makine diline derlememiz gerekiyor(derlenen diller için). çünkü bilgisayar sadece 0 ve 1 den anlıyor. merak ettim ve hex editör indirdim. c de yazdığım en basit bir programın(merhaba dünya) önce o dosyasının hex kodlarına baktım. sonrada exe dosyasının kodlarına baktım. aynı şekilde not defteriylede bu dosyalara baktım. burda hex editörle not defteri arasında, not defteri saçma sapan karakterler gösterirken hex editörü o karakterlerin hex kodunu gösteriyor. bazı exe dosyalarını hex editöründe açtığım zaman okuyabildiğim yazılarda gösteriliyor. hatta bazı programlama dillerindeki kodlarıda gördüm. burda anlamadığım bizim karakterlerimiz zaten bellekte makine kodu olarak tutuluyor. biz ekranda onu karakter olarak görüyoruz. yani klavyeden A karakterine tıkladığımızda bellekte A nın makine kodu tutulurken ekrana basılan şekil A. biz bunu neden bir daha makine koduna çeviriyoruz. hex editörün çalışma mantığınıda anlatırsanız sevinirim. kafamda bişeyler varda teyit edeyim... şimdiden teşekkürler...







  • Hex editör dediğin şey sadece dosyadaki byteları okur, bunları sayı ve karakter formunda gösterir. C ile sen de rahatlıkla bir hex editör yazabilirsin çok basit. Yani hex editör ile makine kodunun herhangi bir ilişkisi yok.

    Karakterleri makine koduna çevirme diye birşey de yok. Bilgisayar sayılar üzerinde işlem yapar, sadece sayılar. Bir sayı ya kod olarak yorumlanır ya da veri. Kaynak kodu derlediğin zaman kod ve veriler belli bir düzende sayılara çevrilir. Sıraları belli olduğu için birbirine karışmazlar.

    char ch = 'A';
    ++ch;

    Burada = ve ++ işlemleri kod, 'A' (65) ise veridir. Bunun asm karşılığı şöyle olabilir.

    ldi r2, 65 // load immediate
    inc r2 // increment register

    r2 işlemcinin yazmaçlarından biri. Hangi yazmacı kullanacağına derleyici karar verir (register allocation). Bunun hangi sayılara dönüşeceğini ise işlemci üreticisi belirler. Mesela 8-bitlik Atmel işlemcinin (makine komutları fix 2 byte) yukarıdaki ilk işlem için formatı şu şekilde.

    1110 iiii dddd iiii

    i ler veri, yani 65. Bu verinin binary açılımı 0100 0001. d ler "destination register". 8 tane veri biti olduğu için bu komut en fazla 1 byte veri alabilir, 4 tane yazmaç biti olduğu için de 16 adet yazmaçtan biri seçilebilir. Bitleri yerlerine koyarsak;

    1110 0100 0010 0001, yani 0xE421.

    Gördüğün gibi hex olarak 2 byte sayı var. Eğer işlemci little endian dizilimi ile çalışıyorsa önce 21 sonra E4 gider. Big endian ise tam tersi.
    Risc işlemcilerde genelde bu örnekteki gibi sabit uzunlukta komutlar varken, x86 larda değişken uzunlukta komutlar var.

    Bundan sonra ne oluyor dersen işletim sistemi exe içindeki bu komutları belleğe yükler. Oradan önce L1 önbelleğe, sonra da donanıma gider. Bitler vasıtası ile veri ilgili devreye yönlendirilir ve işlem yerine getirilir. Bunlar bizi pek ilgilendirmez tabi.

    Belki başka meraklı arkadaşlar da olabilir diye bildiğim kadarıyla açıklamaya çalıştım.




  • hocam teşekkür ederim. bazı pürüzler düzeldi. bu konuları daha iyi anlamak için hangi konu üzerinde çalışmalıyım? işlemciler mi işletim sistemlerimi ya da başka bir konu mu? @elektro_gadget
  • Önce ilgi alanlarını netleştirmelisin çünkü bu konu nereye çekersen oraya gider. Bir taraftan fpga ile işlemci tasarımına, diğer taraftan derleyici dizaynı, kod optimizasyonu vs. Maalesef insan ömrü merak ettiğimiz herşeyi öğrenebileceğimiz kadar uzun değil. Bu yüzden ilgi alanını ne kadar küçültürsen o kadar rahat edersin.

    Ben yine de önce C' yi çok iyi şekilde öğrenmeni tavsiye ederim. Verimli kod yazmak istediğin zaman ister istemez bu konular da karşına çıkacak. Bilgisayar sistemini ne kadar iyi tanırsan o kadar iyi yönetirsin.
  • veriler ve kodlardan bahsettik. onu anladım. son olarak görüntü nasıl oluşuyor? tamam biz bir takım veriler elde ettik ve belleğimizde bu veriler tutuluyor. bunun ekrandaki eldesi nasıl oluyor? bellekteki verilerin aynı zamanda görüntü içinde mi karşılıkları var? ekran kartımız yokmuş varsayalım yada siz nasıl uygun görürseniz :).
  • Görüntüyü monitör oluşturuyor, işlemci değil.

    Bilgisayar donanımları zannettiğin gibi içiçe geçmemiştir. Aksine hepsi birbirinden yalıtılmış, kendi işlerini yaparlar. Birbirleriyle anlaşmak için de bir haberleşme arayüzü (elektrik sinyalleri) kullanırlar haliyle.

    Birisi bir cihaz icat eder, der ki benim cihazıma şu bilgiyi gönderdiğin zaman şu işi yapar. Yine başka birisi aynı işi yapan başka bir cihaz üretir fakat girdi sinyali farklıdır. 3. bir kişi de üretir, onunki de farklıdır. Bakarlar ki bu iş olmayacak, her cihaz için ayrı sürücü gerekiyor. Sonra bir araya gelirler ve derler ki ürettiğimiz bütün cihazlarda aynı girdi formatını kullanacağız. İşte buna "standart" deniyor.

    Monitörler de aynı şekilde standart girdi formatlarına sahip. Eskiden analog sinyalle anlaşırlardı. Sonra scart, dvi, hdmi gibi arayüzler çıktı. Bu standartları yayınlayan komiteler bunların dokümanlarını da yayınlar. Atıyorum; "xxx arayüzü ile ekranda bir piksel oluşturmak için şunları 16-bit genişliğinde bir sinyal ile sırasıyla gönder. x ve y koordinatları, kırmızı yeşil mavi opak renk değerleri, tazeleme hızı, vsync cart curt..." Bu girdileri eskiden direkt işlemci yollardı monitöre. Sonra grafik yükü artınca grafik hızlandırıcı lar (ekran kartları) çıktı ve ekranla haberleşme işini devraldılar.

    Donanımda olduğu gibi yazılımda da standartlar var. Mesela opengl, directx gibi standartlar olmasaydı oyunlar sadece önceden belirlenmiş sistemde çalışırdı çünkü ekran kartları birbiriyle uyumlu değil. Programlama dilleri olmasaydı ne kadar işlemci varsa hepsine ayrı kod yazmamız gerekecekti.

    Özetle her cihaz kendi işini yapar, birbirleriyle standart arayüzler ile haberleşirler.




  • quote:

    Orijinalden alıntı: elektro_gadget

    "xxx arayüzü ile ekranda bir piksel oluşturmak için şunları 16-bit genişliğinde bir sinyal ile sırasıyla gönder. x ve y koordinatları, kırmızı yeşil mavi opak renk değerleri, tazeleme hızı, vsync cart curt..." Bu girdileri eskiden direkt işlemci yollardı monitöre.


    tam burası işte bu nokta anlamadığım yer. bu girdileri işlemci yollardı da, bu girdiler nasıl elde ediliyor? bir kaç tane cpu simulatörü inceledim(bi tanesi pippin 10bit). sadece kodların çözümü ve belleğe yazdırmaktan bahsediliyor. cpu ya yüklenen programın çıktısı sadece bellekte tutuluyor. herhangi bir çıktı birimine gönderilme yok. kafam yine iyice karıştı :)... olayın en temel şeklini merak ediyorum. yani ilk zamanlarda veriler bir çıktı birimine gönderilirken teori tam olarak neydi?



    < Bu mesaj bu kişi tarafından değiştirildi ILoveNicola -- 20 Ekim 2014; 14:26:30 >




  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • hocam ben şöyle biliyorum şimdi monitor pixellerden meydana geliyor hani benim televizyonum 720 p , 1080 p vs diyoruz ya işte 720 pixel 1080pixel(sanırım böyleydi .d) yani pixel arttıkça görüntü kaliteside artıyor mesela basit bir konsolda A hafrini yazdırdın bu A harfi bilgisayarda bir matriste tutuluyor(ASCII) biz onu yazdırmak istediğimizde o matris çağrılıyor ve gerekli pixel ekranda yakıluyor diyelim yani o pixellerde 1 0 ile hallediliyor birde RGBA(Red, Green, Blue, Alpha) var neyse ben anlatmayayım pek bilmiyorum(ingilizcen varsa eminim bütün sorularının cevaplarını bulabilrsin bende yok .d) bir iki türkçe video vardı onları bulunca atayım :)

    Düzeltme:

    1-)https://docs.google.com/open?id=0B2uTr2HimKltMjY1ZTRhODUtNzU2My00M2IwLTllMzItYTExZDk4ZjlkOTJh

    2-)https://docs.google.com/file/d/0B2uTr2HimKlteHRucUZGWEd2VWM/edit



    < Bu mesaj bu kişi tarafından değiştirildi lavara123 -- 20 Ekim 2014; 19:01:14 >
    < Bu ileti m.bolumsonucanavari.com kullanılarak atıldı >




  • Sorduğun sorular yazılım alanının dışına çıkıyor biraz, daha çok elektronikle ilgili. Bir de sonu gelmeyecek gibi duruyor.

    Yine bildiğim kadarıyla cevap vereyim ama bütün bunları ve daha fazlasını bizzat tecrübe etmek istiyorsan biraz elektronik öğrenip küçük bir bilgisayar ya da ona benzer bişey (el oyun konsolu, tetris?) yapmanı öneririm. Bunun için mikrodenetleyici denilen çok basit yapıdaki bir işlemci kullanacaksın. İşletim sistemi yok, hazır kod yok, korumalı bellek yok. Sadece C ve assembly var elinde. Ekran sürücüsünü, grafik fonksiyonlarını, buton girişlerini vs. sıfırdan kendin yazacaksın. Belki 2 yıl sürer ama okuyarak 10 yılda öğrenemeyeceğin şeyler öğrenirsin. Neyse soruna geçelim.

    Simulatörle falan hiçbirşey anlamazsın onu geç. C' de işaretçi (pointer) var bilirsin. İşaretçinin alabileceği max değer aynı zamanda cpu nun adresleyebileceği max bellek büyüklüğüdür. Bellek dedik ama cpu sadece bellek adreslemez! Eğer bir cihaz haberleşme için cpu nun adres yoluna bağlanmış ise bunun adı "memory mapped i/o".

    Diyelimki sistem 32 bit. Bunun anlamı cpu nun adres hattı 32 bit genişliğinde demektir. Bu ise max 4gb belleği adresleyebilmek demek. Kapasite bu olsa da sistem 4gb ram e izin vermez. Çünkü bazı adresler cihazlarla haberleşme için ayrılır. Adres aralıklarını cihazlarla eşleştirmek için yapılan haritalama işine memory map deniyor. Cpu ya bağlanmış olan cihazlar devamlı adres hattını okur, eğer adres kendisine atanmış olan aralıkta ise cpu onunla haberleşmek istiyor demektir. Bu durumda veri yolundaki (data bus) bilgiyi kendisi alır.

    Birde port mapped i/o var. Eğer cihaz io portuna bağlanmış ise adresle işi yoktur. Cpu nun porta yazdığı veriyi alır hemen. Eğer aynı porta birden fazla cihaz bağlanmış ise hepsine birer port numarası tahsis edilir. Porta önce bu numara yazılır, sonra veri yazılır. Böylece verinin kime gittiği belli olur.

    Umarım biraz daha aydınlanmışsındır. Araştırma yapabilmen bazı terimler verdim, onları kullansan iyi edersin. Hadi kolay gelsin benden bu kadar.




  • elektro_gadget hocam şimdi baya bi anladım hatta merak ettiğimi söylemişsiniz en sonunda saolun. küçük bilgisayar fikri hoşuma gitti, çok teşekkür ederim. sanada teşekkürler lavara123...



    < Bu mesaj bu kişi tarafından değiştirildi ILoveNicola -- 20 Ekim 2014; 23:12:21 >
  • ILoveNicola I kullanıcısına yanıt
    Dostum bilgisayarda birim hafıza olayı byte değeridir.
    1 byte işaretsiz olarak 0->255, işaretli olarak da -128->127 arası sayıları tutabilir.

    Ancak byte içerisindeki bu değer (aritmetik hariç işaretsiz kullanılır) nerede-nasıl kullandığına göre farklı sonuçlar verebilir.
    Örneğin A000:0000 adresine 65 değerini yazarsan ekranın sol üst köşesinde A harfi görürsün. Bunu bir dosyaya nümerik (sayı) olarak yazarsan açınca 65 görürsün. Alfanümerik (karakter) olarak yazarsan yine A görürsün.

    Dediğin gibi not defteri ile açtığında içindeki byte değerleri alfanümerik olarak yorumlanır. Yani sayı değeri değil alfanümerik olarak sayının karşılığı karakter görüntülenir. Bu karşılıklar için ASCII tablosuna bakabilirsin. Burada 0-255 arası byte değerlerinin karakter (alfanümerik) karşılıkları vardır. Bazıları bildiğimiz harf-rakam-işaretlerken bazıları garip olabilir. Bir kısmının da görünür karakter karşılığı yoktur. Boş veya kutu gibi gösterilir.

    HEX editör farklıdır. Genelde iki bölümden oluşur. Sol kısımda byte değerinin hexadecimal karşılığı gösterilirken (A5 23, CF gibi) sağ kısımda ise ASCII karakter karşılığı gösterilir. Bu sağ kısım notepad ile gösterilene benzer olur.




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.