C#nedir?com
 
YAZAR HAKKINDA
Eren Erener
Eren Erener
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
12 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: assembler assembly binary bundan burada dosyasi isletim kaynak makine program programlama sistemi sisteminin uzantili width=%100 X86 Assembly Eren Erener
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : X86 Assembly
Yayınlanma Tarihi : 14.2.2005
Okunma Sayısı : 55900
Yorum Sayısı : 14     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
XML - Deniz Kılınç
emre TAŞ
yazının devamı >
emre TAŞ
Decompiling and Reverse Engineering .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Masaüstü mü ? İnternet Mi? .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
.Net Kavramları - .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Yeni Başlayanlar için - .Net Radyo
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer 'in Blogu
ChatBot UI Sample 22.10.2017
Turhal Temizer 'in Blogu
C# – IRR Function 22.10.2017
Burak Selim Şenyurt
Asp.Net Core'da Bir WebSocket Macerası 22.10.2017
Burak Selim Şenyurt
.NET Core 2.0 ile Basit Bir Web API Geliştirmek 22.10.2017
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Temel Assembler Bilgisi
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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.

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.

Assembler
Tam Adı
Üretici
TASM
Turbo Assembler
Borland
MASM Microsoft Macro Assembler Microsoft
NASM Netwide Assembler LGPL
Tablo 1 : En Popüler Assemblerler 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.


Ş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.

TITLE Merhaba Assembly (merhaba.asm)
;########################################
;# Bu program ekranda Merhaba Assembly yazısını gösterir  #
;# Son Güncelleme: 14/02/05                                        #
;# Yazan --> Eren ERENER                                            #
;########################################

            .MODEL     SMALL
            .STACK     32
            .DATA

               Dizi      DB     "Merhaba Assembly",0Ah,0Dh,24h

            .CODE

             ANA       PROC

             MOV      AX, @DATA         ;Data segment
             MOV      DS, AX               ;ayarlanıyor.

             MOV      CX, 0Ah              ;Sayaç=10.
ONDEFA: MOV      AH, 9                  ;Ekrana,
             MOV      DX, OFFSET Dizi   ;string,
             INT       21h                    ;yazdırılıyor.
             LOOP     ONDEFA              ;Bu işlem 10 defa tekrarlanacak.

             MOV      AH,4CH               ;DOS’a
             INT       21H                    ;dönüş

             ANA       ENDP

                         END  ANA
 
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 buradan download ettikten sonra aşağıdaki adımları sırayla takip ediniz.

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,
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 :)

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.

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.

Bilgisayar Aritmetiği

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).

Decimal
Binary
Hexadecimal
0 0000 0000 00
1 0000 0001 01
2 0000 0010 02
3 0000 0011 03
4 0000 0100 04
5 0000 0101 05
6 0000 0110 06
7 0000 0111 07
8 0000 1000 08
9 0000 1001 09
10 0000 1010 0A
11 0000 1011 0B
12 0000 1100 0C
13 0000 1101 0D
14 0000 1110 0E
15 0000 1111 0F
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.

Dosya Adı
Açıklama
Dosya
tasm.zip
Assembler ve Linker
Download
masm.zip Assembler ve Linker Download
gvim63.exe Editör Link
Tablo 3 : Download

Makale:
Temel Assembler Bilgisi Assembly ve X86 Programlama Eren Erener
  • Yazılan Yorumlar
  • Yorum Yaz
EYL
27
2012
bu merhaba.asm programı benim win64 bit sisteminde çalışmıyor. çalışması için ne yapmak lazım?
EKİ
22
2006
makale harika olmuş. eğer masm32 ve MAsmEd i kullanarak asm derleme hakkında makaleniz varsa paylaşırsanız sevinirim.
OCA
28
2006
a86 assembler sadece bir assembler, yani bizim anlattığımız konularla ancak derleme düzeyinde ilişkisi var. Bu assemblerı yazan Eric Isaacson ile 2 yıl kada önce bu assemblerin full versiyonunu okulumuza bedava verebilirmisin diye sormuştum ve olumsuz yanıt almıştım. Kendisinin dediğine göre masm ve tasm dan daha optimal kod üretiyormuş, ama ayrıntılı bir şekilde demene fırsatım olmadı. Çok çok da iyi olsa ancak makine koduna çevirme sürecinde performans sağlar.
OCA
8
2006
Makaleleriniz çok güzel ve öğretici olmuş ancak ben A86 assembler ile ilgili bir yazı göremedim. Eğer sizin için zahmet olmazsa bu assembler hakkında da bilgi verebilir misiniz? Elinize sağlık. Teşekkürler
ARA
23
2005
Sana nekedar teşekkür etsem azdır valla..... allah razı olsun......
ARA
15
2005
Helal olsun valla. Bir makale ancak bu kadar acik,net ve eglenceli yazilabilir.
ARA
4
2005
Ustam öncelikle emeğine ve bileğine sağlık. Bu dili öğrenmek istiyorum ve hiç bir programlama dili bilmiyorum. siz neler tavsiye edersiniz. hangi kitap vs.. gibi. maille bildirirsen sevinirim. şimdiden teşekkür ederim. Allah ne muradın varsa versin :) bkysys@hotmail.com
EYL
3
2005
eren harbi diom asm derslerin güzel olmuş ellerine sağlık dostum
AĞU
26
2005
asemmly benim hayatımı değiştirdi. yeni bir dünyanın kapısı araladım.birler ve sıfır okadar hoş dizilmişki adeta lirik bir şiir. vurgu ton hiç bişe gerekmiyor. birler ve sıfırlar şimdi bir aşkı anlar gibi.makina dili benim ana dilim değil ama yabancı dil olarak öğrenmek istiyorum b
MAR
31
2005
Merhaba eren bey makalelerinizi büyük bir dikkatle takip ediyorum.Anlaşılır bir şekilde bizi aydınlattığınız için teşekkür ederim.başarılarınızın devamını dilerim.
ŞUB
23
2005
Hocam teşekkür ederiz.Gerçekten elinize sağlık.Her şey üniversitede öğreniliyor ama programlama sanatını dışarda öğrenen insanlar için bu anlattığınız bilgiler üniversitede kalıyor.Ama sizin gibi mütevazi ve bilgi paylaşımına değer veren insanlar sayesinde bizlerde bu akademilerde kalan bilgileri öğrenmiş oluyoruz.Tekrar teşekkür ederiz başarı ve mutluluklar dileriz
ŞUB
14
2005
Neyin nasıl çalıştığını bilmek açısından her programcının aslında bilmesi gereken konular bunlar. Çoğu zaman üniversite sıralarında öğreneileceğimiz bu değerli bilgileri buradan bizimle paylaştığınız için teşekkür ederim. Assembly dilini merak edip te bir türlü öğrenemeyen kişiler için çok güzel bir yazı dizisi sunuyorsunuz. Elinize ve klavyenize sağlık.
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor