Assembly dili



Assembly dili, düşük seviyeli bir programlama dili olup, bilgisayarın donanım mimarisine özgü talimatları doğrudan içerir. Bir bilgisayarın işlemcisi tarafından doğrudan anlaşılabilecek olan makine diline çok yakındır. Assembly dili, genellikle sistem düzeyindeki programlama, sürücülerin geliştirilmesi, gömülü sistemler ve performans gerektiren uygulamalar için kullanılır. Bu dil, yüksek seviyeli dillerde bulunan abstraksiyonların çoğundan yoksun olduğundan, programcının donanım üzerinde daha fazla kontrol sahibi olmasını sağlar ancak bu, aynı zamanda daha fazla dikkat ve uzmanlık gerektirir.


Assembly dilinin temel özellikleri şunlardır:


Yakın Donanım Erişimi: Bilgisayarın CPU'su ve belleği gibi donanım bileşenlerine doğrudan erişim sağlar.

Düşük Seviye Kontrol: Bellek yönetimi ve işlemci talimatları üzerinde doğrudan kontrol imkanı sunar.

Performans: Yüksek seviye dillerden daha hızlı çalışan programlar oluşturabilir.

Portabilite Eksikliği: Yazılan kod genellikle belirli bir işlemci mimarisine özgü olduğu için, farklı sistemler arasında taşınabilirliği sınırlıdır.

Karmaşıklık ve Zorluk: Anlaşılması ve kullanılması daha zor olabilir çünkü donanımın ayrıntılı bilgisini gerektirir.

Assembly dilinde yazılmış bir program, genellikle bir assembler tarafından makine diline çevrilir. Bu süreçte, insan tarafından okunabilir assembly kodu, CPU'nun anlayabileceği makine koduna dönüştürülür. Assembly, özellikle eski zamanlarda, kaynakların kısıtlı olduğu durumlarda veya


çok spesifik donanım işlemleri için tercih edilirdi. Günümüzde ise genellikle sistem programlaması, donanım sürücüleri, gerçek zamanlı uygulamalar ve yüksek performans gerektiren bilgisayar oyunları gibi alanlarda kullanılmaktadır.


Assembly dili öğrenmek, programcıya bilgisayarın nasıl çalıştığına dair derin bir anlayış kazandırır ve daha verimli programlama teknikleri geliştirmesine yardımcı olur. Ancak, bu dilin karmaşıklığı ve öğrenme eğrisi nedeniyle, genellikle belirli ihtiyaçları olan deneyimli programcılar tarafından tercih edilir.


Assembly diliyle çalışmanın temelini, işlemci mimarisine ve makine talimatlarına aşina olmak oluşturur. Her işlemci mimarisi, kendine özgü bir set komutları (instruction set) içerir. Bu komutlar, genellikle oldukça düşük seviyeli ve basit işlemlerdir, örneğin bir hafıza konumundan diğerine veri taşımak, aritmetik işlemler yapmak veya mantıksal işlemler gerçekleştirmek. Assembly dili, bu talimatları insan tarafından okunabilir bir biçimde ifade eder.


Assembly dilinin temel kavramları şunlardır:


Registerlar: CPU'nun içinde hızlı erişim için kullanılan küçük hafıza alanlarıdır. Bu registerlar, veri depolama, adres gösterme veya aritmetik işlemler için kullanılır.


Opcode (Operation Code): Her bir assembly talimatının işlemciye ne yapması gerektiğini belirten bir koddur. Örneğin, MOV, ADD, SUB gibi.


Operandlar: Opcode'ların üzerinde işlem yapacağı verilerdir. Bunlar doğrudan sayılar (literals), hafıza adresleri veya registerlar olabilir.


Sembolik Adresleme: Programcının hafıza adreslerini isimlendirmesine izin verir, böylece kod daha okunabilir ve yönetilebilir hale gelir.


Assembly Direktifleri: Assembler'a yönergeler sağlar. Bunlar, kodun nasıl derleneceğini veya monte edileceğini kontrol eden komutlardır.


Makro Komutlar: Birden çok assembly talimatını tek bir komut olarak gruplamaya olanak tanır, böylece kod tekrarı azaltılır ve okunabilirlik artar.


Assembly dilinin kullanımı günümüzde daha sınırlı olsa da, bazı durumlarda hala vazgeçilmezdir. Örneğin, donanım seviyesinde hata ayıklama, reverse engineering, sistem güvenliği ve optimizasyon gibi alanlarda oldukça önemlidir. Ayrıca, yüksek seviye programlama dillerinin altında yatan temelleri anlamak için de değerlidir. Yüksek seviye dillerin sağladığı abstraksiyonların altındaki donanım işlemlerini kavramak, bir programcının daha derin teknik bilgi ve beceri kazanmasını sağlar.



Örnek bir assembly kodu ve satır satır açıklaması


Assembly kodunun örnek bir parçasını ve her bir satırın açıklamasını aşağıda bulabilirsiniz. Bu örnek, x86 mimarisini temel alır ve basit bir toplama işlemi gerçekleştirir. x86 mimarisi, Intel ve AMD tarafından üretilen işlemcilerde yaygın olarak kullanılan bir mimaridir.


section .data       ; Veri bölümü başlangıcı

num1    db  5       ; num1 adında bir bayt (byte) tanımla ve değerini 5 yap

num2    db  3       ; num2 adında bir bayt tanımla ve değerini 3 yap


section .text       ; Kod bölümü başlangıcı

global _start       ; _start etiketini global yap, yani programın başlangıç noktası


_start:             ; Programın başladığı yer

    mov al, [num1]  ; num1'in değerini al baytında sakla

    add al, [num2]  ; al baytındaki değeri num2'nin değeri ile topla

    mov [num1], al  ; Sonucu num1'in adresine geri yaz


    ; Programı sonlandır (Linux sistemlerde)

    mov eax, 1      ; Sistemi sonlandırma çağrısının kodu

    mov ebx, 0      ; Çıkış kodu olarak 0 (başarılı sonlandırma)

    int 0x80        ; Kesme (interrupt) çağrısını yaparak sistemi sonlandır

Her bir satırın açıklaması:


section .data: Veri bölümünün başlangıcını belirtir. Burada sabit değerler ve değişkenler tanımlanır.


num1 db 5: num1 adında bir bayt boyutunda değişken tanımlar ve değerini 5 olarak ayarlar.


num2 db 3: num2 adında başka bir bayt boyutunda değişken tanımlar ve değerini 3 olarak ayarlar.


section .text: Kod bölümünün başlangıcını işaret eder. Burada programın asıl işlevsel kodları bulunur.


global _start: _start etiketini global yapar. Bu, programın çalıştırılacağı başlangıç noktasını belirtir.


_start:: Programın çalışmaya başladığı yer. Bu etiket kodun geri kalanını takip eder.


mov al, [num1]: num1de saklı olan değeri al registerına kopyalar.


add al, [num2]: al registerındaki değere num2deki değeri ekler.


mov [num1], al: Sonuç olarak elde ed


ilen değeri num1in saklandığı yere geri yazar. Bu, al registerındaki değeri num1 değişkeninin hafıza adresine kopyalar.


mov eax, 1: Bu ve sonraki iki satır, Linux işletim sistemi üzerinde programın düzgün bir şekilde sonlandırılması için gerekli işlemleri yapar. Burada eax registerına 1 değeri atanır, bu da sistem çağrısının (system call) çıkış (exit) fonksiyonunu temsil eder.


mov ebx, 0: Çıkış kodu olarak 0 değeri ebx registerına atanır. 0 genellikle başarılı bir çıkışı gösterir.


int 0x80: Bu satır bir kesme (interrupt) çağrısını tetikler. Bu kesme, eaxde tanımlanan sistem çağrısını (bu durumda programın sonlandırılması) işletim sistemine bildirir.


Bu örnek, Assembly diliyle yazılmış oldukça basit bir programın nasıl çalıştığını gösterir. Assembly dilinde, işlemler genellikle çok düşük seviyede ve doğrudan donanımla ilgili olarak gerçekleştirilir. Bu sebeple, Assembly dili öğrenmek ve kullanmak, yüksek seviye programlama dillerine kıyasla daha karmaşık ve detay odaklıdır. Yüksek seviye diller genelde bu tür düşük seviye işlemleri gizler ve programcıya daha soyut bir çalışma ortamı sunar. Bununla birlikte, Assembly dilinde programlama yapmak, bilgisayarın nasıl çalıştığına dair derin bir anlayış kazandırır ve performans kritik uygulamalarda çok detaylı optimizasyonlar yapma imkanı sunar.

Hiç yorum yok

Rastgele İçerik

DonanımHaber

© tüm hakları saklıdır
made with by templateszoo