Assembly ile program yazma

03:22 , ,

Assembly?


Assembly dili işlemcilerin instruction setlerinde yer alan komutları  ve registerları kullandıklarından dolayı donanım bağımlı bir dildir. Intel işlemciler için yazılan bir assembly programının ARM işlemcilerde çalışma şansı yoktur. Bu nedenle PC'lerde en çok kullanılan işlemci olan [şimdilik] x86 mimarisine üzerinden yazılar yazılacaktır. Aşağıda görüldüğü gibi ilk başlarda donanımlar ile iş yapan sistemler tasarlamış ve programlama dediğimiz iş hardware seviyesinde olmuştur. Ardından donanımlarda çalışabilecek makina kodlar üzerinden programlama işlemi gerçekleştirilmiş ardından 1 0' larla işlem yapmak yerine bunları etiketleyip assembly dili oluşturulmuş ve bu dil üzerinden insanların anlayacağı seviyeye ilk adım olan assembly dili ile programlama yapılmıştır. Ardından hardware'dan daha uzak ama insanın anlayabileceği High-Level diller ile programlama yapılmaya başlanmıştır.


Biz 1 0'larla program yazmanın bir üstü olan Assembly ile kod yazarak donanıma yanı bilgisayar mimarisine biraz daha yaklaşacağız. Böylece bilgisayar dünyasının arkasında duran o muazzam mimariyi daha iyi anlamış olacağız.

Neden NASM?

NASM hem Windows hem Linux tarafında olan bir assembler'dır. Bu sebeple her iki sistemde de rahatca çalışabilmek için nasm tercih edilmektedir. Her assembler'ın kendine özgü bir dili olduğu için kullanacağımız assembler'a özgü farklılıklar yaşanmaktadır. Fakat bir assembly dilini iyi öğrenmemiz diğer mimariye veya ortama geçip orada assembly yazmada da kolaylıklar sağlayacaktır. Kısacası bir assembler'da yazmayı ve bir işlemci mimarisini iyi öğrenin gerisi daha kolay olacaktır.

Yazılar ne şekilde olacak?


Daha çok how-to şeklinde yazmayı düşünüyorum. Her yazı içinde yazılan kod içinde öğrenilmesi gereken bilgileri açık bir şekilde anlatmaya çalışacağım.

Ön Hazırlık olarak nelerin kurulması gerekir?


Linux ve Windows ta NASM programının kurulması gerekmektedir.
Linux: sudo apt-get install nasm, Windows: exe dosya indirilip kurulum yapılmalı.)

Derleme işlemini nasm tarafında yapıldıktan sonra link işlemini linux'te gcc'ye veya ld linkerına havale edilebilir. Ya da doğrudan object dosyayı başka bir program içinde kütüphane şeklinde kullanabiliriz. Windows tarafında ise nasm ve Microsoft C/C++ linkerının kurulu olması gerekmektedir.

Derleme ile ilgili ipuçları?

32 - 64 bit cross platform derleme yapabilmek için linux için : apt-get install gcc-multilib

Ardından X.asm uzantılı dosyayı içine derlemek için:


  • nasm -f elf32 X.asm -o main.o "derlediğimiz object dosyayı linux'ta kullanacaksak"
  • nasm -f coff main.asm -o main.obj "derlediğimiz object dosyayı windows'ta kullanacaksak"

direktifleriyle oluşturabiliriz.

Ardından linux'te linker ile aşağıdaki gibi elf uzantılı çalıştırılabilir dosya oluşturulur.

  • ld -m elf_i386 --entry=main -o x.elf x.o