Mustafa Kemal Üniversitesi Bilgisayar Mühendisliği Bölümü Ders Materyal Ve Notları

Sponsor

13 Mart 2013 Çarşamba

Assembly Nedir?

Posted by samgar at 20:21 0 Comments


Makinanın anlayabildiği tek dil 0 1 dir. makina dili çok hızlıdır. çünkü yapılan tek işlem hex i bin e çevirmek. Assembly ise biraz daha insancıl olsun :) kafayı yicez abi deyip te makina dilinde yazılmış bir dildir. Fakat Assembly ile Makina dili arasındaki ilişki diğer diller ile makina dili arasındaki ilişkiden farklıdır. örneğin: "cmp al" nin karşılığı "3c" dir. diğer dillerde dilin türüne göre interpreter(yorumlayıcı) veya compiler(derleyici) hatta bazılarında her ikiside kullanılıyor olmasına karşılık makina diliyle "01h" nasıl "00001b" ediyorsa "cmp al" da Assemblyde "3c" eder. buda asseblynin önemsenmeyecek kadar kadar azbir hız farkıyla çalışmasını sağlar.

Makina Dili
a. Makina Dili 00001011 11010111 11010110 ………………….. İkili Sistem
b. Makina Dili DF AC 12 1B 3C C8 D6 7B C8…………………. Onaltılı Sistem
c. Mnemonic(Assembly Dili)
MOV AX,65
ADD BX,AX
.
.
.
Assembly Dili’nin Makina Dili ile ilişkisi bu şekildedir. Yukarıda yazılı kodlar sadece görsel bir fikir verebilmek için yazılmıştır. Çalışır program parçaları değildir.
Assembly’yi Neden Hâlâ Kullanmalıyız?
Üst düzey programlama dillerinde yazdığımız programlar platform’a bağlı (Windows, Linux, Unix vs.) çalışırlar. Biz eğer hızlı yazılım geliştirip hedefimiz bu işten para kazanmaksa üst düzey diller bu iş için idealdir. Ne zaman ki biz bu platformlardan uzaklaşalım kendimize özgü birşeylerimiz olsun dersek o zaman bu üst düzey diller bizim bu ihtiyacımıza cevap veremiyecektir. İşte bu nokta bizi yalnız bırakmayan dillerden biri C diğeride Assembly’dir. C dili Assembly diline göre insana daha yakındır. İyi de madem öyle C takılalım neden ısrarla Assembly?
C dilinde olmayan bir özelliği C diline kazandırmak istiyorsanız Assembly Dilinden faydalanırsınız. Eğer Assembly bilmiyorsanız C dilinin size sağlayacağı bir çok avantajdan mahrum kalırsınız. Eğer ikisinide bilmiyorsanız bağımsız program yazamazsınız. İşte bu iki dili diğerlerinden ayıran en belirgin fark budur.
Bu yüzden biz Assembly’yi hâlâ kullanmalıyız.
Nedir Bu Hacker, Cracker Muhabbeti?
Dikkatinizi çekmiştir etrafımızda mantar gibi ben hackerim diyen tipler dolaşmaya başladı. Bu konuyu uzatmadan kısaca geçmek istiyorum. Harbi Assembly ve C programcılarının kasıp yazdığı disassembler editörleri vb. ni internetten indirip kullanarak program kırıpda ben crackerim diye ortada dolaşanlar hiç kusuru bakmasınlar oturup kendiniz yazmadığınız sürece hiçbişeysiniz. Dallanma komutlarınının NOT’ını almakla da bu işler olmuyor. Bilmem ne trojanını kullanayım, x wormunu mail atayım fake mail göndereyim vs. ile de hacker olunmuyor. Ben 15 yıl oldu bilgisayarla tanışalı ve kaynaşalı 11 yaşımdı (1991) programcı belgemi aldığımda fakat hacker de değilim cracker da. Şu güzelim terimleri ağızlara sakız yapmayın.(Bu işin ciddiyetinin farkına varın).
Register Nedir?
Kelime anlamı olarak alırsak karşımıza Kayıtedici kelimesi çıkar. Bu kelime bu iş için gerçekten çok idealdir. Kayıt ederler. Tabi ki kafalarına göre değil. Cpu programının ve bizim programımızın istediği şeyleri kayıt eder. Daha önce 1 bitlik verinin hafızada nasıl tutulduğundan bahsetmiştik, bkz.(flip-flop konusu).
Register Çeşitleri Nelerdir?
Genel Amaçlı Registerler;
AX : A(Accumulator)X :
En genel amaçlı registerdir. Ortada ne kadar angarya iş varsa bu regiter’e kaydederiz. Eskiler bu register’e baş merkep adını takmıştır. Asıl iş bu register üzerinde döner. Diğerleri AX’e işini yapmasında yardımcı olur.
BX: B(Base)X:
Taban alınacak adresler bu registerde saklanır. Buraya koyacağınız bir taban adres üzerine koyacağınız sayıkadar sonrasındaki (veya öncesindeki) bilgiyi al derken işte bu registerde tuttuğumuz taban değerden faydalanırız.
CX: C(Counter)X:
Sayaç registeridir. Sayma işlemleri için özelleştirilmiştir. BX te bahsettiğim olay farklı yöntemlerlede yapılabilirken CX ten yardım alınması daha makbuldür.
DX: D(Data)X: 
AX in taşıyamayacığı yüklerde yardımcı olan registerdir. Elinizde 1.5 byte’lık veri varsa AX 1 byte’tan fazlasını kaldıramıyorsa 0.5 byte’ını da DX’e yükler bir seferde taşırsınız.(siz yüklemiyorsunuz kendisi yüklüyor)
SI: SI(Source Index):
DI: DI(Destination Index):

Büyük verilerin bir bellek adresinden (Source), başka bir bellek adresine (destination) taşınmasında kullanılan indexli adresleme metodunda source index’in tutulduğu registerdir. DI’i de siz tahmin edin:).
BP: BP(Base Pointer):
Base adres üzerindeki belli bir noktayı işaret etmek için kullanılan registerdir.
SP: SP(Stack Pointer):Yığıt üzerindeki belli bir noktayı işaret etmek için kullanılan registerdir.
Segmet Registerleri;
CS: (Code Segment):Program kodlarının bulunduğu adresi tutan registerdir.
DS: (Data Segment):
Program verilerinin bulunduğu adresi tutan registerdir.
SS: (Stack Segment):
Yığıtın bulunduğu adresi tutan registerdir.
ES: (Extra Segment):
Adı üzerinde.
FS: Bilmiyorum.
GS: Bilmiyorum.
Program Durum ve Kontrol Registeri;
FLAGS: (Bayrak):
Program çalışma esnasında oluşan çeşitli durumlara göre flags registerinin bitleri 0 veya 1 halini alırlar işte bu 0 ve 1 durumlarının tutulduğu register flags registeridir.
Yönerge İşaretçisi;
IP: IP(Instruction Pointer):Program hiyerarşisinin varlığını sağlar. Cpu programı işlerken IP registerinin gösterdiği noktadan başlar, ve sürekli IP registerinin yeni göstereceği değerleri takip eder. Bu sayede hiyerarşi bozulmamış olur. program bir dallanma komutu ile karşılaştığında IP registerine dallanılacak adres yazılır Cpu programı işlemeye IP registerine bakarak o noktadan itibaren devam eder.
Data Types: (Veri Tipleri):
Tüm programlama dillerinde olduğu gibi Assembly dilinde de veriler belli kalıplar içerisine sıkıştırılmış olmalıdır. Çünkü bellek her zaman kısıtlıdır tutulacak verilerin yerleşimi ve yeniden geri çağrılması işleminde veri depolanacak alanın verimli ve standart kullanımı bize anlaşılabilir kodlama ve en önemliside hız kazandıracaktır.
Bit: En küçük Hafıza Birimi: örnek: 1, 0 başka örneği yok. Sadece 1 yada 0.
Byte: 8 Biti yanyana koy 1 Byte eder: örnek: 10100101, 01001010.
Word: 2 Byte’ı yanyana koy 1 Word eder: örnek:yukarıdaki ikisi tek.
DWord:2 Word 1 Double Word eder.
QWord:2 Dword 1 QuadWord eder.
DQWord:2 QWord 1 DQWord eder.
Bu veri tiplerinden küçük olanlar büyük olanlara otomatik dönüştürülebilirler. Fakat büyük tiplerden küçük tiplere dönüşüm yapılmaya çalıştığında hata oluşur. bir kaba alabileceğinden fazla su koyduğunuzda taşması gibi. Üst düzey programlama dillerinde bu taşma overflow hatası ile bildirilir. Assembly dilinde ise bu tür taşmaları programcı flags registerinden faydalanarak yönetebilir.
Flags Registerine ileriki konularda ayrıntılı olarak değinilecektir.
Yukarıda anlatılanlan konular mümkün olduğunca basite indirgenmiştir. Bu yazılardaki amacım insanların sürekli Assembly ile program yazılırmı olum kafayı yersin diyerek toplumu programlamanın sadece formlar üzerine 2 tane component sürükleyip bırakmak olduğuna inandırılmaya çalışılıyor olmasıdır. Bu çabaların doğal sonucu olarak etrafımızda windowsu bilgisayar zanneden veya algoritma bilmeden program yazabileceğini düşünenleri görmek kaçınılmazdır. Bu gün .Net platform bağımsızlığını vaad etmektedir. Linux için geliştirilmekte olan Mono projesi (www.mono-project.com) umut vericidir. Bu proje oturduğunda hiçbir şey eskisi gibi olmayacaktır. (Örn: Ben bir oop ‘ı .Net ortamında hazırlayıp Mono ile Linux için derleyebileceğim veya tam tersi.) Bu durumda işveren client makinalarınıda Linux yapabilecek. 

Bu Yayını Paylaş

Takipçi Ol

Mail adresinizi kaydedelim ilk sizin haberiniz olsun.

0 yorum:

Sponsor

Yazılarım Korunuyor

Yandex Metrica

Yandex.Metrica

Toplam Sayfa Görüntüleme Sayısı

back to top