Çevirme dili ya da assembly dili (İngilizce: assembly language), bir bilgisayarda tüm işlemleri işlemci gerçekleştirir ve işlemcinin de, makine dili denen kendine has bir dili vardır. İşlemci yalnızca bu dili anlar ve bu dili kullanarak anlaşırsınız. Fakat bu dili öğrenmek ve kullanmak çok zordur. Bu nedenle insanların anlayabileceğimiz bir dilde konuşup ardından işlemcinin diline çeviren yazılımlar geliştirilmiştir. Bunlara derleyici denir. Derleyiciler de bir dile sahiptir fakat işlemcinin diline göre çok daha kolaydır. İşte bu derleyici dillerinden biri de Assembly'dir. Çevirici dil, bilgisayar programlarının yazılmasında kullanılan alt seviyeli bir dildir. Assembly dili programlarının yazılımında insan dostu sembollerin (İngilizce “İngilizce: mnemonics”) kullanılması, daha fazla hataya yatkın ve zaman alıcı ilk bilgisayarlarda kullanılmış olan bir hedef bilgisayarının sayısal makine kodunda doğrudan programlama çalışmasının yerine geçmiştir. Bir assembly dil programı çevirici (“İngilizce: assembler”) olarak adlandırılan faydalı bir program tarafından hedef bilgisayarın makine koduna çevrilir. (Bir çevirici bir derleyiciden (İngilizce: compiler) farklıdır ve genellikle “İngilizce: mnemonic” ifadelerden makine komutlarına teke tek (izomorfik) çeviriler yapar.)
Assembly dili karmaşık programlar yazmak için kullanılan düşük seviyeli bir programlama dilidir. Assembly insanlar tarafından anlaşılması zor olan makine dilinin sayısal ifadelerini, insanlar tarafından anlaşılarak programlanması daha kolay olan alfabetik ifadelerle değiştirerek düşük seviyede programlama için bir ortam oluşturur. Assembly kullanmanın amacı, ilk bilgisayarlarda yazılan programların daha az hata içermesi ve daha az zaman almasını sağlamaktır.
Assembly dilini makine koduna çeviren programlara assembler denir. Bir assembler'ı derleyiciden ayıran en önemli özellik birebir dönüşüm yapmasıdır. Derleyiciler kodun tamamını okurlar ve kodun tamamını anlamlı bir programa dönüştürürler. Kodun her satırını tek tek okuyan ve uygulayan programlara ise yorumlayıcı denir.
Assembly dil programları, genellikle platformdan bağımsız olan yüksek seviyeli programlama dillerinin aksine bir hedef bilgisayar mimarisine sıkı sıkıya bağlıdır (ve bu bilgisayara özeldir). Çok fazla sofistike olan çeviriciler programın gelişmesini kolaylaştırmak, çeviri işlemini kontrol etmek ve hataların düzeltilmesine yardımcı olmak amacıyla mekanizmalar kullanarak program komutlarının temel çevirisini genişletir.
Assembly dili bir zamanlar programlamada çok fazla kullanılmaktaydı, ancak günümüzde daha az kullanılma eğilimindedir, öncelikle doğrudan donanım manipülasyonunun veya anormal performans hususları söz konusu olduğu zaman bu dil kullanılmaktadır. Tipik uygulamaları cihaz sürücüleri, alt seviyeli dahili (embedded) sistemleri ve gerçek zaman uygulamalarıdır.
Assembly(çeviri) ve assembler (çevirici) terimlerinin çelişkili kullanımlarına ilişkin olarak aşağıdaki terminoloji bölümüne bakınız.
Temel kavramlar
Çevirici (assembler)
Tipik olarak bir modern çevirici assembly (çeviri) komut “mnemonic”leri işlem kodlarına çevirerek (tercüme ederek) ve hafıza mahalleri (memory locations) ve diğer varlıklar için sembolik isimler belirleyerek “object code” unu oluşturur. Sembolik referansların kullanılması, program modifikasyonlarından sonra bıktırıcı hesaplamaları ve elle yapılan adres güncelleştirmelerini kaydettiğinden çeviricilerin en önemli (kilit) özelliğidir. Çeviricilerin çoğu metinsel ikameyi (yerine koymayı) yerine getirmek için – örneğin, bir alt rutin (subroutine) yerine “inline” olarak çalışacak komutların ortak kısa serilerini üretmek için- makro imkânları da içerirler.
Çeviriciler genellikle yüksek seviyeli dilleri yazma konusunda derleyicilerden (compilers) daha basittir ve 1950’li yıllardan beri kullanılmaktadır. (Bilgisayarların ilk günlerindeki ilk çeviriciler yorgun programcıların bir jenerasyonu için önemli bir keşifti.) Modern çeviriciler, bilhassa MIPS, Sun SPARC ve HP PA-RISC gibi RISC’e dayalı mimariler CPU “pipeline” verimliliğini sağlamaya yönelik komutu (instruction) optimize ederler.
Daha sofistike (karmaşık) olan Yüksek Seviyeli çeviriciler aşağıda belirtilenler gibi dil özetlerini (abstractions) sağlarlar:
- Yüksek kontrol yapıları
- Yüksek seviyeli prosedür fonksiyon deklarasyonları ve talepleri
- Yapılar/kayıtlar, birlikler, sınıflar ve takımlar dahil yüksek seviyeli özet veri türleri
- Sofistike makro işleme
Daha fazla bilgi için aşağıdaki Dil tasarımına bakınız.
Normal profesyonel kullanımda çevirici teriminin sıklıkla farklı anlamlarda kullanıldığına dikkatinizi çekeriz; sıklıkla çevirici yararından ziyade bir çeviri dilinin kendisine atfen kullanılır. Böylece “ASM-H çok kullanılan bir S/370 çevirici olmuştur” ifadesine karşı “CP/CMS S/360 çeviricide yazılmıştır” ifadesi kullanılır.
Assembly (çevirme) dili
Assembly dilinde yazılan bir program pek çok yerine getirilebilir komutlara (emirlere) tekabül eden komut “mnemonic”lerin (sembollerin) bir serisinden oluşur; bir çevirici tarafından tercüme edildiğinde bunlar hafızaya yüklenebilir ve yerine getirebilirler.
Örneğin; bir x86/IA-32 işlemci makine dilinde ifade edilmiş olan aşağıdaki ikili (binary) komutu yerine getirebilir:
- Binary (ikili) : 10110000 01100001 (Altı haneli ondalık: 0xb061)
Muadil assembly dilinin sunumu daha kolay hatırlanır (daha fazla “mnemonic” tir):
- Mov al. 061h
Bu komut şunu ifade eder:
- 61 (97 ondalık) altı haneli değeri “al” adı verilen işlemci kaydedicisinin içine naklediniz
“mov” sembolü (mnemonic) bir işlem kodu olup, “move” (taşı) sözcüğünü kısaltmak için komut set tasarımcısı tarafından seçilmiştir. Virgülle ayrılmış argümanların veya parametrelerin bir listesi işlem kodunu izler; bu tipik bir assembly dil ifadesidir.
Assembly dilinin makine diline dönüştürülmesi bir çevirici tarafından gerçekleştirilir ve bunun tersi olan işlem bir demonte edici (disassembler) tarafından yapılır. Yüksek seviyeli dillerin aksine basit assembly ifadeleri ile makine dili komutları arasında genellikle 1-10-1 ilişki bulunur. Ancak, bazı hallerde bir çevirici ortak ihtiyaç duyulan işlevselliği sağlayacak olan çeşitli makine dili komutlarına yayılan pseudoinstructions (yapma emirler) sağlayabilir. Örneğin, bir “büyük veya eşit ise dallandır” emrine sahip olmayan bir makine için bir çevirici makinenin “eğer küçük ise kur” (set if less than) ve “eğer sıfır ise dallandır (kurulan emrin neticesinde)” ifadelerine kadar uzanan bir “yapma emri” bir çevirici verebilir. Tam yetenekli çeviricilerin pek çoğu ayrıca daha karmaşık kod ve veri dizisini üretmek amacıyla satıcılar ve programcılar tarafından kullanılan zengin bir makro dili (aşağıda tartışılmıştır) de sağlarlar.
Her bilgisayar mimarisi kendine özgü makine diline sahiptir ve dolayısıyla kendisine ait bir çevirme dili vardır. Bilgisayarlar destekledikleri işlemlerin sayısına ve tipine göre birbirlerinden farklıdırlar. Bilgisayarlar aynı zamanda farklı ebat ve sayıda kayıt ünitelerine ve hafızada veri tiplerinin farklı örneklerine sahip olabilirler. Pek çok genel amaçlı bilgisayarlar esas itibarıyla aynı işlevselliği sürdürürlerken, bu işlevlerin yapılış tarzı farklıdır; benzer çevirme dilleri bu farklılıkları yansıtır.
“Mnemonics” (sembollerin) veya assembly dil sentakslarının çoklu takımları tek bir emir (komut) takımı için hazır olabilir, tipik olarak farklı çevirici programlarında. Bu gibi durumlarda en popüler olan genellikle üretici tarafından temin edilen ve dokümantasyonunda kullanılandır.
Makine dili
Makine dili münferit ifadelerden (statements) veya komutlardan (instructions) tesis edilir. İşlem mimarisine bağlı olarak, verilen bir komut (emir)
- aritmetik, adresleme veya kontrol fonksiyonları için belli kayıt yerlerini (registers)
- belli hafıza yerlerini veya ofsetleri
- İşlem faktörlerini (operands) yorumlamak için kullanılan belli adresleme şekillerini
belirleyebilir.
Daha karmaşık işlemler, sırasıyla yerine getirilen (bir von Neumann makinesinde) veya başka bir şekilde kontrol akış komutlarıyla yönlendirilen bu basit komutların birleştirilmesiyle oluşturulur.
Pek çok komut grubunda yer alan bazı işlemler:
•taşıma
. bir sabit değere bir kayıt yerini ayarlayınız (CPU’nun kendisinde geçici bir “scratchpad” (bir bilgisayar sisteminde geçici sonuçları tutmak için kullanılan bir bellek) yeri)
. verileri bir bellek yerinden bir kayıt yerine veya kayıt yerinden bir bellek yerine taşıyınız. Bu işlem daha sonra bir hesaplama yapmak veya hesaplama sonucunun saklamak için verilerin temin edilmesi amacıyla yapılır.
. donanım cihazlarından verileri okuyunuz ve yazınız.
•hesaplama
. sonuçları bir kayıt yerine yerleştirerek iki kayıt yerinin değerlerini toplayınız, çıkarınız, çarpınız veya bölünüz.
. bir çift kayıt yerindeki (pair of registers) ilgili bit’lerin birleşimini/ayrımını (ve/veya) alarak veya bir kayıt yerinde (register) her bir bit’i eksilterek bit’e yönelik işlemleri yapınız.
. Kayıt yerlerindeki iki değeri karşılaştırınız (örneğin, birinin diğerinden az olup olmadığını veya ikisinin de birbirlerine eşit olup olmadıklarını anlamak için)
•Program akışının etkilenmesi
. programda başka bir yere atlayınız ve orada komutları yerine getiriniz.
. belli bir koşulun oluşması halinde başka bir yere atlayınız.
. başka bir yere atlayınız, ancak (bir çağrıya) dönüş noktası olarak bir sonraki komutun yerini saklayınız.
Bazı bilgisayarlar içerdikleri komut grubunda karmaşık (complex) komutlara sahiptirler. Tek bir “complex” komut diğer bilgisayarlarda pek çok komutları alabileceği bir şeyi yapar. Bu tür komutlar çoklu adımlar atan, çoklu fonksiyonel birimleri kontrol eden veya başka bir şekilde belli bir işlemci tarafından uygulanan basit talimatların tümünden daha hacimli görünen komutlar olarak sınıflandırılırlar. “Complex” (Karmaşık) komutların bazı örnekleri aşağıda verilmiştir:
- Bir defada “stack” (bir uçtan erişilebilir birbirini takip eden bellek yerlerinin bir bloğu) üzerinde pek çok kayıt yerlerini (registers) saklayan
- Geniş bellek bloklarını taşıyan
- Karmaşık (complex) ve/veya kayan nokta (floating point) aritmetiği (sinüs, kosinüs, karekök, vs.)
- Bir atomik test et ve kur (test-and-set) komutunu yerine getiren
- ALU’yu bir “register” (kayıt yeri) yerine bellekten gelen bir “operand” (işlem faktörü) ile birleştiren komutlar.
Son zamanlarda özellikle çok popüler hale gelen bir kompleks (karmaşık) komut türü SIMD işlemi veya aynı zamanda çoklu veri parçaları üzerinde aynı aritmetik işlemi yapan bir işlem olan vektör komutudur. SIMD komutları çoğunlukla ses, görüntü ve video işleminde bulunan algoritmaların kolayca paralelizasyonunu sağlar. MNX, 3DNow ve AltiVec gibi ticari markalarda muhtelif SIMD uygulamaları piyasaya sunulmuştur.
Komut takımlarının (grubu) tasarımı karmaşık bir husustur. Basit bir komut takımı küçültülmüş işlemci büyüklüğü ve düşük enerji tüketimiyle birlikte yüksek hızlar için potansiyel oluşturabilir; daha karmaşık olan genel işlemleri optimize edebilir, bellek/kaşe verimliliğini artırabilir veya programlamayı basitleştirebilir. Bu farklılık genellikle CISC’ye (Complex Instruction set Computer) (Kompleks Komut Grubu Bilgisayarı) karşı RISC (Reduced Instruction Set Computer) (Küçültülmüş Komut Grubu Bilgisayarı) açısından tartışılır, ancak bu bir aşırı basitleştirmedir. (Örneğin, RISC kavramı bir mikro programlanan mimariye açık – assembly dil programlanmasında direkt yoldan ziyade derleyici teknoloji tarafından işletilmeyi amaçlayan- olarak düşünülebilir. Programlama kolaylığı ve pek çok optimizasyon meseleleri tartışılacak bir konuyu teşkil eder). İlgili yorumlar için komut grubuna (instruction set) bakınız.
Dil tasarımı
Assembly dilindeki komutlar (emirler) yüksek seviyeli bir dilin aksine genellikle oldukça basittirler. Her bir komut tipik olarak bir işlem kodundan (veya, sadece, komut) artı sıfır veya daha fazla “operand” lardan (işlem faktörlerinden) ibarettir. Komutların pek çoğu tek bir değere veya değer çiftine atıfta bulunurlar. Dilde kodlanan bir komut genellikle doğrudan yerine getirilebilir makine dili komutuna tekabül eder.
Pek çok assembly dillerinde ortak olarak bulunan diğer elemanlar arasında aşağıdakiler yer alır:
- Veri tarifleri. İlave direktifler programcının makine dil komutlarıyla referans için saklama (depolama) alanlarını ayırmasını sağlarlar. Depolama tipik olarak gerçek sayılar, diziler ve diğer primitif veri tipleriyle başlatılabilir.
- Etiketler. Veri tariflere programcı tarafından belirlenen isimler (etiketler veya semboller) ve tipik olarak referans sabiteleri, değişkenler veya yapı elemanları kullanılmak suretiyle referanslandırılırlar. Etiketler aynı zamanda kod yerlerine de tahsis edilebilirler, örneğin alt rutin giriş noktaları veya GOTO destinasyonları gibi. Çeviricilerin pek çoğu programcıların farklı isim yerlerini yönetmesine, veri yapıları içinde ofsetleri otomatik olarak hesaplamalarına ve gerçek değerlere veya çevirici tarafından gerçekleştirilen basit hesaplamaların sonucuna atıfta bulunan etiketleri belirlemesine imkân veren esnek sembol yönetimini sağlarlar.
- Yorumlar. Pek çok bilgisayar dilleri gibi çevirici tarafından göz ardı edilen yorumlar assembly kaynak koduna eklenebilirler.
- Makrolar. Pek çok çevirici bir takım argümanlara dayalı kod veya veri üreten dahili (embedded) bir makro dile sahiptirler. Makrolar tekrar kaçınmak amacıyla programcı tarafından kodlanabilir, örneğin ortak bir veri yapısının oluşturulması. Makrolar belli bir işlemi kapsayacak şekilde bir satıcı veya üretici tarafından da temin edilirler. Örneğin:
- 8-bit işlemcililer, iki ardışık “byte” içinde saklanan 16-bit’lik bir miktarı artıran veya azaltan bir makronun kullanılması yaygındır – normal olarak örneğin 6502 gibi üç veya dört komutu gerektirecek olan ortak bir operasyon.
- I/O operasyonları veya alt seviyeli çalışan sistem talepleri gibi Standard sistem ara yüzlerin kullanılması için Üreticiler makrolar temin ederler. IBM ana gövdesinde, muazzam makro kütüphaneleri sayısız IBM erişim yöntemlerine ve diğer sistem servislerine erişimi sağlar.
- Pek çok işlemci mimarisi idyomatik (deyimsel) komut dizilerine sahiptir (hatta pek çok çeviriciler ortak kullanımlar için gömme makrolara da sahiptirler). Örneğin, bir IBM ana gövdesindeki para birimi formatlama işlemi “Edit” ve “Mark” (EDMK) komutu dahil dört komuttan oluşan bir sıralamayı üretmek için bir makroyu yaygın bir şekilde kullanmıştır.
Söz konusu özellikler yüksek seviyeli dil tasarımlarından ödünç alınırlar. Bunlar kodlama alt seviyeli kodu sürdürme problemlerini büyük ölçüde basit hale getirebilirler. Derleyiciler veya “disassembler”ler (çevirmeyenler) tarafından üretilmiş olan ham (işlenmemiş) assembly kaynak kodunun – yani, yorumsuz, anlamlı semboller, veya veri tanımları – okunması oldukça zordur.
Pek çok assembly dilleri yukarıda belirtilen temel karakteristikleri paylaşırlar. Ancak, bazı olağandışı istisnalar bulunmaktadır, şöyle ki;
- Bazı çeviriciler, sembolik değişkenler, şarta bağlı olanlar, dizi (string) maniplasyonu ve aritmetik işlemler gibi, hepsi verilen bir makro’nun yerine getirilmesi sırasında faydalı olan ve makroların konteksti saklamasına veya bilgi alışverişinde bulunmasına imkân veren, yüksek seviyeli dil elemanlarını ihtiva eden oldukça sofistike makro dillere sahiptirler. Böylece bir makro, makro argümanlarına dayalı büyük miktarda assembly dil komutlarını veya veri tanımlarını yayabilecektir. Bu, örneğin, kayıt tarzı veri yapılarını veya “unrolled” (sarılmamış) halkaları (loops) üretmek için kullanılabilecektir veya kompleks parametrelere dayalı tüm algoritmaları üretebilecektir. Böyle bir makro süiti kullanarak ağır bir şekilde genişlemiş olan assembly dilini kullanan bir teşkilat tartışmalı olarak bir miktar yüksek seviyeli dil içinde çalışmakta olduğu düşünülebilir – bu tür programlar bir bilgisayarın en düşük seviyeli kavramsal elemanlarıyla çalışmamaktadır.
- Bazı çeviriciler icra akışını şifrelemek (encode) için yapısal programlamaya sahiptirler. Bu yaklaşımın ilk örneği IBM’in Thamos Watson Araştırma Merkezinde Marvin Zloof tarafından geliştirilen Concept-14 makro set’de görülmüştür; bu S/370 makro çeviriciyi IF/ELSE/ENDIF ve benzer kontrol akış bloklarıyla genişletmiştir. Bu assembly kodunda GOTO işlemlerinin kullanımını azaltmada veya elimine etmede kullanılan bir usul olmuştu, assembly dilinde spagetti koduna neden olan ana faktörlerden birisi. Bu yaklaşım daha sonraki günlerde büyük ölçekli assembly dilinin kullanımında geniş kullanım alanı bulmuştur, yani 80’li yılların başlarında.
- Garip bir tasarım A-natural, Whitesmiths Ltd.’den (Unix benzeri Idris’in geliştiricileri olan ve ilk ticari C derleyicisi olduğu bildirilen) 8080, Z80 işlemcileri için bir “stream-oriented” (akışa yönelik) çevirici olmuştur. Bu dil bir çevirici olarak sınıflandırılmıştı, çünkü bu dil işlem kodları, “register”ler ( kayıt yerleri) ve bellek referansları gibi ham makine elemanlarıyla çalışmıştı; fakat icra emrini göstermek için bir ifade sentaksını içermiştir. Blok’a yönelik yapısal programlama yapılarının yanında parantezler ve diğer semboller üretilen komutların sırasını kontrol etmiştir. “A-natural” elle kodlama amacından ziyade bir C derleyicisinin hedef dili (object language) olarak kurulmuştu, fakat bu dilin mantıksal sentaksı birtakım taraftarın oluşmasını (destekçilerin ortaya çıkmasını) sağlamıştır.
Büyük ölçekli assembly dilinin gelişmesindeki gerilemeden bu yana daha sofistike çeviriciler için çok az görünür talep olmuştur.
Assembly dilinin kullanışı
Tarihî perspektif
Tarihsel olarak tamamen assembly dilinde olmak üzere çok sayıda programlar yazılmıştır. Çalışan sistemler 1970’li yıllarda ve 1980’li yılların başlangıcında C’nin yaygın bir şekilde kullanılmasının kabul edilmesine kadar hemen hemen münhasıran assembly dilinde yazılmışlardı. Büyük şirketler tarafından yazılan büyük miktarda IBM ana gövde (mainframe) (bilgisayarın kalbi) yazılımı dahil pek çok ticari uygulamalar da assembly dilinde yazılmıştı. Birtakım büyük şirketlerin 80’li yıllarda assembly dil uygulaması altyapılarını muhafaza etmelerine karşın COBOL ve FORTRAN dolayısıyla bu işin çoğunu değiştirmiştir.
İlk mikrobilgisayarların pek çoğu, genellikle çalışan sistemler ve geniş uygulamalar dahil elle kodlamalı assembly diline bel bağlamıştı. Bunun nedeni adı geçen sistemlerin konulan özel (idiosyncratic) bellek ve display mimarileri ve sağlanan sınırlı “buggy” sistem servisleri yüzünden ciddi kaynak sıkıntıları içinde bulunmalarıydı. Belki de daha önemlisi mikrobilgisayar kullanımına uygun birinci sınıf yüksek seviyeli dil derleyicilerinin bulunmayışıydı. Bir psikolojik faktöründe bunda rolü olmuş olabilir: mikrobilgisayar programcılarının ilk nesli bir hobici (meraklı), “teller ve pense” davranışı içindeydi. Bu zamandan kalan tipik büyük assembly dil programlarının örnekleri CP/M ve MS-DOS işlem sistemleridir; ilk IBM PC “spreadsheet” (hesap tablosu) programı Lotus 123 ve hemen hemen tüm popüler oyunlar için Commodore 64. Hatta 1990’lı yıllarda Mega Drive/Genesis ve Super nintendo Entertainment System için pek çok oyunlar dahil, pek çok konsol video oyunları assembly dilinde yazılmıştı. Popüler pasaj (arcade) oyunu NBA Jam (1993) buna başka bir örnektir.
Günümüzdeki kullanım
Günümüzde dikkatleri çok az çekse de assembly dilinin yüksek seviyeli dillere göre faydalılığı ve performansı üzerinde sürekli olarak tartışmalar yapılmaktadır. Assembly dili önemli olduğunda kullanılan spesifik uygun bir yere sahiptir: aşağıya bakınız. Ancak genel olarak modern işlemciler etkin elle yapılan optimizasyonu giderek zorlaştırmaktadır. Ayrıca ve verimliliği sevenlerin korkulu umutsuzluklarına karşın artış gösteren işlemci performansı pek çok CPU’ların zamanın çoğunda boş oturduklarını, I/O işlemleri ve çağrı (paging) gibi önceden tahmin edilen sıkıntıların neden olduğu gecikmelerin söz konusu olduğunu ifade etmektedir. Bu pek çok programcılar için ham kodun çalışma hızını bir mesele olmaktan çıkarmıştır. (Böylece âşikâr performans etkisi olmaksızın yorumlanan dillerin kullanımı artırılmıştır.)
Aslında günümüz uzman pratisyenlerin assembly dilini tercih edebileceği sadece çok az durum vardır: şöyle ki:
- Tek başına bir ikilinin icra edilmesi gerektiğinde, bir başka deyişle yüksek seviyeli bir dille bağlantılı olarak çalışma süresi elemanlarına veya kütüphanelerine başvurmaya gerek duyulmaksızın icra etmesi kesinlikle şart olan; bu belki de en çok karşılaşılan durumdur.
- Donanımla doğrudan etkileşim sağlandığında, örneği: bir cihaz sürücüsünde veya derleyici tarafından kullanılmayan veya derleyicide bulunmayan işlemciye özel komutların kullanılması halinde.
- Ekstrem (aşırı) optimizasyonun gerekmesi halinde, örneğin; işlemci yoğun algoritma içindeki bir dahili döngü(loop) içinde.
- Sınırlı kaynakların kullanımını maksimize etmek için ciddi kaynak sıkıntısı içindeki bir sistemin (örneğin: bir dahili sistem) elle kodlanması gerektiğinde; ancak işlemci fiyatı/performansı kanıtlamadığından bu daha az yaygın hale gelmektedir.
- Yüksek seviyeli dilin mevcut olmaması halinde, örneğin; bir yeni veya uzmanlaşmış işlemcide.
Günümüzde pek az programcı günlük bazda assembly dilini kullanma gereğini duymaktadır. Performans-kritik uygulamalar için C gibi alt seviyeli bir dil genellikle seçilebilecektir. Şimdi, bir assembly dilinde yazılan programdan daha az verimli olan bir C programını yazmak çok güçtür.
Ancak, assembly dili pek çok Bilgisayar Bilimi programlarında hâlâ öğretilmektedir. Bir araç olarak günümüzde az sayıda programcılar düzenli olarak assembly dili ile çalışmaktaysalar da kolayca görülmeyen ancak önemli olan kavramlar hâlâ önemini sürdürmektedir. İkili (binary) aritmetik, bellek tahsisi, “stack” işleme, karakter seti kodlaması, kesme işlemi ve derleyici tasarımı gibi ana konular üzerinde ayrıntılı olarak çalışmak bir bilgisayarın donanım seviyesinde nasıl çalıştığını tam olarak kavramadan çok zor olacaktı. Bir bilgisayarın davranışı esas itibarıyla kendi komut setiyle belirlendiğinden, bu kavramların öğrenilmesindeki mantıksal usul bir assembly dili üzerinde çalışma yapmaktır. Neyse ki, pek çok modern bilgisayarlar benzer komut setlerine sahiptir, böylece tek bir assembly dili üzerindeki çalışma temel kavramları (concepts) öğrenmek, assembly dili kullanımının uygun olabileceği durumları tanımak ve verimli icra edilebilir bir kodun yüksek seviyeli dillerden yaratılabileceğini anlamak için yeterlidir.
Tipik uygulamalar
Elle kodlanmış assembly dili tipik olarak bir sistemin BIOS’unda kullanılır. Bu alt seviyeli kod diğerleriyle birlikte OS’yi tanıtmadan (booting) önce sistem donanımını çalıştırmak ve test etmek için kullanılır ve ROM içinde saklanır. Bir kez belli bir seviyedeki donanımın initializasyonu (ilk çalıştırılması) yapılırsa, icraat diğer koda geçer, tipik olarak yüksek seviyeli dillerde yazılmıştır; fakat güç devreye alındıktan hemen sonra çalışan kod genellikle assembly dilinde yazılır. Aynı şey pek çok “boot” yükleyicileri içinde geçerlidir.
Pek çok derleyiciler tam derleme yapılmadan önce ilk iş olarak, assembly kodunun hatadan kurtarma (debugging) ve optimizasyon amacıyla görülmesine imkân vererek yüksek seviyeli dillerin assembly (çevirme) içine alınmasını sağlar.
Bu imkânları kullanan programlar, Linux kernel gibi, daha sonra her bir donanım platformu üzerinde farklı assembly dili kullanan abstraksiyonları inşa edebilirler. Sistemin taşınabilir kodu daha sonra bu işlemciye özel elemanları yeknesak bir ara yüz vasıtasıyla kullanabilir.
Pek çok program sadece makine kodu formunda dağıtıldıklarından ve makine kodunun genellikle assembly diline çevrilmesi kolay olduğundan ve bu formda dikkatlice incelendiğinden, fakat bir yüksek seviyeli dile çevirmek çok zor olduğundan, assembly dili ters mühendislikte de kıymetlidir. Enteraktif Disassembler (çeviri yapmayan) gibi araçlar bu amaca yönelik “disassembly”nin kapsamlı kullanımına imkân verir.
İlgili terminoloji
- Assembly (çevirme) dili veya çevirici dili genel olarak assembly (çevirme), assembler (çevirici), ASM, veya sembolik makine kodu şeklinde adlandırılır. IBM ana gövde (mainframe) programlayıcılarının bir nesli Temel Assembly Dili için BAL olarak adlandırılır.
Not: Dil çeviricisi teriminin kullanılması şüphesiz potansiyel olarak karıştırılır ve müphemdir, çünkü bu terim aynı zamanda assembly dil komutlarını makine koduna çeviren faydalanma (utility) programının da adıdır. Bazıları bunun tam karşılığı olmadığını veya hata olduğunu düşünebilir. Ancak, bu kullanım profesyoneller arasında ve literatürde on yıldan beri yaygın bir kullanıma sahiptir. Aynı şekilde bazı ilk bilgisayarlar çeviricilerine assembly programı olarak adlandırmışlardır.
- Tüm makro işlem dahil bir çeviricinin çalıştığı hesapsal (computational) adım assembly (çevirme) zamanı olarak bilinir.
- Assembly (çevirme) sözcüğünün kullanımı bilgisayarın ortaya çıktığı ilk yıllar kadar eskidir (karşılaştırınız: kısa kod. Hızlı kod/”hızlı kodlama”).
- Bir çapraz çevirici (cross assembler) (çapraz derleyiciye bakınız) tek tip işlemci için kod üretir, fakat başka birisinin üzerinde çalışır. Yeni işlemciler için yazılımların geliştirilmesi sırasında bu teknoloji özellikle önemlidir.
Daha fazla bilgi
Hem geçmişte hem de günümüzde verilen herhangi bir kişisel bilgisayar, ana gövde, dahili sistem ve oyun konsolu için çeviricilerden (muhtemelen düzinelerce) en az biri yazılmıştır. Örnekler için çeviriciler listesine bakınız.
Unix sistemlerinde çevirici geleneksel olarak “as” olarak adlandırılır; kodun tek bir gövdesi olmasa da, her bir port için tipik olarak yeniden yazılır. Unix varyantlarının bir kısmı GAS kullanır.
İşlemci grupları içerisinde her bir çevirici kendine ait diyalekte sahiptir. Bazen, bazı çeviriciler başka bir çeviricinin diyalektini okuyabilir, örneğin, TASM eski MASM kodunu okuyabilir, fakat eski MASM kodu TASM’yi okuyamaz. FASM ve NASM aynı sentaksa sahiptirler, fakat her biri birbirlerine çevirmeyi güçleştiren farklı makroları destekler. Temel tamamıyla aynıdır, fakat ileri özellikler farklı olacaktır.
Ayrıca, assembly (çevirme) bazen aynı tip CPU üzerindeki farklı çalışan tüm sistemlerde taşınabilir. Çalışan sistemler arasında konvansiyonlar olarak çağrılması sıklıkla biraz farklıdır ve büyük dikkat ile assembly dilinde bir miktar portatifliğin elde edilmesi mümkündür, genellikle çalışan sistemler arasında değişmeyen bir C kütüphanesi ile bağlanarak. Ancak, arayanın çalışan sistemler arasında değişebilen ön işlemci makroları kullanmasını isteyen C kütüphanesi ile portatif olarak bağlanmak mümkün değildir.
Örneğin, derlemeden önce “libe”deki pek çok şey OS-specific, C-specific şeyleri programda yapmak için ön işlemciye bağlıdır. Aslında, bazı fonksiyonların ve sembollerin ön işlemcinin dışında varlıkları da garanti edilemez. En kötüsü, “structs” ın büyüklüğü ve alan sırası, aynı zamanda “off t” gibi belli “typedefs” büyüklüğü assembly dilinde hiç yoktur ve parametreler olarak sadece basit tam sayıları ve ibreleri alanların dışında “libe” deki fonksiyonları portatif olarak aramayı imkânsız hale getirerek Linux versiyonları arasında da farklıdırlar.
C gibi bazı yüksek seviyeli bilgisayar dilleri, assembly kodunun oldukça kısa bölümlerinin yüksek seviyeli dil kodunun içerisine yerleştirilebilindiği “Inline assembly”yi desteklerler. “Borland Pascal” de bir “asm” şifresiyle açılan bir çevirici derleyiciye sahip olmuştur. Bu başlıca Mouse (fare) ve COM-port sürücüleri oluşturmakta kullanılmıştı.
Assembly dil programlarını hatadan arındırmak (debug) için pek çok kişi bir benzetici (emulator) kullanır.
Aşağıda C, Visual Basic ve Assemblyde introduction programlarının farkı. Dil seviyesi yükseldikçe kod kısalmaktadır:
Assembly
title Hello World Program (hello.asm) dosseg .model small .stack 100h .data hello_message db 'Hello World!',0dh,0ah,'$' .code main proc mov ax,@data mov ds,ax mov ah,9 mov dx,offset hello_message int 21h mov ax,4C00h int 21h main endp end main
C
#include<stdio.h> int main() { printf("Hello World\n"); return 0; }
Visual Basic
Sub Main() MsgBox("Hello, World!") ' End Sub
Kaynakça
- David Salomon, Assemblers and Loaders. 1993
- Hyde, op. cit., Foreword ("Why would anyone learn this stuff?")
- Stroustrup, Bjarne, The C++ Programming Language, Addison-Wesley, 1986, : "C++ was primarily designed so that the author and his friends would not have to program in assembler, C, or various modern high-level languages. [use of the term assembler to mean assembly language]"
- Saxon, James, and Plette, William, Programming the IBM 1401, Prentice-Hall, 1962, LoC 62-20615. [use of the term assembly program]
- Murdocca, Miles J., Vincent P. Heuring (2000). Principles of Computer Architecture. Prentice-Hall. .
- Principles of Computer Architecture (POCA) – ARCTools virtual computer available for download to execute referenced code, accessed August 24, 2005
Dış bağlantılar
- Open source assembly language compiler. 9 Aralık 2021 tarihinde Wayback Machine sitesinde .
- The Place On The Internet to Learn Assembly 20 Haziran 2012 tarihinde Wayback Machine sitesinde .
- x86 Assembly community4 Mart 2009 tarihinde Wayback Machine sitesinde .
- Linux için Satıriçi Sembolik Makina Dili (Inline Assembly) 21 Eylül 2015 tarihinde Wayback Machine sitesinde .
wikipedia, wiki, viki, vikipedia, oku, kitap, kütüphane, kütübhane, ara, ara bul, bul, herşey, ne arasanız burada,hikayeler, makale, kitaplar, öğren, wiki, bilgi, tarih, yukle, izle, telefon için, turk, türk, türkçe, turkce, nasıl yapılır, ne demek, nasıl, yapmak, yapılır, indir, ücretsiz, ücretsiz indir, bedava, bedava indir, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, resim, müzik, şarkı, film, film, oyun, oyunlar, mobil, cep telefonu, telefon, android, ios, apple, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, pc, web, computer, bilgisayar
Cevirme dili ya da assembly dili Ingilizce assembly language bir bilgisayarda tum islemleri islemci gerceklestirir ve islemcinin de makine dili denen kendine has bir dili vardir Islemci yalnizca bu dili anlar ve bu dili kullanarak anlasirsiniz Fakat bu dili ogrenmek ve kullanmak cok zordur Bu nedenle insanlarin anlayabilecegimiz bir dilde konusup ardindan islemcinin diline ceviren yazilimlar gelistirilmistir Bunlara derleyici denir Derleyiciler de bir dile sahiptir fakat islemcinin diline gore cok daha kolaydir Iste bu derleyici dillerinden biri de Assembly dir Cevirici dil bilgisayar programlarinin yazilmasinda kullanilan alt seviyeli bir dildir Assembly dili programlarinin yaziliminda insan dostu sembollerin Ingilizce Ingilizce mnemonics kullanilmasi daha fazla hataya yatkin ve zaman alici ilk bilgisayarlarda kullanilmis olan bir hedef bilgisayarinin sayisal makine kodunda dogrudan programlama calismasinin yerine gecmistir Bir assembly dil programi cevirici Ingilizce assembler olarak adlandirilan faydali bir program tarafindan hedef bilgisayarin makine koduna cevrilir Bir cevirici bir derleyiciden Ingilizce compiler farklidir ve genellikle Ingilizce mnemonic ifadelerden makine komutlarina teke tek izomorfik ceviriler yapar Assembly dili karmasik programlar yazmak icin kullanilan dusuk seviyeli bir programlama dilidir Assembly insanlar tarafindan anlasilmasi zor olan makine dilinin sayisal ifadelerini insanlar tarafindan anlasilarak programlanmasi daha kolay olan alfabetik ifadelerle degistirerek dusuk seviyede programlama icin bir ortam olusturur Assembly kullanmanin amaci ilk bilgisayarlarda yazilan programlarin daha az hata icermesi ve daha az zaman almasini saglamaktir Assembly dilini makine koduna ceviren programlara assembler denir Bir assembler i derleyiciden ayiran en onemli ozellik birebir donusum yapmasidir Derleyiciler kodun tamamini okurlar ve kodun tamamini anlamli bir programa donustururler Kodun her satirini tek tek okuyan ve uygulayan programlara ise yorumlayici denir Assembly dil programlari genellikle platformdan bagimsiz olan yuksek seviyeli programlama dillerinin aksine bir hedef bilgisayar mimarisine siki sikiya baglidir ve bu bilgisayara ozeldir Cok fazla sofistike olan ceviriciler programin gelismesini kolaylastirmak ceviri islemini kontrol etmek ve hatalarin duzeltilmesine yardimci olmak amaciyla mekanizmalar kullanarak program komutlarinin temel cevirisini genisletir Assembly dili bir zamanlar programlamada cok fazla kullanilmaktaydi ancak gunumuzde daha az kullanilma egilimindedir oncelikle dogrudan donanim manipulasyonunun veya anormal performans hususlari soz konusu oldugu zaman bu dil kullanilmaktadir Tipik uygulamalari cihaz suruculeri alt seviyeli dahili embedded sistemleri ve gercek zaman uygulamalaridir Assembly ceviri ve assembler cevirici terimlerinin celiskili kullanimlarina iliskin olarak asagidaki terminoloji bolumune bakiniz Temel kavramlarCevirici assembler Tipik olarak bir modern cevirici assembly ceviri komut mnemonic leri islem kodlarina cevirerek tercume ederek ve hafiza mahalleri memory locations ve diger varliklar icin sembolik isimler belirleyerek object code unu olusturur Sembolik referanslarin kullanilmasi program modifikasyonlarindan sonra biktirici hesaplamalari ve elle yapilan adres guncellestirmelerini kaydettiginden ceviricilerin en onemli kilit ozelligidir Ceviricilerin cogu metinsel ikameyi yerine koymayi yerine getirmek icin ornegin bir alt rutin subroutine yerine inline olarak calisacak komutlarin ortak kisa serilerini uretmek icin makro imkanlari da icerirler Ceviriciler genellikle yuksek seviyeli dilleri yazma konusunda derleyicilerden compilers daha basittir ve 1950 li yillardan beri kullanilmaktadir Bilgisayarlarin ilk gunlerindeki ilk ceviriciler yorgun programcilarin bir jenerasyonu icin onemli bir kesifti Modern ceviriciler bilhassa MIPS Sun SPARC ve HP PA RISC gibi RISC e dayali mimariler CPU pipeline verimliligini saglamaya yonelik komutu instruction optimize ederler Daha sofistike karmasik olan Yuksek Seviyeli ceviriciler asagida belirtilenler gibi dil ozetlerini abstractions saglarlar Yuksek kontrol yapilari Yuksek seviyeli prosedur fonksiyon deklarasyonlari ve talepleri Yapilar kayitlar birlikler siniflar ve takimlar dahil yuksek seviyeli ozet veri turleri Sofistike makro isleme Daha fazla bilgi icin asagidaki Dil tasarimina bakiniz Normal profesyonel kullanimda cevirici teriminin siklikla farkli anlamlarda kullanildigina dikkatinizi cekeriz siklikla cevirici yararindan ziyade bir ceviri dilinin kendisine atfen kullanilir Boylece ASM H cok kullanilan bir S 370 cevirici olmustur ifadesine karsi CP CMS S 360 ceviricide yazilmistir ifadesi kullanilir Assembly cevirme dili Assembly dilinde yazilan bir program pek cok yerine getirilebilir komutlara emirlere tekabul eden komut mnemonic lerin sembollerin bir serisinden olusur bir cevirici tarafindan tercume edildiginde bunlar hafizaya yuklenebilir ve yerine getirebilirler Ornegin bir x86 IA 32 islemci makine dilinde ifade edilmis olan asagidaki ikili binary komutu yerine getirebilir Binary ikili 10110000 01100001 Alti haneli ondalik 0xb061 Muadil assembly dilinin sunumu daha kolay hatirlanir daha fazla mnemonic tir Mov al 061h Bu komut sunu ifade eder 61 97 ondalik alti haneli degeri al adi verilen islemci kaydedicisinin icine naklediniz mov sembolu mnemonic bir islem kodu olup move tasi sozcugunu kisaltmak icin komut set tasarimcisi tarafindan secilmistir Virgulle ayrilmis argumanlarin veya parametrelerin bir listesi islem kodunu izler bu tipik bir assembly dil ifadesidir Assembly dilinin makine diline donusturulmesi bir cevirici tarafindan gerceklestirilir ve bunun tersi olan islem bir demonte edici disassembler tarafindan yapilir Yuksek seviyeli dillerin aksine basit assembly ifadeleri ile makine dili komutlari arasinda genellikle 1 10 1 iliski bulunur Ancak bazi hallerde bir cevirici ortak ihtiyac duyulan islevselligi saglayacak olan cesitli makine dili komutlarina yayilan pseudoinstructions yapma emirler saglayabilir Ornegin bir buyuk veya esit ise dallandir emrine sahip olmayan bir makine icin bir cevirici makinenin eger kucuk ise kur set if less than ve eger sifir ise dallandir kurulan emrin neticesinde ifadelerine kadar uzanan bir yapma emri bir cevirici verebilir Tam yetenekli ceviricilerin pek cogu ayrica daha karmasik kod ve veri dizisini uretmek amaciyla saticilar ve programcilar tarafindan kullanilan zengin bir makro dili asagida tartisilmistir de saglarlar Her bilgisayar mimarisi kendine ozgu makine diline sahiptir ve dolayisiyla kendisine ait bir cevirme dili vardir Bilgisayarlar destekledikleri islemlerin sayisina ve tipine gore birbirlerinden farklidirlar Bilgisayarlar ayni zamanda farkli ebat ve sayida kayit unitelerine ve hafizada veri tiplerinin farkli orneklerine sahip olabilirler Pek cok genel amacli bilgisayarlar esas itibariyla ayni islevselligi surdururlerken bu islevlerin yapilis tarzi farklidir benzer cevirme dilleri bu farkliliklari yansitir Mnemonics sembollerin veya assembly dil sentakslarinin coklu takimlari tek bir emir komut takimi icin hazir olabilir tipik olarak farkli cevirici programlarinda Bu gibi durumlarda en populer olan genellikle uretici tarafindan temin edilen ve dokumantasyonunda kullanilandir Makine dili Makine dili munferit ifadelerden statements veya komutlardan instructions tesis edilir Islem mimarisine bagli olarak verilen bir komut emir aritmetik adresleme veya kontrol fonksiyonlari icin belli kayit yerlerini registers belli hafiza yerlerini veya ofsetleri Islem faktorlerini operands yorumlamak icin kullanilan belli adresleme sekillerini belirleyebilir Daha karmasik islemler sirasiyla yerine getirilen bir von Neumann makinesinde veya baska bir sekilde kontrol akis komutlariyla yonlendirilen bu basit komutlarin birlestirilmesiyle olusturulur Pek cok komut grubunda yer alan bazi islemler tasima bir sabit degere bir kayit yerini ayarlayiniz CPU nun kendisinde gecici bir scratchpad bir bilgisayar sisteminde gecici sonuclari tutmak icin kullanilan bir bellek yeri verileri bir bellek yerinden bir kayit yerine veya kayit yerinden bir bellek yerine tasiyiniz Bu islem daha sonra bir hesaplama yapmak veya hesaplama sonucunun saklamak icin verilerin temin edilmesi amaciyla yapilir donanim cihazlarindan verileri okuyunuz ve yaziniz hesaplama sonuclari bir kayit yerine yerlestirerek iki kayit yerinin degerlerini toplayiniz cikariniz carpiniz veya bolunuz bir cift kayit yerindeki pair of registers ilgili bit lerin birlesimini ayrimini ve veya alarak veya bir kayit yerinde register her bir bit i eksilterek bit e yonelik islemleri yapiniz Kayit yerlerindeki iki degeri karsilastiriniz ornegin birinin digerinden az olup olmadigini veya ikisinin de birbirlerine esit olup olmadiklarini anlamak icin Program akisinin etkilenmesi programda baska bir yere atlayiniz ve orada komutlari yerine getiriniz belli bir kosulun olusmasi halinde baska bir yere atlayiniz baska bir yere atlayiniz ancak bir cagriya donus noktasi olarak bir sonraki komutun yerini saklayiniz Bazi bilgisayarlar icerdikleri komut grubunda karmasik complex komutlara sahiptirler Tek bir complex komut diger bilgisayarlarda pek cok komutlari alabilecegi bir seyi yapar Bu tur komutlar coklu adimlar atan coklu fonksiyonel birimleri kontrol eden veya baska bir sekilde belli bir islemci tarafindan uygulanan basit talimatlarin tumunden daha hacimli gorunen komutlar olarak siniflandirilirlar Complex Karmasik komutlarin bazi ornekleri asagida verilmistir Bir defada stack bir uctan erisilebilir birbirini takip eden bellek yerlerinin bir blogu uzerinde pek cok kayit yerlerini registers saklayan Genis bellek bloklarini tasiyan Karmasik complex ve veya kayan nokta floating point aritmetigi sinus kosinus karekok vs Bir atomik test et ve kur test and set komutunu yerine getiren ALU yu bir register kayit yeri yerine bellekten gelen bir operand islem faktoru ile birlestiren komutlar Son zamanlarda ozellikle cok populer hale gelen bir kompleks karmasik komut turu SIMD islemi veya ayni zamanda coklu veri parcalari uzerinde ayni aritmetik islemi yapan bir islem olan vektor komutudur SIMD komutlari cogunlukla ses goruntu ve video isleminde bulunan algoritmalarin kolayca paralelizasyonunu saglar MNX 3DNow ve AltiVec gibi ticari markalarda muhtelif SIMD uygulamalari piyasaya sunulmustur Komut takimlarinin grubu tasarimi karmasik bir husustur Basit bir komut takimi kucultulmus islemci buyuklugu ve dusuk enerji tuketimiyle birlikte yuksek hizlar icin potansiyel olusturabilir daha karmasik olan genel islemleri optimize edebilir bellek kase verimliligini artirabilir veya programlamayi basitlestirebilir Bu farklilik genellikle CISC ye Complex Instruction set Computer Kompleks Komut Grubu Bilgisayari karsi RISC Reduced Instruction Set Computer Kucultulmus Komut Grubu Bilgisayari acisindan tartisilir ancak bu bir asiri basitlestirmedir Ornegin RISC kavrami bir mikro programlanan mimariye acik assembly dil programlanmasinda direkt yoldan ziyade derleyici teknoloji tarafindan isletilmeyi amaclayan olarak dusunulebilir Programlama kolayligi ve pek cok optimizasyon meseleleri tartisilacak bir konuyu teskil eder Ilgili yorumlar icin komut grubuna instruction set bakiniz Dil tasarimiAssembly dilindeki komutlar emirler yuksek seviyeli bir dilin aksine genellikle oldukca basittirler Her bir komut tipik olarak bir islem kodundan veya sadece komut arti sifir veya daha fazla operand lardan islem faktorlerinden ibarettir Komutlarin pek cogu tek bir degere veya deger ciftine atifta bulunurlar Dilde kodlanan bir komut genellikle dogrudan yerine getirilebilir makine dili komutuna tekabul eder Pek cok assembly dillerinde ortak olarak bulunan diger elemanlar arasinda asagidakiler yer alir Veri tarifleri Ilave direktifler programcinin makine dil komutlariyla referans icin saklama depolama alanlarini ayirmasini saglarlar Depolama tipik olarak gercek sayilar diziler ve diger primitif veri tipleriyle baslatilabilir Etiketler Veri tariflere programci tarafindan belirlenen isimler etiketler veya semboller ve tipik olarak referans sabiteleri degiskenler veya yapi elemanlari kullanilmak suretiyle referanslandirilirlar Etiketler ayni zamanda kod yerlerine de tahsis edilebilirler ornegin alt rutin giris noktalari veya GOTO destinasyonlari gibi Ceviricilerin pek cogu programcilarin farkli isim yerlerini yonetmesine veri yapilari icinde ofsetleri otomatik olarak hesaplamalarina ve gercek degerlere veya cevirici tarafindan gerceklestirilen basit hesaplamalarin sonucuna atifta bulunan etiketleri belirlemesine imkan veren esnek sembol yonetimini saglarlar Yorumlar Pek cok bilgisayar dilleri gibi cevirici tarafindan goz ardi edilen yorumlar assembly kaynak koduna eklenebilirler Makrolar Pek cok cevirici bir takim argumanlara dayali kod veya veri ureten dahili embedded bir makro dile sahiptirler Makrolar tekrar kacinmak amaciyla programci tarafindan kodlanabilir ornegin ortak bir veri yapisinin olusturulmasi Makrolar belli bir islemi kapsayacak sekilde bir satici veya uretici tarafindan da temin edilirler Ornegin 8 bit islemcililer iki ardisik byte icinde saklanan 16 bit lik bir miktari artiran veya azaltan bir makronun kullanilmasi yaygindir normal olarak ornegin 6502 gibi uc veya dort komutu gerektirecek olan ortak bir operasyon I O operasyonlari veya alt seviyeli calisan sistem talepleri gibi Standard sistem ara yuzlerin kullanilmasi icin Ureticiler makrolar temin ederler IBM ana govdesinde muazzam makro kutuphaneleri sayisiz IBM erisim yontemlerine ve diger sistem servislerine erisimi saglar Pek cok islemci mimarisi idyomatik deyimsel komut dizilerine sahiptir hatta pek cok ceviriciler ortak kullanimlar icin gomme makrolara da sahiptirler Ornegin bir IBM ana govdesindeki para birimi formatlama islemi Edit ve Mark EDMK komutu dahil dort komuttan olusan bir siralamayi uretmek icin bir makroyu yaygin bir sekilde kullanmistir Soz konusu ozellikler yuksek seviyeli dil tasarimlarindan odunc alinirlar Bunlar kodlama alt seviyeli kodu surdurme problemlerini buyuk olcude basit hale getirebilirler Derleyiciler veya disassembler ler cevirmeyenler tarafindan uretilmis olan ham islenmemis assembly kaynak kodunun yani yorumsuz anlamli semboller veya veri tanimlari okunmasi oldukca zordur Pek cok assembly dilleri yukarida belirtilen temel karakteristikleri paylasirlar Ancak bazi olagandisi istisnalar bulunmaktadir soyle ki Bazi ceviriciler sembolik degiskenler sarta bagli olanlar dizi string maniplasyonu ve aritmetik islemler gibi hepsi verilen bir makro nun yerine getirilmesi sirasinda faydali olan ve makrolarin konteksti saklamasina veya bilgi alisverisinde bulunmasina imkan veren yuksek seviyeli dil elemanlarini ihtiva eden oldukca sofistike makro dillere sahiptirler Boylece bir makro makro argumanlarina dayali buyuk miktarda assembly dil komutlarini veya veri tanimlarini yayabilecektir Bu ornegin kayit tarzi veri yapilarini veya unrolled sarilmamis halkalari loops uretmek icin kullanilabilecektir veya kompleks parametrelere dayali tum algoritmalari uretebilecektir Boyle bir makro suiti kullanarak agir bir sekilde genislemis olan assembly dilini kullanan bir teskilat tartismali olarak bir miktar yuksek seviyeli dil icinde calismakta oldugu dusunulebilir bu tur programlar bir bilgisayarin en dusuk seviyeli kavramsal elemanlariyla calismamaktadir Bazi ceviriciler icra akisini sifrelemek encode icin yapisal programlamaya sahiptirler Bu yaklasimin ilk ornegi IBM in Thamos Watson Arastirma Merkezinde Marvin Zloof tarafindan gelistirilen Concept 14 makro set de gorulmustur bu S 370 makro ceviriciyi IF ELSE ENDIF ve benzer kontrol akis bloklariyla genisletmistir Bu assembly kodunda GOTO islemlerinin kullanimini azaltmada veya elimine etmede kullanilan bir usul olmustu assembly dilinde spagetti koduna neden olan ana faktorlerden birisi Bu yaklasim daha sonraki gunlerde buyuk olcekli assembly dilinin kullaniminda genis kullanim alani bulmustur yani 80 li yillarin baslarinda Garip bir tasarim A natural Whitesmiths Ltd den Unix benzeri Idris in gelistiricileri olan ve ilk ticari C derleyicisi oldugu bildirilen 8080 Z80 islemcileri icin bir stream oriented akisa yonelik cevirici olmustur Bu dil bir cevirici olarak siniflandirilmisti cunku bu dil islem kodlari register ler kayit yerleri ve bellek referanslari gibi ham makine elemanlariyla calismisti fakat icra emrini gostermek icin bir ifade sentaksini icermistir Blok a yonelik yapisal programlama yapilarinin yaninda parantezler ve diger semboller uretilen komutlarin sirasini kontrol etmistir A natural elle kodlama amacindan ziyade bir C derleyicisinin hedef dili object language olarak kurulmustu fakat bu dilin mantiksal sentaksi birtakim taraftarin olusmasini destekcilerin ortaya cikmasini saglamistir Buyuk olcekli assembly dilinin gelismesindeki gerilemeden bu yana daha sofistike ceviriciler icin cok az gorunur talep olmustur Assembly dilinin kullanisiTarihi perspektif Tarihsel olarak tamamen assembly dilinde olmak uzere cok sayida programlar yazilmistir Calisan sistemler 1970 li yillarda ve 1980 li yillarin baslangicinda C nin yaygin bir sekilde kullanilmasinin kabul edilmesine kadar hemen hemen munhasiran assembly dilinde yazilmislardi Buyuk sirketler tarafindan yazilan buyuk miktarda IBM ana govde mainframe bilgisayarin kalbi yazilimi dahil pek cok ticari uygulamalar da assembly dilinde yazilmisti Birtakim buyuk sirketlerin 80 li yillarda assembly dil uygulamasi altyapilarini muhafaza etmelerine karsin COBOL ve FORTRAN dolayisiyla bu isin cogunu degistirmistir Ilk mikrobilgisayarlarin pek cogu genellikle calisan sistemler ve genis uygulamalar dahil elle kodlamali assembly diline bel baglamisti Bunun nedeni adi gecen sistemlerin konulan ozel idiosyncratic bellek ve display mimarileri ve saglanan sinirli buggy sistem servisleri yuzunden ciddi kaynak sikintilari icinde bulunmalariydi Belki de daha onemlisi mikrobilgisayar kullanimina uygun birinci sinif yuksek seviyeli dil derleyicilerinin bulunmayisiydi Bir psikolojik faktorunde bunda rolu olmus olabilir mikrobilgisayar programcilarinin ilk nesli bir hobici merakli teller ve pense davranisi icindeydi Bu zamandan kalan tipik buyuk assembly dil programlarinin ornekleri CP M ve MS DOS islem sistemleridir ilk IBM PC spreadsheet hesap tablosu programi Lotus 123 ve hemen hemen tum populer oyunlar icin Commodore 64 Hatta 1990 li yillarda Mega Drive Genesis ve Super nintendo Entertainment System icin pek cok oyunlar dahil pek cok konsol video oyunlari assembly dilinde yazilmisti Populer pasaj arcade oyunu NBA Jam 1993 buna baska bir ornektir Gunumuzdeki kullanim Gunumuzde dikkatleri cok az cekse de assembly dilinin yuksek seviyeli dillere gore faydaliligi ve performansi uzerinde surekli olarak tartismalar yapilmaktadir Assembly dili onemli oldugunda kullanilan spesifik uygun bir yere sahiptir asagiya bakiniz Ancak genel olarak modern islemciler etkin elle yapilan optimizasyonu giderek zorlastirmaktadir Ayrica ve verimliligi sevenlerin korkulu umutsuzluklarina karsin artis gosteren islemci performansi pek cok CPU larin zamanin cogunda bos oturduklarini I O islemleri ve cagri paging gibi onceden tahmin edilen sikintilarin neden oldugu gecikmelerin soz konusu oldugunu ifade etmektedir Bu pek cok programcilar icin ham kodun calisma hizini bir mesele olmaktan cikarmistir Boylece asikar performans etkisi olmaksizin yorumlanan dillerin kullanimi artirilmistir Aslinda gunumuz uzman pratisyenlerin assembly dilini tercih edebilecegi sadece cok az durum vardir soyle ki Tek basina bir ikilinin icra edilmesi gerektiginde bir baska deyisle yuksek seviyeli bir dille baglantili olarak calisma suresi elemanlarina veya kutuphanelerine basvurmaya gerek duyulmaksizin icra etmesi kesinlikle sart olan bu belki de en cok karsilasilan durumdur Donanimla dogrudan etkilesim saglandiginda ornegi bir cihaz surucusunde veya derleyici tarafindan kullanilmayan veya derleyicide bulunmayan islemciye ozel komutlarin kullanilmasi halinde Ekstrem asiri optimizasyonun gerekmesi halinde ornegin islemci yogun algoritma icindeki bir dahili dongu loop icinde Sinirli kaynaklarin kullanimini maksimize etmek icin ciddi kaynak sikintisi icindeki bir sistemin ornegin bir dahili sistem elle kodlanmasi gerektiginde ancak islemci fiyati performansi kanitlamadigindan bu daha az yaygin hale gelmektedir Yuksek seviyeli dilin mevcut olmamasi halinde ornegin bir yeni veya uzmanlasmis islemcide Gunumuzde pek az programci gunluk bazda assembly dilini kullanma geregini duymaktadir Performans kritik uygulamalar icin C gibi alt seviyeli bir dil genellikle secilebilecektir Simdi bir assembly dilinde yazilan programdan daha az verimli olan bir C programini yazmak cok guctur Ancak assembly dili pek cok Bilgisayar Bilimi programlarinda hala ogretilmektedir Bir arac olarak gunumuzde az sayida programcilar duzenli olarak assembly dili ile calismaktaysalar da kolayca gorulmeyen ancak onemli olan kavramlar hala onemini surdurmektedir Ikili binary aritmetik bellek tahsisi stack isleme karakter seti kodlamasi kesme islemi ve derleyici tasarimi gibi ana konular uzerinde ayrintili olarak calismak bir bilgisayarin donanim seviyesinde nasil calistigini tam olarak kavramadan cok zor olacakti Bir bilgisayarin davranisi esas itibariyla kendi komut setiyle belirlendiginden bu kavramlarin ogrenilmesindeki mantiksal usul bir assembly dili uzerinde calisma yapmaktir Neyse ki pek cok modern bilgisayarlar benzer komut setlerine sahiptir boylece tek bir assembly dili uzerindeki calisma temel kavramlari concepts ogrenmek assembly dili kullaniminin uygun olabilecegi durumlari tanimak ve verimli icra edilebilir bir kodun yuksek seviyeli dillerden yaratilabilecegini anlamak icin yeterlidir Tipik uygulamalar Elle kodlanmis assembly dili tipik olarak bir sistemin BIOS unda kullanilir Bu alt seviyeli kod digerleriyle birlikte OS yi tanitmadan booting once sistem donanimini calistirmak ve test etmek icin kullanilir ve ROM icinde saklanir Bir kez belli bir seviyedeki donanimin initializasyonu ilk calistirilmasi yapilirsa icraat diger koda gecer tipik olarak yuksek seviyeli dillerde yazilmistir fakat guc devreye alindiktan hemen sonra calisan kod genellikle assembly dilinde yazilir Ayni sey pek cok boot yukleyicileri icinde gecerlidir Pek cok derleyiciler tam derleme yapilmadan once ilk is olarak assembly kodunun hatadan kurtarma debugging ve optimizasyon amaciyla gorulmesine imkan vererek yuksek seviyeli dillerin assembly cevirme icine alinmasini saglar Bu imkanlari kullanan programlar Linux kernel gibi daha sonra her bir donanim platformu uzerinde farkli assembly dili kullanan abstraksiyonlari insa edebilirler Sistemin tasinabilir kodu daha sonra bu islemciye ozel elemanlari yeknesak bir ara yuz vasitasiyla kullanabilir Pek cok program sadece makine kodu formunda dagitildiklarindan ve makine kodunun genellikle assembly diline cevrilmesi kolay oldugundan ve bu formda dikkatlice incelendiginden fakat bir yuksek seviyeli dile cevirmek cok zor oldugundan assembly dili ters muhendislikte de kiymetlidir Enteraktif Disassembler ceviri yapmayan gibi araclar bu amaca yonelik disassembly nin kapsamli kullanimina imkan verir Ilgili terminolojiAssembly cevirme dili veya cevirici dili genel olarak assembly cevirme assembler cevirici ASM veya sembolik makine kodu seklinde adlandirilir IBM ana govde mainframe programlayicilarinin bir nesli Temel Assembly Dili icin BAL olarak adlandirilir Not Dil ceviricisi teriminin kullanilmasi suphesiz potansiyel olarak karistirilir ve muphemdir cunku bu terim ayni zamanda assembly dil komutlarini makine koduna ceviren faydalanma utility programinin da adidir Bazilari bunun tam karsiligi olmadigini veya hata oldugunu dusunebilir Ancak bu kullanim profesyoneller arasinda ve literaturde on yildan beri yaygin bir kullanima sahiptir Ayni sekilde bazi ilk bilgisayarlar ceviricilerine assembly programi olarak adlandirmislardir Tum makro islem dahil bir ceviricinin calistigi hesapsal computational adim assembly cevirme zamani olarak bilinir Assembly cevirme sozcugunun kullanimi bilgisayarin ortaya ciktigi ilk yillar kadar eskidir karsilastiriniz kisa kod Hizli kod hizli kodlama Bir capraz cevirici cross assembler capraz derleyiciye bakiniz tek tip islemci icin kod uretir fakat baska birisinin uzerinde calisir Yeni islemciler icin yazilimlarin gelistirilmesi sirasinda bu teknoloji ozellikle onemlidir Daha fazla bilgiHem gecmiste hem de gunumuzde verilen herhangi bir kisisel bilgisayar ana govde dahili sistem ve oyun konsolu icin ceviricilerden muhtemelen duzinelerce en az biri yazilmistir Ornekler icin ceviriciler listesine bakiniz Unix sistemlerinde cevirici geleneksel olarak as olarak adlandirilir kodun tek bir govdesi olmasa da her bir port icin tipik olarak yeniden yazilir Unix varyantlarinin bir kismi GAS kullanir Islemci gruplari icerisinde her bir cevirici kendine ait diyalekte sahiptir Bazen bazi ceviriciler baska bir ceviricinin diyalektini okuyabilir ornegin TASM eski MASM kodunu okuyabilir fakat eski MASM kodu TASM yi okuyamaz FASM ve NASM ayni sentaksa sahiptirler fakat her biri birbirlerine cevirmeyi guclestiren farkli makrolari destekler Temel tamamiyla aynidir fakat ileri ozellikler farkli olacaktir Ayrica assembly cevirme bazen ayni tip CPU uzerindeki farkli calisan tum sistemlerde tasinabilir Calisan sistemler arasinda konvansiyonlar olarak cagrilmasi siklikla biraz farklidir ve buyuk dikkat ile assembly dilinde bir miktar portatifligin elde edilmesi mumkundur genellikle calisan sistemler arasinda degismeyen bir C kutuphanesi ile baglanarak Ancak arayanin calisan sistemler arasinda degisebilen on islemci makrolari kullanmasini isteyen C kutuphanesi ile portatif olarak baglanmak mumkun degildir Ornegin derlemeden once libe deki pek cok sey OS specific C specific seyleri programda yapmak icin on islemciye baglidir Aslinda bazi fonksiyonlarin ve sembollerin on islemcinin disinda varliklari da garanti edilemez En kotusu structs in buyuklugu ve alan sirasi ayni zamanda off t gibi belli typedefs buyuklugu assembly dilinde hic yoktur ve parametreler olarak sadece basit tam sayilari ve ibreleri alanlarin disinda libe deki fonksiyonlari portatif olarak aramayi imkansiz hale getirerek Linux versiyonlari arasinda da farklidirlar C gibi bazi yuksek seviyeli bilgisayar dilleri assembly kodunun oldukca kisa bolumlerinin yuksek seviyeli dil kodunun icerisine yerlestirilebilindigi Inline assembly yi desteklerler Borland Pascal de bir asm sifresiyle acilan bir cevirici derleyiciye sahip olmustur Bu baslica Mouse fare ve COM port suruculeri olusturmakta kullanilmisti Assembly dil programlarini hatadan arindirmak debug icin pek cok kisi bir benzetici emulator kullanir Asagida C Visual Basic ve Assemblyde introduction programlarinin farki Dil seviyesi yukseldikce kod kisalmaktadir Assembly title Hello World Program hello asm dosseg model small stack 100 h data hello message db Hello World 0 dh 0 ah code main proc mov ax data mov ds ax mov ah 9 mov dx offset hello message int 21 h mov ax 4 C00h int 21 h main endp end main C include lt stdio h gt int main printf Hello World n return 0 Visual Basic Sub Main MsgBox Hello World End SubKaynakcaDavid Salomon Assemblers and Loaders 1993 Hyde op cit Foreword Why would anyone learn this stuff Stroustrup Bjarne The C Programming Language Addison Wesley 1986 ISBN 0 201 12078 X C was primarily designed so that the author and his friends would not have to program in assembler C or various modern high level languages use of the term assembler to mean assembly language Saxon James and Plette William Programming the IBM 1401 Prentice Hall 1962 LoC 62 20615 use of the term assembly program Murdocca Miles J Vincent P Heuring 2000 Principles of Computer Architecture Prentice Hall ISBN 0 201 43664 7 Principles of Computer Architecture POCA ARCTools virtual computer available for download to execute referenced code accessed August 24 2005Dis baglantilarOpen source assembly language compiler 9 Aralik 2021 tarihinde Wayback Machine sitesinde The Place On The Internet to Learn Assembly 20 Haziran 2012 tarihinde Wayback Machine sitesinde x86 Assembly community4 Mart 2009 tarihinde Wayback Machine sitesinde Linux icin Satirici Sembolik Makina Dili Inline Assembly 21 Eylul 2015 tarihinde Wayback Machine sitesinde