Assembly ve X86 Programlama [Temel Assembler Bilgisi]-[Önemli]http://www.csharpnedir.com/images/seviye1.jpg Makale Konusu : Temel Assembler Bilgisi Tarih : 14.02.2005 Kategorisi : Assembly ve X86 Programlama ! .NET Compact Framework, .Net Framework ün bir alt kümesidir Assembly programlama dili, kullanılan
Konu TheVikinGs tarafından açılmış, 2664 kişi tarafından görüntülenip, 9 yanıt almış.
|
Özel Yazılım Trojan+, güncellemeli ve garantili. Sadece 690TL! Kredi kartınıza 12 taksit kolaylığı!
|
|||||||
Assembly ve X86 Programlama [Temel Assembler Bilgisi]-[Önemli] konusundaki toplam yorum: 9, okunma sayısı: 2664. |
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
#1 |
|
Banned
![]() ![]() ![]() ![]() ![]() Kayıt Tarihi: Feb 2006
Üye numarası: #52117 Yer: VikinGLand
Mesaj sayısı: 3,698
Karma etkisi: 0
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Karma: 1929988
|
![]() Kaynak: Wardom http://www.wardom.com.tr/showthread.php?t=268276 Tarih : 14.02.2005 Kategorisi : Assembly ve X86 Programlama ! .NET Compact Framework, .Net Framework ün bir alt kümesidir Assembly programlama dili, kullanılan bilgisayar sisteminin yapısına ve işletim sistemi gibi platformlara sıkı-sıkıya bağımlı bir dildir. Bu yüzden biri gelirde "ben assembly dilini biliyorum" derse sakın inanmayın Çünkü çok fazla şey bilmiş oluyor.Kaynak: Wardom http://www.wardom.com.tr/showthread.php?t=268276 Assembly dili diye bir şey yok! Ama o kişi X86 PC Assembly dili, Power PC Assembly dili veya 8051 Assembly dili biliyorum deseydi o zaman iş değişirdi. X86 PC Assembly dili, Power PC Assembly dili gibi bir sınıflandırma bile tam olarak her şeyi ifade etmez. Örneğin X86 PC Assembly dili donanım platformunu tanımlar ve bu donanımı çalıştıracak işletim sistemi Windows, Linux, Solaris olabilir, her bir işletim sisteminin hafızayı ele alış şekli başka olduğundan programcılar işletim sisteminin hafıza organizasyonunu göz önüne almak mecburiyetindedirler. Ayrıca kodlarınızı derlerken kullandığınız program olan Assembler’da işe ayrı bir sınırlama koyar. Örneğin donanım X86 bir PC, işletim sistemi Windows olsun, bu durumda assembler olarak Netwide kullanırsanız farklı Turbo assembler kullanırsanız farklı talimatlarla program kodu yazmak zorunda kalırsınız ve bu kodlar adı geçen assembler programları tarafından makine koduna çevrilirler. Sonuç olarak assembly dilinin programcılık açısından en büyük dezavatajı budur. Fakat assembly’yi hızlı ve özelliklede sağlam bir dil yapan unsurlarda bu dezavantajın sonucudur. Bunca donanım ve işletim sistemi içinde acaba hangisi en çok kullanılıyor? Intel’in işlemcileri ve Microsoft’un işletim sistemleri tabi ki. İşte bizde Intel uyumlu ve Microsoft’un MSDOS ve Windows işletim sistemlerine uygun bir assembly diliüzerine makalelerimizi yazıyoruz. Yani, "Bu programa dilini zor mudur?" sorusuna, programa dilini bırak adı bile zor diyebilirsiniz. Bu yüzden assembly denildikten sonra genelde "hangi assembly?" kelimesi de konuşulur. Konuların içinde boğulup kalmamak için biz bu programlama dilinin neresindeyiz ve bundan sonra hangi rotayı izlememiz gerekiyor gibi soruları sanırım yukarıdaki paragrafta açıklamış olduk. Umarım bundan sonra makalelerimizde assembly dili kelimesini geçtiğinde neyi anlamanız gerektiğini anlamışsınızdır. Bundan sonraki makalelerde izleyeceğimiz assembly dilinin tek bir eksik yanı kaldı işte o da hangi assembler’ı kullanacağımız. Hangi ASSEMBLER? Assembler bir çeşit programdır ve assembly kodlarını makine kodlarına çevirir. ![]() Şekil 1 - Assembly dilinden Makine diline X86 uyumlu (eski tabiri ile IBM uyumlu) PC’ler için en popüler assembler’lar TASM, MASM ve NASM dır. Kaynak: Wardom http://www.wardom.com.tr/showthread.php?t=268276 ![]() Şekil 1 - Assembly dilinden Makine diline X86 ailesi için daha başka assemblerlarda mevcut fakat en çok kullanılanlar yukarıda saydıklarımızdır. MASM ve TASM .asm uzantılı bir dosyanın içindeki assembly ifadelerini ve direktiflerini okur ve bunları makine kodlarına dönüştürür. NASM ise TASM ile MASM’ın bu yaptığına ek olarak Linux ve Unix ortamlarında da çalışır. TASM ve MASM kardeş assemblerlardır. Yazım kuralları hemen hemen aynıdır. Peki hangi assemblerı seçmeli? Aslında bu yapacağınız projeye bağlı tabiki, örneğin Visual Studio IDE’si ile C++ uygulamaları geliştiriyorsanız MASM kullanmanız daha akıllıca olur, en azından MSDN’de desteği mevcut. Biz makalelerimizde hem TASM hemde MASM’ı kullanacağız. Artık Programlarımızı Assembly Dilinde Yazıyoruz! Hangi Editörü Kullanmalı? Sadece Assembly dili için geliştirilmiş Visual Studio.NET gibi çok kullanışlı IDE’ler yoktur. Eskiden edit.com (DOS zamanından kalma) programını kullanırdık ve bu program hala windows’un tüm versiyonlarında mevcuttur. ![]() Şekil 2 - Edit programını çalıştırmak için BAŞLAT/ÇALIŞTIR’dan edit.com yazıp tamama tıklayın. ![]() Şekil 3 - İşte en ilkel editörlerden EDIT. Yine Windows’un klasik programlarından notepad (not defteri) assembly dili için başka bir seçenektir. Ama dosyalarınızı ANSI olarak kaydetmeniz gerekiyor. ![]() Şekil 4 - Her derde deva Notepad ile programlarınızı ANSI olarak kaydetmeniz gerekiyor. Peki bu yazıyı yazan editörün editör seçimi nedir? Ben sizlere GVIM’i tavsiye ediyorum. GVIM hemen hemen tüm popüler assembler söz dizimini (syntax) desteklediği gibi tüm popüler programlama dillerinin de söz dizimini destekleyen süper bir editör. TASM, MASM ve GVIM’ı bu makalenin sonundaki download kısmından edebilirsiniz.Düzenleyen TheVikinGs : 18-03-2009 at 04:40. |
|
|
|
|
|
#2 |
|
Banned
![]() ![]() ![]() ![]() ![]() Kayıt Tarihi: Feb 2006
Üye numarası: #52117 Yer: VikinGLand
Mesaj sayısı: 3,698
Karma etkisi: 0
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Karma: 1929988
|
![]() Şekil 5 - Gvim ile assembly kodlarını yazmak daha kolay, programı çalıştırdıktan sanra yazma moduna geçmek için klavyeden i tuşuna basmanız gerekiyor. Editör programlarını kısaca tanıttık dan sonra artık gvim ile örnek bir assembly program yazabiliriz. Nihayet Assembly Şimdi geçen makalemizde yazdığımız programı tekrar yazacağız ama bu sefer kaynak kodlarımız .asm uzantılı bir dosyada olacak. GVIM’i çalıştırdıktan sonra klavyeden i tuşuna basıp aşağıdaki kodları yazınız yada kaynak kod dosyasını buradan download ediniz. ![]() Assembly dili yazım kuralları ile program bu şekilde yazılıyor, nasıl daha önce yazdıklarımızdan biraz farklı değil mi? Tüm bu farklılıklar sadece assembler için. Assembler bu dosyayı satır satır okuyacak ve makine koduna çevrilecek kısımları algılayıp bunları 1 ve 0’lara çevirecek. Vakit kaybetmeden bu kodları program dosyası haline getirelim. Bunun için ilk önce assembler programına sahip olmamız gerekiyor. Assembler programlarından dilediğinizi aşağıdan download ettikten sonra aşağıdaki adımları sırayla takip ediniz. |
|
|
|
|
|
#3 |
|
Banned
![]() ![]() ![]() ![]() ![]() Kayıt Tarihi: Feb 2006
Üye numarası: #52117 Yer: VikinGLand
Mesaj sayısı: 3,698
Karma etkisi: 0
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Karma: 1929988
|
MASM ile derleme işlemi
1- masm.zip dosyasının içeriğini C sürücüsüne (yada istediğiniz herhangi bir sürücüye mesela burada E:\ sürücüsü örnek olarak verilmiştir) açınız, Kaynak: Wardom http://www.wardom.com.tr/showthread.php?t=268276 2- merhaba.asm dosyasını da bu klasöre kopyalayınız, ![]() Şekil 6 - Çalışmalarınız bir klasör içinde olsun 3- ml/c dosyaadi.asm şeklinde kaynak kodunuzu assembly ediniz, 4- Bu işlemin sonunda assembler merhaba.obj adında bir obje dosyası oluşturur, 5- Program dosyası oluşturmak için .obj uzantılı dosyayı link16 merhaba.obj komutu ile link etmeniz gerekiyor. Bundan sonraki adımları enter’ı tuşlayarak geçin. ![]() Şekil 7 - MASM ile assembly ve link işlemleri 6- Programınızı dosya adını yazarak çalıştırabilirsiniz. ![]() Şekil 8 - Programı çalıştırmak için dosya adını yazıp enter tuşuna basmalısınız ![]() Düzenleyen TheVikinGs : 18-03-2009 at 04:32. |
|
|
|
|
|
#4 |
|
Banned
![]() ![]() ![]() ![]() ![]() Kayıt Tarihi: Feb 2006
Üye numarası: #52117 Yer: VikinGLand
Mesaj sayısı: 3,698
Karma etkisi: 0
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Karma: 1929988
|
TASM ile derleme işlemi
1- tasm.zip dosyasının içeriğini C sürücüsüne (yada istediğiniz herhangi bir sürücüye mesela burada E:\ sürücüsü örnek olarak verilmiştir) açınız, 2- merhaba.asm dosyasını da bu klasöre kopyalayınız, ![]() Şekil 9 - Çalışmalarınız bir klasör içinde olsun 3- tasm dosyaadi.asm şeklinde kaynak kodunuzu assembly ediniz, 4- Bu işlemin sonunda assembler merhaba.obj adında bir obje dosyası oluşturur, 5- program dosyası oluşturmak için .obj uzantılı dosyayı tlink merhaba.obj komutu ile link etmeniz gerekiyor. ![]() Şekil 10 - TASM ile assembly ve link işlemleri 6- Programınızı dosya adını yazarak çalıştırabilirsiniz. ![]() Şekil 11 - Başardık programımız çalışıyor Dikkat ederseniz her iki assemblerda aynı kaynak kodunu derledi ve sonunda .exe uzantılı bir program dosyası oluşturdu bu assemblerları değişik parametrelerle kullanıp .com türünden dosyalarda oluşturabiliriz. Aslında ben bu kaynak kodunu TASM için yazmıştım ama önceden de dediğim gibi iki assemblerın da çok fazla ortak yanı vardır fakat bu aynı oldukları anlamına gelmez ve her zamanda aynı kaynak kodunu derlemeyebilirler. Buradaki basit bir program olduğundan sorun çıkmadı ve biz uzun bir süre böyle basit programcıklar yazacağız. Bu yüzden şu anda derleme aşamasında hangi assemblerı kullandığınızın pek bir önemi yok. Kaynak: Wardom http://www.wardom.com.tr/showthread.php?t=268276 Burada download ettiğiniz assembler ve linker programları TASM ve MASM paketinin içinden alınmış dosyalardır. Daha sonra tüm paketi vereceğim şimdilik bu kadarı yeterli. Şimdi kaynak kodlarımızı bir daha gözden geçirelim ve dikkatimizi rakamların sonundaki h harfine odaklayalım. h harfi burada rakamın veya sayının hexadecimal (16lık sayı sistemi) olduğunu gösterir. Biz debug ile program yazarken bunu belirtmemiştik çünkü debug her yazılan sayıyı hex. olarak (daha doğrusu binary olarak) kabul eder. Bu makalemize sayı sistemlerine kısaca inceleyerek son vereceğiz. Kaynak kodumuzu satır satır anlatmamı bekliyor olabilirsiniz ama bu işlemci kaydedicileri ve x86 hafıza yapısını öğrenmeden bu iş biraz zor. Düzenleyen TheVikinGs : 18-03-2009 at 04:30. |
|
|
|
|
|
#5 |
|
Banned
![]() ![]() ![]() ![]() ![]() Kayıt Tarihi: Feb 2006
Üye numarası: #52117 Yer: VikinGLand
Mesaj sayısı: 3,698
Karma etkisi: 0
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Karma: 1929988
|
Bilgisayar Aritmetiği
Kaynak: Wardom http://www.wardom.com.tr/showthread.php?t=268276 Genelde programcılık derslerinin ilk ve sıkıcı konularındandır sayı sistemleri, bunu nedeni; bu sayı sistemlerinin ne için kullanıldığının tam kavranamamasından kaynaklanır. Aslında işlemci sayılardan falan anlamaz, sadece elektrik akımın var yada yok olması temeline göre çalışırlar. Hani duymuşsunuzdur pentium işlemcinin içinde bilmem kaç milyon tane transistör var diye işte elektrik akımları bu transistörler aracılığı ile kontrol edilir. Transistör yarı iletken bir elektronik devre elemanıdır ve her modern elektronik cihazın içinde bulunur. Birçok kullanım alanı olan transistörler bilgisayarlarda anahtarlama elemanı olarak kullanılırlar. ![]() Şekil 12 - 1’ler ve 0’lar anahtarın açık yada kapalı olmasını temsil ederler Elektrik akımlarının göremeyeceğimizden dolayı bizler bu tür olayları sembolize ederek anlayabiliriz. Elektrik akımının olmayışını 0 var olmasını ise 1 olarak kabul edince ortaya doğal olarak 2 tane rakamı olan bir sayı sistemi çıkar. Bizler 10 rakamlı sayı sistemini kullanıyoruz bilgisayar ise 2 rakamlı sayı sistemini. Bu yüzden bilgisayarda işleme sokacağımız her veriyi ikilik (binary) olarak göstermemiz gerekir. Binary sayı sistemi hacim olarak kağıt üzerinde veya ekranda fazla yer kaplar bu yüzden binary sayı sisteminin bir türevi olan 16’lık sayı sistemi daha çok kullanılır. Burada sayı sistemleri arasında nasıl dönüşüm yapıldığını anlatmayacağım çünkü az çok programlama ile uğraşanlar bunları zaten bilirler yada bu dönüşümleri hesap makinesi kullanarak yaparlar Yinede çok isteyen olursa anlatabilirim bunun için bu makaleye yazacağınız yorumlarda bunu belirtin.Aşağıdaki tablo 1’den 15’e kadar decimal (onluk tabandaki) sayıların hex. ve binary karşılıklarını veriyor. Rakamlara bakacak olursanız assemblerin bunları nasıl ayırt edeceği problemini anlarsınız. Bütün rakamlar benzer sembolleri kullanıyorlar bu yüzden assembly dilinde program yazarken sayı binary ise sonuna b hexadecimal ise h ve decimal ise d (yada hiçbirşey) getirilir. Aşağıdaki tabloda binary kısım 8 haneli gösterilmiştir çünkü x86 hafızası byte adreslenebilir yapıdadır yani hafızada en küçük rakamları depolamak için bile 8 hane (digit) kullanılır. Hexadecimal değerler de binary değerlerin sanki sıkıştırılmış halidir. Herhangi bir hex. değerin 1 basamağı 4 bit’e denk gelir (nibble). ![]() Tablo 2 : Rakam karşılık tablosu Kaynak kodumuzda sayılardan sonra kullanılan h harfleri sayıların hex. olduğunu assemblera bildirmek için kullanılmıştır. Ama isterseniz siz örneğin 21h sayısını 33 olarak doğrudan yada 0010 0001b olarak yazabilirsiniz. Nasıl yazarsanız yazın Assembler bu değerleri son olarak binary’ye dönüştürecektir, işte .exe ve .com gibi işlemci tarafından çalıştırılabilir program dosyalarına binary file denmesinin nedeni de budur. Aynı binary file sözcüğü diğer işletim sistemlerindeki işlemci tarafından doğrudan çalıştırılabilecek dosyalar içinde kullanılır. Hatta linux, unix gibi işletim sistemlerinde bin klasörü de içinde binary file’lar olan klasör anlamına gelir buna bazı ftp sitelerinde rastlayabilirsiniz. Assembly dilinde özellikle bir program dosyasının kodlarını incelerken debugger programlarında görebileceğiniz yegane sayılar hexadecimal olduğundan dolayı bu sayı sistemini iyi bilmeniz gerekiyor diyorum ve bu makaleyi de burada sonlandırıyorum. Bir sonraki makalede en kilit konu olan hafıza ve işlemciyi anlatacağız. O vakte kadar hoşçakalın. ![]() Tablo 3 : Download tasm.zip = Download masm.zip = Download gvim63.exe = Download Düzenleyen TheVikinGs : 18-03-2009 at 04:30. |
|
|
|
|
|
#6 |
|
Daimi Üye
![]() ![]() ![]() Kayıt Tarihi: Nov 2008
Üye numarası: #277831 Yer: Ankara
Mesaj sayısı: 660
Karma etkisi: 2416
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Karma: 241202
|
Teşşekürler.Bir sorum olacak 32 bit çevirirken veri ax'den eax'a atayacağım mesela değer double olacaktır büyük ihtimal bu komutu movsx(move with sign extention) ile nasıl yapıldığını açıklayabilirmisiniz. Kısacası korumalı kipte nasıl taşınıyor?
Saygılar... |
|
|
|
|
|
#7 | |
|
Banned
![]() ![]() ![]() ![]() ![]() Kayıt Tarihi: Feb 2006
Üye numarası: #52117 Yer: VikinGLand
Mesaj sayısı: 3,698
Karma etkisi: 0
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Karma: 1929988
|
Alıntı:
|
|
|
|
|
|
|
#8 |
|
Daimi Üye
![]() ![]() ![]() Kayıt Tarihi: Nov 2008
Üye numarası: #277831 Yer: Ankara
Mesaj sayısı: 660
Karma etkisi: 2416
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Karma: 241202
|
Teşşekürler dostum arkadaşlığa ekledim
![]() |
|
|
|
|
|
#9 | |
|
Daimi Üye
![]() ![]() ![]() Kayıt Tarihi: Aug 2005
Üye numarası: #33153
Mesaj sayısı: 584
Karma etkisi: 36
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Karma: 2931
|
Alıntı:
movsx eax,ax diye yazarsan eax registerının başına 0000 ların eklendiğini görürsün. birde işlemcilere göre değişen komut setlerinden komutlar vardır. cwd (convert word to doubleword) gibi gibi. |
|
|
|
|
|
|
#10 |
|
Daimi Üye
![]() ![]() ![]() Kayıt Tarihi: Sep 2009
Üye numarası: #369049 Yer: Underworld
Mesaj sayısı: 722
Karma etkisi: 6046
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Karma: 604322
|
sanırım bu dersi yaz okulunda vericem
arkadaş bu nasıl bir eğitim sistemidir anlamadımki nasıl bir insna aynı anda 6 tane programlama dili öğrenebilir hele bunalrdan biri assembler ken ![]() ![]() |
|
|
|
![]() |
| Şu Anda Konuyu Görüntüleyenler: 1 (0 üye ve 1 misafir) | |
| Konu Araçları | Bu Konuda Ara |
|
|
