FaTaL Yönetici
Ruh Hali : Mesaj Sayısı : 626 Rep Puanı : 12268 Teşekkür Aldı : 18 Kayıt tarihi : 24/10/09 Nerden : Kocaeli İş/Hobiler : 3D / Maya / After Efect Lakap : Fatal
| Konu: Assembly Dili Ve Mikroişlemciler -2 Cuma Ekim 30, 2009 9:16 am | |
| Debug ile mutluluğun resmi
Eski DOStumuz Debug’ın on parmağında on marifet var. Assembler, Disassembler, debugger, hexadecimal editör olmasının yanında şimdi de farklı bir kullanımı ile tanışacağız. Debug’ı sanat icra etmekde kullanacağız.
Esasında yaptığımız işin hexadecimal editör kullanımından hiçbir farkı yok. Debug ile Assembly dilini kullanarak .COM uzantılı dosyalar yapacağımızdan, bu tarz bir alıştırmanın kolay anlaşılır olacağı inancındayım. Aynı zamanda bir dosya biçeminin nasıl oluştuğu konusundaki soru işaretlerini silecek şekilde .BMP formatı üzerinde işlem yapacağız.
Öncelikle bitmap formatı üzerinde biraz beyin jimnastiği yapmak gerekli. Bitmap biçemi yada formatı, bildiğimiz MS Windows’un arka plan resimlerinin sahip olduğu formattır. ".bmp " veya "."dib" uzantılı olabilirler. MSDN (Microsoft Devolopers Network)’in içindeki Visual C++ programcıları için BMP biçemi hakkında bir açıklama mevcut. Bunun biz Assembly kullanıcıları için tercümesi ise şu şekilde.
Öncelikle gösterdiğim her x bir Bayt’ı (sekizli) temsil ediyor. Debug’a ise verileri, HexaDecimal yani 16’lık tabanda gireceğiz.
BİTMAP DOSYA BAŞLIĞI (BITMAP FILE HEADER)
|xx| Dosya tipini tanımlar. BM olmalı
|xxxx| Dosya boyutunu tanımlar
|xx| Rezerve
|xx| Rezerve
|xxxx| Resmin başlangıç Offset adresi
BİTMAP BİLGİ BAŞLIĞI (BITMAP INFO HEADER)
|xxxx| info header uzunluğu
|xxxx| Genişlik
|xxxx| Yükseklik
|xx| Düzlem adeti : 1 olmalı
|xx| Resimin kaç bit olduğunu belli eder.
|xxxx| Sıkıştırma
|xxxx| Sıkıştırılmış ise resmin boyutu
|xxxx| Metre Başına Xdeki piksel miktarı (DPI Çözünürlük)
|xxxx| Metre Başına Ydeki piksel miktarı (DPI Çözünürlük)
|xxxx| Renk indexi kullanıldı mı?
|xxxx| Önemli renkler
Şimdide kağıt kalem alıp BMP dosyamızı oluşturalım: İlk iki bayt, Bitmap’i temsil eden BM karakterleri olmalı yani onaltılık tabanda ;
0x42 0x4D
Dosya boyutunu en son yazmamız mantıklı olacak. Şimdilik onlar için 0x00 (NULL) koymakta faide var.
0x00 0x00
4 bayt ayrılmış, rezerve edilmiş veri var. Yani BMP dosya biçeminin ilerideki versiyonlarında bir işleve sahip olabilir ama şimdilik değil.
0x00 0x00
Şimdi resim verisinin hangi adresten başlıyacağını girelim. İpucu : Yukarıdaki tüm x leri sayarsak 54 yapar bunun onaltılık tabanda karşılığı 36’dır.
0x36 0x00 0x00 0x00
Bitmap Info Header uzunluğu için ise Bitmap Bilgi Başlığındaki x’leri saymalıyız. 40 adet yani 0x28.
0x28 0x00 0x00 0x00
Resmin pixel olarak genişliği 16 pixel.
0x10 0x00 0x00 0x00
Resmin pixel olarak yüksekliği 16 pixel.
0x10 0x00 0x00 0x00
Resim, kaç adet düzlem içeriyor. Veri 1 olmalı.
0x01 0x00
Resim kaç bit? 24 bitlik bir resim oluşturacağız. RGB formatında.
0x18 0x00
Resim herhangi bir sıkıştırma işlemine tabi olmayacağı için sıkıştırma verilerini 0 girebiliriz.
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Resmin X eksenindeki çözünürlüğü 72 DPI (Inch), metre için 2834 nokta: onaltılık B12.
0x12 0x0B 0x00 0x00
Resmin Y eksenindeki çözünürlüğü.
0x12 0x0B 0x00 0x00
Renk indeksi ve önemli renk kullanmayacağımız için bunlar da 0 olmalı.
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
24 bit RGB resimler
Eğer bir yağlı boya resim yapıyorsanız, ana renklerin karışımından oluşan bir çok renk kullanıyorsunuzdur. Sarı ile kırmızıyı karıştırdığınıza kavun içi elde edersiniz. Sarı ile maviyi karıştırdığınız da ise yeşil’i elde edersiniz. Fizikte ise resimde kullanılandan farklı üç adet ana renk bulunur; Kırmızı-Mavi-Yeşil. Bu ana renklerin kullanıldığı kodlamaya ise RGB kodlama denir. (RGB : ingilizce Red-Green-Blue (Kırmızı-Mavi-Yeşil) kelimelerinin baş harfleridir.) CRT (Cathode Ray Tubes), katod ışınlı tüpler, başka bir değişle bilgisayar monitörleri, TV monitörleri bu mantık ile çalışır. Şimdi her ana rengin yalnızca 1 ara değer aldığı bir renk tuvali yapalım. Örneğin karanlık bir odada 3 adet lambamız var. Bunlardan biri kırmızı ışık veriyor, diğeri yeşil, ötekisi ise mavi. Kırmızıyı söndürüp diğerlerini yaktığımızda ortamda hakim olan renk.; cyan dediğimiz açık maviye benzer bir renkdir. Maviyi söndürüp diğerlerini yaktığımızda ise oluşacak renk ; magenta dediğimiz pembeye yakın bir renkdir. Bu şekilde 23 = 8 adet farklı renk tanımlayabiliriz. Hepsini yaktığımızda ise ortamda beyaz renk hakim olacaktır. Kımızı ışığı bir lamba ile ifade ettik, lamba açık veya kapalı olabilir. Yani 1 veya 0’lık bir önerme. Kısacası 1 bit ile göstemiş olduk. Toplamda ise 3 bit bir kodlama yapmış olduk. Lambaların açık veya kapalı oldukları durumlar şöyle olabilir; 000-001-010-011-100-101-110-111 Bu şekilde 8 farklı renk oluşturabiliriz. Peki her ana renk için 8 lambamız olduğunu varsayalım yani toplamda 24 lamba, 28 = 256 adet farklı kırmızı renk olabilir manasına gelir. 256x256x256 = 28 = 16.7 milyon renk üretmiş oluruz. işte 24 bit kodlama bu demektir. Web programcılığı ile uğraşmış olanlar bilirler orada renkleri ifade etmek için böyle bir kodlama kullanılır. Mesela beyaz renk "#FFFFFF"dir. FF onaltılık değeri 255 değerine karşılık gelir. "#FFFFFF"in manası 24 lambanın da açık olması demektir. Bu da beyaz rengi oluşturur. Resim matrisi
Şimdi yapacağımız resim için bir resim matrisi oluşturacağız. Ama BMP formatında bu resimi kullandığımızda yani dosyaya yazarken baş-aşağı bir şekilde yazmak zorundayız.
Dosya boyutu hesaplama
Genelde resim matrisi .BMP dosyasına aktarılırken her satırın sonuna belli miktarda NULL yani onaltılık 0x00 konulur. Bunu formülleştirirsek; resim genişliğinin Mod 4’ü kadardır. Yani 16 pixel resim genişliği olan bir resimin satırlarının sonuna hiçbir NULL ifadesi konulmazken, 17 pixel olunca 1 adet NULL, 19 pixelde ise 3 adet NULL koyulur. isterseniz Photoshop benzeri bir programla yaptığınız resimleri, bir hexadecimal editör yardımıyla inceleyebilirsiniz. Dosya sonuna ise veri girişinin bittiğini göstermek için 2 adet NULL koyulur. O zaman dosya boyutumuz 54 + (16 * 3 * 16) + 2 = 824 bayt kadar olur. Debug kullanımı
Debug’ı başlatmak için MS-DOS Komut istemini açıp debug yazıyoruz
Şimdi oluşturacağımız dosyanın adını giriyoruz. n (NAME) komutundan sonra yeni dosyanın adını giriyoruz
3. adım olarak RAM’in 0000h offsetine dosyamızın içeriğini girmeye başlıyalım. Her girdiğimiz onaltılık adresten sonra space tuşuna basıp bir sonraki karaktere geçebiliriz. İşlemi bitirmek için ise enter tuşuna basmak yeterli olacaktır. BMP dosyasını ilk bayttan itibaren giriyoruz. İlk bayttan B (0x42) daha sonraki M(0x4D).. ve böyle devam etmekte.e (ENTER) yazıp daha sonra da yazılacak hafıza adresini girmeliyiz.
"B" harfini girip space tuşuna basıyoruz
Tüm bilgi üst başlıklarını girip, daha sonra da resim matrisini ters olarak giriyoruz. Buradaki mavi renk için kullandığımız onaltılık değer "0080C0". Gri renk için ise "CCCCCC" dir.
Daha önce hesapladığımız gibi bütün üst bilgi başlıklarını girdik ve imleç 36h adresine kadar geldi. Şimdi devam edip resim matrisini ters olarak girmeliyiz. sol alt köşeden başlayıp sağ üst köşeden bitireceğiz. RGB formatındaki renkleri ise ters girmeliyiz yani BGR şeklinde. Bu takdirde Gri renk "CCCCCC", mavi renk ise "C08000" olmalıdır. Ilk satır için girilen veriler;
Tüm verileri girdikten sonra mikroişlemcinin cx registerine 338 yazmamız gerekir. Bu dosya boyutunun onaltılık karşılığıdır.
Şimdi dosyamızı sıfırıncı offsetten itibaren yazdırıp debugdan çıkabiliriz
Alıntıdır. | |
|