NASM x86 Part 1
Nasm Nedir?
NASM (Netwide Assembler), x86 ve x86-64 mimarileri için bir açık kaynak assembly dilidir. NASM, x86 mimarisinde yazılmış assembly kodlarını makine diline çeviren bir derleyicidir.Düşük seviyede programlama yaparak işlemci üzerinde doğrudan kontrol sağlar.
Section Nedir?
Section, bir programın veya dosyanın belirli bir işlevi yerine getiren veya belirli bir türdeki verileri saklayan bölümüdür. Her section, belirli bir amaç için kullanılır ve bu sayede programın yapısı daha düzenli ve yönetilebilir hale gelir.
Sections
- .data: Bu bölüm, programda kullanılacak sabit ve değişken verilerin tanımlandığı yerdir.Global ve statik değişkenler burada tanımlanır.
- .bss: Bu bölüm, başlangıçta değeri sıfır olan veya belirsiz olan değişkenlerin tanımlandığı yerdir.Bellek tahsisi yapar, ancak bu bölümde bellek alanı için herhangi bir değer atanmaz.
- .text: Fonksiyonlar ve işlemler burada tanımlanır.Programın yürütülebilir kodunun bulunduğu bölümdür.
Register Nedir ?
Genel amaçlı registerlar (General Purpose Registers - GPRs), işlemcinin çeşitli veri türlerini depolamak ve işlemek için kullandığı registerlardır. Bu registerlar, programın çalışması sırasında aritmetik ve mantıksal işlemler, veri transferleri gerçekleştirir.
Genel registerlar:
- EAX Aritmetik işlemler için kullanılan ana registerdır.
- EBX Veri saklamak ve adresleme için kullanılır.
- ECX Sayıcı register olarak kullanılır; döngü işlemleri için idealdir.
- EDX Genişletilmiş veriler ve I/O işlemleri için kullanılır.
- ESI Veri kaynak göstericisi olarak kullanılır.
- EDI Veri hedef göstericisi olarak kullanılır.
- ESP Yığın işaretçisi, yığın belleğin üst kısmını gösterir.
- EBP Yığın çerçevesini tutar, fonksiyonlar arası parametreleri saklamak için kullanılır.
Ekrana değişken ile yazı yazdırma örneği.
section .data bölümüne tanımlanan msg değişkenini tanımladık. mov eax, 4 komutu, write sistem çağrısını belirtir yani ekrana mesajı bastırmak için kullanılan çağrıdır.
mov ebx, 1 komutu, çıktının stdout (standart çıkış) olduğunu gösterir. 1, terminal için dosya tanımlayıcısıdır.
mov ecx, msg komutu, yazdırılacak mesajın adresini ecx registerına atar. mov edx, 13 komutu, yazdırılacak mesajın uzunluğunu belirtir.
int 0x80 syscall anlamına gelmektedir sys_write ekrana yazdırma çağrısını çağırır ve ekrana mesajı bastırır.
Registerlar Üzerinde Dört İşlem
Registerlar üzerinde toplama işlemi
Mov komutu ile eax register’a 5 değeri yüklenir.Daha sonra ecx register’a 10 değeri yüklenir.Add komutu Assembly dilinde operandlar arasında toplama işlemine karşılık gelir. Burada ise eax+ecx değeri toplanarak eax yeni değeri register a yazdırılır. Eax yeni değeri 0XF (decimal karşılığında 15) olur.
Registerlar üzerinde çıkarma işlemi
Çıkarma işleminde sub komutu kullanılır registerlara gerekli değerleri atadıktan sonra sub ile eax-ecx ile çıkarma işlemi yapılır. Bunun sonucunda eax yeni değeri (0x7) decimal karşılığı 7 olarak atamış olur.
Registerlar üzerinde çarpma işlemi
mul komutu tek bir operand ile çalışır. İlk çarpan olarak eax‘deki değeri kullanır. Komut, eax‘deki değeri, operand olarak verilen ecx‘deki değerle çarpar. Bu işlem sonucunda, eax registerının yeni değeri 25 olur (hexadecimal olarak 0x19).
Registerlar üzerinde bölme işlemi
Div komutunda, bölünen değer her zaman eax ve edx register’larında tutulur; div ecx komutu, eax’deki değeri ecx deki değere böler. Bu işlem sonucunda bölüm, eax register’ına, kalan ise edx register’ına yazılır. Yani, 16’nın 3’e bölünmesiyle eax 5 olurken, kalan 1 edx’e kaydedilir.