Programcılar İçin Assembler Dili'ne Giriş

İçindekiler

assembly language

Assembly dili, bilgisayarın donanımını çalıştırmak için kullandığı komutları ortaya koyan düşük seviyeli bir programlama dilidir. Bu makalede, kod örnekleri ve açıklamalar eşliğinde programlamaya giriş niteliğinde assembly dilini inceliyoruz. "İşaretçi" veya "yığın"ın ne olduğunu ve programcı olmak için assembly dilini öğrenmeniz gerekip gerekmediğini hiç merak ettiyseniz, okumaya devam edin. Bu makale, assembly dilinin ne olduğunu, avantajlarını ve dezavantajlarını, assembly dillerinin yaygın kullanım örneklerini ve bu konu hakkında daha fazla bilgi edinmek isterseniz yararlanabileceğiniz bazı kaynakları açıklamaktadır. Hadi başlayalım!

Assembly Dili Tanımı

Assembly dili, belirli bir işlemci türüne özgü, düşük seviyeli bir programlama dilidir. Genellikle, derleyici tarafından üretilen makine kodunun sembolik bir gösterimi olan mnemonik biçiminde yazılır. Assembly dilinde, makine komutlarının opkodları mnemoniklerle, komutların veya işlenelerin adresleri ise adres sembolleri veya etiketlerle değiştirilir. Farklı cihazlarda, assembly dili farklı makine dili komut setlerine karşılık gelir ve derleme süreciyle makine komutlarına dönüştürülür. Belirli bir assembly dili ile belirli bir makine dili komut seti arasında bire bir karşılık vardır ve farklı platformlar arasında doğrudan taşınabilir değildir.

Assembly Dilinin Tarihi

Assembly dilinin tarihi, bilgisayarın ilk günlerine kadar uzanır. İlk assembly dillerinden biri, 1950'lerde IBM 701 bilgisayarı için geliştirilmiştir. Autocode olarak adlandırılan bu dil, Alick Glennie tarafından geliştirilmiş ve 701'in öncülü olan IBM 650 için kullanılan mevcut koda dayanıyordu.

Autocode'u kısa süre sonra FORTRAN Assembly Language (FAL) ve COBOL Assembly Language (CAL) dahil olmak üzere bir dizi başka assembler dili izlemiştir. Bu diller, ilgili yüksek seviyeli dillerde programlamayı kolaylaştırmak için tasarlanmış ve oldukça başarılı olmuştur.

Programlama dili

1946 yılında dünyanın ilk elektronik bilgisayarının ortaya çıkmasından bu yana, insanlar ve makineler arasındaki iletişim biçimi ve dili, yazılım mühendisleri ve bilgisayar uzmanlarının başlıca araştırma konusu haline gelmiştir. Daha verimli ve daha basit programlama dilleri, yazılım mühendislerinin yeni gözdesi haline gelmiştir. Bilgisayarların hızlı gelişimi ile birlikte, donanımların güncellenme hızı giderek artmakta ve programlama dillerine yönelik gereksinimler de giderek daha katı hale gelmektedir. Programlama dilleri son birkaç on yılda büyük bir yol kat etti ve bugüne kadar 3 nesil dil ortaya çıktı. Farklı alanlardaki programlama gereksinimlerini ve yazılım işlevlerini karşılamak için çok sayıda programlama dili değiştirilme, yenilenme ve geliştirilme sürecinden geçti ve sonunda mevcut programlama dillerinin çeşitliliğine dönüştü. Tüm programlama ortamlarına uyum sağlayabilecek evrensel bir dil bulmak için birçok girişimde bulunulmasına rağmen, hiçbiri başarılı olamadı. Programlama dili, modern teknolojiyle birlikte büyük bir sıçrama yaşamaktadır ve insanlığın bilgeliği giderek daha fazla ortaya çıkmaktadır.

programming language
programming language

1. nesil: Makine dili

Makine dili, birinci nesil programlama dilidir. Bilgisayarın icadının ilk dönemlerinde, bilgisayarın kendi görevlerini veya projelerini yerine getirmesini sağlamak amacıyla, insanlar bilgisayarı kontrol etmek için yalnızca "0" ve "1" gibi ikili sayı dizileri yazabilirdi. Bu dil, makine dilidir. Sezgisel olarak, makine dili çok belirsizdir ve anlaşılması zordur; anlamı genellikle tablolara veya kılavuzlara bakılarak anlaşılır. Kullanımı çok zahmetlidir, özellikle de tamamlanmış programı değiştirmeniz gerektiğinde. Bu tür düzensiz makine dili, sizi başlangıçta zorlayacak ve program hatalarını bulmanızı zorlaştıracaktır. Dahası, farklı bilgisayarların çalışma ortamları farklıdır ve talimatlar ile çalışma yöntemleri de farklıdır. Dolayısıyla, bu makine dilinde bir özgüllüğünüz olduğunda, onu yalnızca belirli bir bilgisayarda çalıştırabilirsiniz. Ve makineyi değiştirdiğinizde, yeniden programlamanız gerekir, bu da programın kullanım ve tanıtım verimliliğini büyük ölçüde azaltır. Bununla birlikte, makine dilinin özgüllüğü nedeniyle, belirli bir bilgisayar türüne mükemmel şekilde uyarlanmıştır, bu nedenle çalışma verimliliği diğer dillerden çok daha yüksektir.

machine language
machine language

2. nesil: Makine dili

Makine dilinin bir programlama dili olarak esneklik ve okunabilirlik açısından yetersiz olduğu açıkça görülmektedir. Makine dilinin yazılım mühendislerine yaşattığı zorlukları hafifletmek amacıyla, insanlar makine dilini geliştirip iyileştirmiştir: belirli komutların yerine anlaşılması ve ezberlenmesi kolay harfler ve kelimeler kullanılmıştır. Bu yöntem sayesinde, insanlar tamamlanmış programı okumak veya programın gerçekleştirdiği işlevi anlamak için kolaylık sağlar ve mevcut programın hata onarımı ile işletim ve bakımı daha kolay ve rahat hale gelir. Bu dil, bizim derleme dili olarak adlandırdığımız, ikinci nesil bilgisayar dilidir.

assembly language (2)
assembly language

Makine diline kıyasla, assembler dili makineye daha fazla bağımlıdır ve ezberlenmesi ve yazılması daha kolaydır; ancak aynı zamanda makine dilinin yüksek hızını ve verimliliğini de korur. Assembler dili hâlâ makine odaklı bir dildir; kodundan programın tasarım amacını anlamak zordur ve tasarlanan programın başka bir ortama aktarılması kolay değildir; bu nedenle diğer çoğu üst düzey bilgisayar dili kadar yaygın olarak kullanılmamaktadır. Bu nedenle, günümüzün son derece gelişmiş üst düzey dillerinde, genellikle en alt düzeyde, çoğunlukla program optimizasyonu veya donanım çalışması için kullanılır.

3. nesil: yüksek seviyeli dil

Programlama dili, makine dili, assembler dili vb. aşamalarından geçtikten sonra, insanlar programların yaygınlaşmasını sınırlayan temel faktörü keşfettiler: program taşınabilirliği. Bilgisayar donanımından bağımsız olarak farklı makinelerde çalışabilen bir program tasarlamak gerekiyordu. Bu sayede, programlamadaki birçok tekrarlayan işlemden kaçınılabilir ve verimlilik artırılabilir. Aynı zamanda, dil matematiksel dile veya insanların doğal diline yakın olmalıdır. 1950'lerde, bilgisayarların hala nadir olduğu dönemde, ilk yüksek seviyeli programlama dilleri ortaya çıktı. O dönemde bilgisayarların maliyeti yüksekti, ancak günlük hesaplama miktarı sınırlıydı. Bilgisayarların sınırlı hesaplama gücünü nasıl etkili bir şekilde kullanacakları, o dönemde insanların karşılaştığı bir sorun haline geldi. Aynı zamanda, kaynakların kıtlığı nedeniyle, bilgisayarların çalışma verimliliği de o dönemin mühendislerinin peşinde olduğu bir hedef haline geldi.

high level programming language
high-level programming language

Assembly Dili Kompozisyonu

Devasa bir assembler komut sistemi nedeniyle, çok sayıda komut içeren, karmaşık formatlara sahip ve ezberlenmesi zor bir komut sistemi oluşturmak gerekir. Komutun en zor kısmı, komutun desteklediği adresleme modudur ve bunun özü, komuttaki işleneni nasıl elde edileceğidir. İşlemci için bu, ihtiyaç duyduğu verileri nasıl bulacağıdır. Ancak, bilgisayarın en alt katmanındaki assembler dili için bu adresleme yöntemi çok sayıda hesaplama depolama formatını içerir ve karmaşık depolama yönetimi yöntemiyle yakından ilgilidir, bu nedenle anlaşılması zordur. Son olarak, assembler komutları bayrakları nasıl etkileyeceği ile de ilgilidir, ancak işlemci bayrakları çok karmaşıktır, bu nedenle mekanizmayı kavramak daha zordur.

komut gönder

Gönderme komutları şunlardır:

  • genel veri aktarım komutu: MOV;
  • koşullu aktarım komutu: CMOVcc;
  • yığın işlem komutu: PUSH, PUSHA, PUSHAD, POP, POPA, POPAD;
  • değişim komutu: XCHG, XLAT, BSWAP;
  • adres veya segment tanımlayıcı seçici aktarım komutu: LEA, LDS, LES, LFS, LGS, LSS, vb.

mantık işlemi

Talimatların bu bölümü, aşağıdakiler dahil olmak üzere aritmetik ve mantıksal işlemleri gerçekleştirmek için kullanılır:

  • toplama komutu: ADD, ADC;
  • çıkarma komutu: SUB, SBB;
  • bir artı komutu: INC;
  • ondalık ayarlama komutları: AAA, AAS, DAA, DAS;
  • bir eksi komutu: DEC;
  • karşılaştırma işlemi komutu: CMP;
  • işaret genişletme komutları: CBW, CWDE, CDQE;
  • çarpma komutu: MUL, IMUL;
  • bölme komutu: DIV, IDIV;
  • mantıksal işlem komutları: AND, NOT, OR, XOR, TEST.

değiştirme komutu

Bu komutun bu kısmı, bir kayıt veya bellek işleneni belirtilen sayıda kaydırmak için kullanılır.

  • mantıksal sola kaydırma komutu: SHL;
  • mantıksal sağ kaydırma komutu: SHR;
  • aritmetik sola kaydırma komutu: SAL;
  • aritmetik sağ kaydırma komutu: SAR;
  • döngüsel sola kaydırma komutu: ROL ;
  • dairesel sağ kaydırma komutu: ROR, vb.

bit işleme

Talimatların bu bölümü şunları içerir:

  • bit testi komutu: BT;
  • bit testi ve ayarlama komutu: BTS;
  • bit testi ve sıfırlama komutu: BTR;
  • bit testi ve ters çevirme komutu: BTC;
  • bit ileri tarama komutu: BSF;
  • bit geriye tarama komutu: BSR.

kontrol devri

Bu bölüm şunları içerir:

  • koşulsuz aktarım komutu: JMP;
  • koşullu aktarım komutu: JCC, JCXZ;
  • döngü komutu: LOOP, LOOPE, LOOPNE;
  • prosedür çağrı komutu: CALL;
  • alt prosedür dönüş komutu: RET;
  • kesme komutu: INTn, INT3, INTO, IRET vb.

Dize işleme

Talimatların bu bölümü, veri dizisini işlemek için kullanılır; buna şunlar dahildir:

  • dize aktarım komutu: MOVS;
  • dizi karşılaştırma komutu: CMPS;
  • dize tarama komutu: SCANS;
  • dize kaydetme komutu: STOS;
  • dize yükleme komutu: LODS.

Giriş Çıkış

Talimatların bu bölümü, IN/INS bağlantı noktası giriş talimatları ve OUT/OUTS bağlantı noktası çıkış talimatları dahil olmak üzere, çevresel aygıtlarla veri alışverişi yapmak için kullanılır.

Assembly Dili Örneği

İşte iki sayıyı toplayan basit bir assembler dili programı:

				
					; add.asm
;
; This program adds two numbers together
;

section .data

; These are the two numbers we will be adding
; We must store them in memory so the CPU can access them

num1: dw 1234
num2: dw 5678

section .text

; This is the code section of the program
; The code is a set of instructions for the CPU to execute

global _start

_start:

; Load the two numbers into registers
mov eax, [num1]
mov ebx, [num2]

; Add the numbers together
add eax, ebx

; Store the result in the num1 memory location
mov [num1], eax

; Exit the program
mov eax, 1
int 0x80
				
			

Assembly Dilinin Özellikleri

1. Makineye bağımlılık

Bu, genellikle belirli bir bilgisayar veya bilgisayar ailesi için tasarlanmış, düşük seviyeli, makine odaklı bir dildir. Makine komutlarının sembolik bir temsilidir; bu nedenle farklı makineler farklı assembler dillerine sahiptir.

2. Yüksek hız ve yüksek verimlilik

Assembly dili, makine dilinin avantajlarını korur ve doğrudanlık ve basitlik özelliklerine sahiptir. Bilgisayarın diskleri, bellek, CPU, I/O portları vb. gibi çeşitli donanım aygıtlarına etkili bir şekilde erişebilir ve bunları kontrol edebilir; daha az bellek kaplar ve hızlı yürütme hızına sahiptir. Verimli bir programlama dilidir.

3. Yazma ve hata ayıklamanın karmaşıklığı

Donanım doğrudan kontrol edildiğinden ve basit görevler bile çok sayıda assembler dili deyimi gerektirdiğinden, program tasarımı sırasında tüm yönlerin ele alınması gerekir. Olası tüm sorunlar göz önünde bulundurulmalı ve çeşitli yazılım ve donanım kaynakları makul bir şekilde tahsis edilip kullanılmalıdır. Bu şekilde, programcı üzerindeki yük kaçınılmaz olarak artacaktır. Aynı şekilde, bir programı hata ayıklarken, programın çalışmasında bir sorun olduğunda, bunu bulmak zordur.

Avantajlar

Makine dilinin üzerinde yer alan ikinci nesil bir programlama dili olarak, assembler dilinin de birçok avantajı vardır:

  1. Bellek durumunu ve donanım G/Ç arabirim durumunu kolayca okuyabilir.
  2. Derleme aşamaları çok daha az olduğu için yazılan kod doğru bir şekilde çalıştırılabilir.
  3. Düşük seviyeli bir dil olarak, oldukça genişletilebilir.

Dezavantajlar

  1. Kod çok tekdüze olduğu ve özel komut karakterlerinin sayısı az olduğu için, kodun uzun ve yazılması zor hale geliyor.
  2. Assembly, verileri depolamak için yine de belleği çağırması gerektiğinden, hataların oluşması kolaydır ve hata ayıklama kolay değildir.
  3. Bir program tamamlansa bile, daha sonra bakımını yapmak çok zaman alacaktır.
  4. Makinenin kendine özgü yapısı nedeniyle, kod uyumluluğunun zayıf olması gibi bir sorun ortaya çıkar.

Assembly Dili ve Makine Dili

Assembly dili ile makine dili arasındaki temel fark, assembly dilinin makine koduna çevrilmesi için ayrı bir assembler gerektiren düşük seviyeli bir programlama dili olması, makine dilinin ise altta yatan makine kodunun doğrudan bir temsili olmasıdır.

Assembly dili, makine diline göre insanlar tarafından daha kolay okunabilir, ancak yine de okunması ve yazılması oldukça zordur. Yerel makine koduna yakın olacak şekilde tasarlanmıştır, bu da programcının kodun ne yaptığını anlamasını kolaylaştırır. Ancak bu, kodun makinenin belirli mimarisine sıkı sıkıya bağlı olması nedeniyle taşınabilir kod yazmayı da zorlaştırır.

Öte yandan, makine dili, makine için yerel koddur ve insanlar tarafından okunamaz. İşlemci tarafından doğrudan yürütülür ve bu nedenle assembler dilinden daha verimlidir. Ancak, programcının altta yatan makine kodu komutlarıyla uğraşması gerektiğinden, bu dilde programlama yapmak çok daha zordur.

Assembly Dili Öğrenmek İçin Kaynaklar

Assembly dili hakkında daha fazla bilgi edinmek istiyorsanız, kullanabileceğiniz pek çok farklı kaynak bulunmaktadır. Amazon’da ve yerel kitapçılarda assembly diliyle ilgili kitaplar bulabilirsiniz. Ayrıca Coursera, edX ve Udemy gibi web sitelerinde çevrimiçi kurslar da bulabilirsiniz. Bilgisayar mimarisi hakkında daha fazla bilgi edinmek istiyorsanız, bu konuyla ilgili pek çok kitap da mevcuttur. Bu kaynaklar, assembly dilinin ne olduğunu ve bilgisayar donanımı ile yazılım tasarımına etkilerini anlamanıza yardımcı olabilir.

Abone ol

Aylık blog güncellemeleri, teknoloji haberleri ve vaka analizleri almak için abone listemize katılın. Asla spam göndermeyeceğiz ve istediğiniz zaman aboneliğinizi iptal edebilirsiniz.

Scroll to Top

Instant Quote