Assembler ve makine kodu nedir?

Kaynak kodunu okuyabilmek ve anlayabilmek, herhangi bir yazılım mühendisi için önemli bir beceridir. Kaynak kodunu okumak ve anlamak, yöneticileri işe almak için gerekli bir beceri olmasının yanı sıra, hata ayıklama becerilerinizi geliştirerek, yaygın mantıksal hatalar yapmanızı önleyerek ve gelecekteki projelerde daha temiz kod yazmanıza yardımcı olarak sizi daha iyi bir mühendis yapar.

Bu kılavuz, bilgisayar bilimi ile ilgili olarak makine kodunun karşısında makine kodunun ilkelerini, ne zaman uygulanabileceğine dair örnekleri ve onu bugün kullanmaya başlamanız için nasıl yapılır öğreticilerini kapsayan, montaj programlamanın başlangıcına odaklanacaktır. Hadi başlayalım!

Yüksek seviyeli programlama dillerinin kullanımı ve anlaşılması, düşük seviyeli programlama dillerine göre daha kolaydır çünkü daha soyut kavramlar kullanırlar. Düşük seviyeli programlama dilleri, yüksek seviyeli olanlardan daha karmaşık ve tekniktir. Derlenmiş bir programlama dili, yürütülebilir bir dosyaya dönüştürülen ve çalışma zamanında okunmak üzere bilgisayara teslim edilen bir dildir. Yorumlanan bir programlama dili, tek bir çeviri olarak okunan ve yürütülen bir dildir. Derlenmiş diller, yorumlanan dillere göre daha hızlıdır çünkü başka bir forma dönüştürülmeden doğrudan bilgisayar tarafından okunabilirler.

Assembly dili nedir?

Assembly dili veya ASM, bilgisayar donanımıyla etkileşime giren programlar yazmanıza izin veren düşük seviyeli bir programlama dilidir. İşletim sistemleri, aygıt sürücüleri, gömülü sistemler ve gerçek zamanlı sistemler dahil olmak üzere çok çeşitli uygulamalarda kullanılır. Assembly dili, bilgisayarların gerçekte anladığı makine dilinin metinsel bir temsilidir. Assembly dili, programcıların yazması ve anlaması daha kolay olan, insanlar tarafından daha okunabilir bir sürümdür. Assembly dili programlamanın düzenli olarak yapmanız gereken bir şey olmadığını unutmamak önemlidir, ancak temel bilgileri bilmek yardımcı olabilir.

Öte yandan, her mimari türü veya ISA için farklı olduğunu söylemek gerekir. Yani, x86 derleme dili ARM veya SPARC, PPC vb.’den farklı olacaktır. Bu nedenle, programlamak istediğiniz her mimari için yeni bir derleyici öğrenmeniz gerekecektir. Herhangi bir mimaride çalıştırılabilen programlar yazabilen yüksek seviyeli dillerin tam tersine, derlendikten sonra o mimari için ikili dosyayı edinmeniz yeterlidir.

Assembly dilini öğrenmenin faydaları, bir yazılım mühendisi olarak kim olduğunuza bağlıdır. Yeni başlayanlar için, Assembly dilini öğrenmek, bilgisayarların çok düşük düzeyde nasıl çalıştığını anlamanıza yardımcı olabilir. Ayrıca, kodunuzu üst düzey dillerde hata ayıklamanıza ve optimize etmenize yardımcı olabilir. Donanımın kendisinde (aygıt sürücüleri veya gömülü sistemler gibi) çalışan kod yazan, test eden veya bakımını yapan yazılım mühendisleri için, montaj dilini öğrenmek genellikle bir gerekliliktir.

Bu mühendislerden genellikle birleştiricide bir şeyler yapmaları istenir ve bunu nasıl yapacaklarını anlamaları gerekir. Assembly dilini öğrenmek bu görevler için gerekli olabilir. Yüksek seviyeli dillerde kod yazan yazılım mühendisleri için, Assembly dilini öğrenmek, kodlarında hata ayıklamalarına ve optimize etmelerine yardımcı olabilir. Assembly dilini öğrenmek, kişinin üst düzey kod ile bilgisayar donanımı arasındaki ilişkiyi anlamasına olanak tanır. Bu, yönergeleri kaynağına kadar izleyerek sorunları ayıklamanıza ve nasıl yürütüldüğünü anlayarak kodunuzu optimize etmenize yardımcı olabilir.

Assembly dili, bilgisayar donanımı ile çok düşük düzeyde etkileşime girmenizi sağlayan bir programlama dilidir. Assembly dili makineye bağlıdır, yani kodunuzu çalıştırmak istediğiniz her bilgisayar türü için farklı bir lehçe öğrenmeniz gerekir. Assembly dilleri genellikle belirli donanımlarla ilgilenen veya olabildiğince hızlı çalışması gereken programlar yazmak için kullanılır. Örneğin, belirli donanım aygıtları için aygıt sürücüleri yazmak, üst düzey dilleri makine koduna çevirmek veya paralel işlemeyi kullanarak kod bölümlerini daha hızlı olacak şekilde optimize etmek için Assembly dilini kullanabilirsiniz.

Assembly Dili Temelleri: Terminoloji ve Kavramlar

Assembly dili, bilgisayar donanımıyla etkileşime giren programlar yazmanıza izin veren düşük seviyeli bir programlama dilidir. Diğer bir deyişle, Assembly dili 1’ler ve 0’lar düzeyinde kod yazmanıza izin vermez, ancak buna oldukça yaklaşır. Assembly dili, donanıma daha yakın olduğu için “düşük seviyelidir”. C ve Python gibi üst düzey dillerden çok daha fazla makineye özgüdür. Örneğin Assembly dili ile giriş çıkış yapamazsınız. Yalnızca bilgisayarın donanımıyla etkileşime giren eylemleri gerçekleştirebilirsiniz.

Assembly dilini öğrenmeye başlarken, anlaşılması önemli olan bazı kavramlar ve terminoloji vardır. Şimdi onları gözden geçirelim.

Veri türü

Assembly’de kod yazmak için öncelikle Assembly’de bulunan veri tiplerini ve bunların yüksek seviyeli dillerdeki veri tipleriyle karşılaştırmasını anlamanız gerekir. Birleştiricide ana veri türleri sayılar ve karakterlerdir. Sayılar, tam sayıları (pozitif veya negatif tam sayılar) ve kayan noktalı sayıları (ondalıklı pozitif veya negatif sayılar) içerir. Karakterler harfler, semboller ve özel karakterlerdir. Assembler’de ayrıca, kelime uzunluğu (her sayıdaki bit sayısı) ile sayıların boyutunu kontrol edebilirsiniz. Assembly dili, 16 ve 32 bitlik kelime uzunluklarına sahiptir; bu, tamsayıların ve kayan noktalı sayıların sırasıyla 16 ve 32 bitlik bir uzunluğa sahip olduğu anlamına gelir.

Hafıza

Assembly dili, bilgisayar belleğine doğrudan erişim sağlar. Bu, bellekten veri depolayan ve alan programlar yazabileceğiniz anlamına gelir. Assembler’daki bellek konumlarına adlar denir. Bir if ifadesi veya bir değişken gibi gerçekleştirdikleri işleve göre adlandırılırlar. Adlar ve amaçları her bir derleme dili için farklıdır.

Program akışı ve dallanma

Assembly dili programının akışı, kodu “if-then” ifadelerine bölmektir. Assembly dili, kodun karar vermesine izin vermek için dalları kullanır. Bu akış ve dal ifadeleri, üst düzey dillerin if-then ifadelerinden çok daha kesindir.

Operatörler ve ifadeler

Assembly dili, matematik söz konusu olduğunda üst düzey dillerden de farklıdır. Birleştiricide, sayıların uzunluğunu açıkça belirtmeniz gerekir. Buna kelime uzunluğu denir. Ek olarak, kodunuzda toplama, çıkarma ve bölme gibi operatörleri kullanabilirsiniz. Assembly dili, ifadelerdeki sayıları ve karakterleri birleştirmenize de olanak tanır.

Bellek adresleme

Bellek adresleme, derleme dili kodunu yazarken en önemli kavramlardan biridir. Assembler’da, bellek adresleme, verileri bellekte almak veya depolamak için kullanılır. Birleştiricide iki tür adresleme kullanılır: doğrudan ve dolaylı. Doğrudan adresleme, doğrudan bir bellek konumunu ifade eder. Veri koymak veya almak istediğiniz hafıza konumu bilinmediğinde kullanılır.

Makine kodu nedir?

Makine kodu, var olan en düşük seviyeli programlama dilidir. Bunlar, bilgisayarın bir programı “yürütmek” ve “çalıştırmak” için doğrudan kullandığı 0’lar ve 1’lerdir. Çoğu “üst düzey” programlama dili – C, C++, Java, Python, JavaScript vb. gibi – insanlar tarafından okunabilecek şekilde tasarlanmıştır. Makine kodu insanlar tarafından okunamaz. Bilgisayarlar tarafından yorumlanması amaçlanmıştır. Bu nedenle bazen “bilgisayar kodu” olarak adlandırılır. Bilgisayarlar tarafından yorumlanmak istendiği için insanlara mantıklı gelecek şekilde yazılmasına gerek yoktur. Her 0 veya 1, “X bellek konumundaki sayıyı Y bellek konumundaki sayıya ekle ve toplamı Z bellek konumuna koy” gibi bir talimatı temsil eder.

Programları doğrudan makine kodunda yazabilirsiniz. Bu, tıpkı diğer programlama dillerinde olduğu gibi, her şeyi yapmak için bir program yazabileceğiniz anlamına gelir. Ancak bu programlar çok basittir çünkü yalnızca birkaç talimat kullanırlar. Makine kodunu öğrenmek, bilgisayarların daha derin bir düzeyde nasıl çalıştığını anlamanıza yardımcı olacaktır. Ayrıca diğer programlama dillerinin nasıl çalıştığını anlamanıza yardımcı olacaktır.

Bu seviyede programlamayı öğrendikten sonra, bellek adresleri ve yazmaçlar gibi kavramları anlayacaksınız. Bunlar, makine kodunu öğrenene kadar anlayamayacağınız temel dil parçalarıdır. Makine kodu yalnızca bilgisayarların nasıl çalıştığını anlamak için yararlı değildir. Ayrıca program yazmayı hızlandırır. Bir programı makine kodunda yazmak ve ardından onu yüksek seviyeli bir dile “çevirmek”, programı doğrudan yüksek seviyeli bir dile yazmaktan genellikle daha hızlıdır.

Makine kodu öğreniminin avantajları

Gördüğümüz gibi, makine kodunu öğrenmenin birçok avantajı vardır. Ancak bu avantajlardan bazıları daha ayrıntılı olarak nelerdir? En önemlilerinden bazılarına bir göz atalım.

  • Bilgisayarların nasıl çalıştığına dair daha derin bir anlayış sağlar. Makine kodunda program yazmak, bilgisayarların nasıl çalıştığının temellerini çok daha derin bir düzeyde anlamanıza yardımcı olacaktır. Bu da gelecekte yeni programlama dillerini öğrenmeyi kolaylaştıracaktır.
  • Programlama dillerinin nasıl çalıştığını daha iyi anlamanızı sağlar. Çoğu programlama dili makine koduna dayalıdır. Makine kodunun temellerini anladığınızda, diğer programlama dillerinin nasıl çalıştığını anlamak daha kolay olacaktır.
  • Bu, program yazmayı hızlandırır. Bilgisayarı çok daha derin bir seviyede anlayacağınız için hız için optimize edilmiş programlar yazmak daha kolay olacaktır. Ayrıca boyut için optimize edilmiş programlar yazabileceksiniz.
  • Bu, programlarda hata ayıklamayı kolaylaştırır. Bir bilgisayarın derinlemesine nasıl çalıştığını anladığınızda, programların neden bu şekilde çalıştığını da anlayabilirsiniz. Bu, düzgün çalışmayan programlarda hata ayıklamayı kolaylaştıracaktır.

Makine kodu ve Assembly dili arasındaki farklar

Makine kodu ile Assembly dili arasında pek çok benzerlik olsa da birçok farklılık da vardır.

Temel fark, programlama dili sözdiziminin farklı olmasıdır. Makine kodunun sözdizimi, Assembly dilinden farklıdır. Özellikle, Assembly dili anımsatıcı kodlar kullanır, bu nedenle buna “anımsatıcı” denir. Makine kodu anımsatıcı kodlar kullanmaz. Bunun yerine ikili rakamlar kullanır. Bu nedenle “ikili kod” veya “ikili dil” veya “ikili bilgisayar dili” olarak adlandırılır.

Diğer bir fark ise, Assembly dili işlemci için yazılırken makine kodu bilgisayar için yazılır. Bir işlemci için Assembly dilinde yazılabilir, ancak bir bilgisayar için sadece makine kodunda yazılabilir. Bilgisayar, işletim sistemi, merkezi işlem birimi (CPU) ve bilgisayarın içindeki diğer her şeydir.