
Herkese selamlar,
Bir önceki konumuz olan Assembly Eğitim Serisi (Sıfırdan İleri Seviye) Bölüm #2 den devam ediyoruz ve 3. Bölüme geçiyoruz. Bu bölümde hangi assembly mimarisini öğreneceğimizi ve assembly çalışma ortamını nasıl kurabiliriz bunları ele alacağız. Şimdiden iyi okumalar.

Assembly’ye Giriş: Mimari, Ortam Kurulumu ve Komut Mantığı
Bu noktaya kadar bilgisayarın en temel çalışma mantığını ele aldık.
Artık şunu biliyoruz:
Bilgisayar en dipte 0 ve 1 ile çalışır,
Assembly, bu 0 ve 1’lerin insan tarafından okunabilir hâlidir,
Programlar RAM’de durur, işlemler CPU’da yapılır.
CPU işlemleri kendi içindeki çok hızlı alanlarda (registerlarda) gerçekleştirir
Stack, programın düzenli ilerlemesini sağlar.
Şimdi bu bilgileri gerçek Assembly kodu yazmaya hazırlayacağız.
Ama önce çok önemli üç konu netleşmeli:
Hangi Assembly’i öğreneceğiz?
Neden bunu öğreneceğiz?
Nerede ve nasıl çalışacağız?

Assembly Tek Bir Şey Değildir
Çoğu kişi “Assembly” denince tek bir dil var sanır. Aslında durum öyle değildir.
Assembly, işlemcinin mimarisine göre değişir. Yani hangi işlemci için yazıyorsanız, onun anlayacağı Assembly’yi kullanırsınız.
Bunu günlük hayattan düşünelim:
Türkçe bilen birine İngilizce konuşursanız anlamaz. Aynı şekilde ARM işlemciye x86 için yazılmış Assembly verirseniz çalışmaz.
Bu yüzden Assembly öğrenirken ilk soru şudur:
Hangi işlemci mimarisi için öğreniyoruz?

Bu Eğitimde Hangi Mimaride Assembly Öğreniyoruz?
Bu eğitimde kullanılan mimari:
x86-64 (AMD64) – 64 bit Assembly
Bu mimari günümüzde:
Masaüstü bilgisayarlarda
Dizüstü bilgisayarlarda
Sunucularda
en yaygın kullanılan mimaridir.
Yani bu eğitimde öğrenilenler, doğrudan günlük hayatta kullanılan sistemlerle birebir örtüşür.

Neden x86-64 Seçildi?
x86-64 seçilmesinin birkaç net sebebi var:
Güncel sistemlerin neredeyse tamamı 64 bittir,
Reverse engineering ve malware analizinde en çok karşılaşılan mimaridir,
Debugger ve analiz araçlarının tamamı bu mimariyi çok iyi destekler,
Öğrenciyi “eski” sistemlere değil, bugüne ve ileriye hazırlar.
32 bit mimari eğitimlerde bazen tercih edilir çünkü biraz daha basittir, ama modern dünyada karşılığı azalmıştır. Bu yüzden doğrudan doğru mimariyle başlamak daha sağlıklıdır.

Assembly Yazım Biçimi (Syntax) Nedir?
Aynı Assembly komutu farklı şekillerde yazılabilir. Buna “syntax” denir.
Bu eğitimde kullanılan yazım biçimi:
NASM (Netwide Assembler) syntax
NASM tercih edilir çünkü:
Okunması daha kolaydır,
Yeni başlayanlar için daha nettir,
Linux ve Windows (WSL) ile sorunsuz çalışır,
Siber güvenlik ve tersine mühendislik tarafında çok yaygındır.
Bu eğitim boyunca tüm örnekler NASM syntax ile yazılacaktır.

Nerede Çalışacağız?
Assembly öğrenirken en önemli şeylerden biri ortamdır. Karmaşık kurulumlar motivasyonu çok hızlı düşürür.
Bu yüzden önerilen ortam:
Linux veya Windows üzerinde WSL (Linux çalıştırma ortamı)
Bu ortamlar:
Kurulumu basit
Derleme adımları net
Debug süreci anlaşılır olduğu için tercih edilir.

Kurulum
Linux kullananlar için:
Terminal açılır ve şu komutlar çalıştırılır:
Kod:
sudo apt update
sudo apt install nasm gdb
Burada:
nasm = Assembly kodunu makine koduna çevirir.
gdb = Programı adım adım incelemek için kullanılır.
Windows kullananlar için (WSL)
PowerShell yönetici olarak açılır:
Kod:
wsl --install
Burada bilgisayar yeniden başlatılır. Yeniden başlatıldıktan sonra Ubuntu terminali açılır ve:
Kod:
sudo apt update
sudo apt install nasm gdb
çalıştırılır.
Bu aşamadan sonra Linux ortamındaymış gibi devam eder.

Assembly Kodu Neden Direkt Çalışmaz?
Assembly dosyasını yazdığınızda bu dosya henüz çalıştırılabilir değildir. Çünkü CPU metin dosyasını değil, makine kodunu çalıştırır.
Bu yüzden iki adım vardır:
Assembler
Assembly kodunu alır ve makine koduna çevirir. Bu işlem sonucunda .o uzantılı bir dosya oluşur.
Linker
Bu .o dosyasını alır ve çalıştırılabilir program hâline getirir.
Yani kısaca:
Yaz - çevir - bağla - çalıştır

Şimdi kurulum testimizi yapalım. Bu örnek sadece ortamın düzgün çalıştığını görmek içindir. Henüz komutların anlamına odaklanmıyoruz.
exit.asm adında bir dosya oluşturuyoruz. IDE olarak VS Code kullanabilirsiniz. Dosyayı oluşturduktan sonra aşağıdaki kodları yazıyoruz:
Kod:
global _start
section .text
_start:
mov rax, 60
mov rdi, 0
syscall
Şimdi VS Code içinde terminali açalım. Terminalde direkt çalışma dizinimize gelecektir. Terminalde su komutları yazıyoruz:
Kod:
nasm -f elf64 exit.asm -o exit.o
Şimdi dosyayı linkliyoruz:
Kod:
ld exit.o -o exit
Şimdi dosyayı çalıştırıyoruz:
Kod:
./exit
echo $?
Eğer çıktı sonucu "0" ise ortam hazır demektir.

Assembly Komutlarının Mantığı
Assembly’de her komut tek bir küçük işi yapar. CPU karmaşık cümleler anlamaz.
CPU şu şekilde çalışır:
Komutu bellekten alır,
Komutun ne istediğini çözer,
Komutu uygular.
Bu işlem sürekli tekrar eder.
Bu yüzden Assembly programları:
kısa komutlardan,
çok sayıda adımdan oluşur.

Komutlar Neden Bu Kadar Kısa?
Çünkü CPU:
basit talimatları sever,
küçük işleri çok hızlı yapar.
Assembly’de “tek satırda her şey” yoktur.
Her şey adım adım ilerler. Bu başta garip gelir ama mantık oturduğunda çok nettir.

Komutların Temel Grupları
Assembly komutları temelde üç işi yapar:
Veri Taşıma
Bir değeri bir yerden başka bir yere götürür.
İşlem Yapma
Toplama, çıkarma, mantık işlemleri gibi.
Akış Kontrolü
Programın hangi satırdan devam edeceğini belirler.
Bir programın tamamı bu üç davranıştan oluşur.

Register Neden Bu Kadar Önemli?
CPU işlemleri RAM üzerinde yapmaz.
RAM sadece saklama alanıdır. İşlemler CPU’nun içindeki registerlarda yapılır.
Bu yüzden Assembly komutlarının büyük kısmı:
registerlara veri alır,
işlemi orada yapar,
gerekirse sonucu belleğe yazar.
Bu mantık anlaşıldığında mov gibi komutlar çok doğal gelir.

Konumuzun sonuna geldik. Bu konumuzda hangi mimari ile çalışacağımız ve neden çalışacağımız, assembly bilgisayarımıza nasıl kuracağımızı ve bazı temel kavramları öğrendik. Assembly öğrenmek her ne kadar zor görünse de aslında sanıldığı gibi zor değildir. Bunu konular ilerledikçe birlikte göreceğiz.
Bir sonraki konumuzda görüşmek üzere, herkese iyi forumlar dilerim.






