Assembly: Revizyonlar arasındaki fark

[kontrol edilmiş revizyon][kontrol edilmiş revizyon]
İçerik silindi İçerik eklendi
k Superyetkin, Çevirici diller sayfasını Assembly sayfasına taşıdı: Yaygın kullanım
+
11. satı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.
 
== 1.Temel Önemli Kavramlarkavramlar ==
'''1.1.=== Çevirici (assembler)''' ===
 
Tipik olarak bir modern '''çevirici''' assembly (çeviri) komut “mnemonic”leri [[işlem kodu|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.
21. satır:
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
• Yüksek seviyeli prosedür fonksiyon deklarasyonları ve talepleri
* Sofistike makro işleme
 
• 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.
Satır 33 ⟶ 30:
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.
 
'''1.2.=== 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.
Satır 39 ⟶ 36:
Ö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 parametlerin bir listesi işlem kodunu izler; bu tipik bir assembly dil ifadesidir.
Satır 57 ⟶ 54:
“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.
 
'''1.3.=== 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 fonksiyonarı 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
• belli hafıza yerlerini veya ofsetleri
 
• İşlem faktörlerini (operands) yorumlamak için kullanılan belli adresleme şekillerini
belirleyebilir.
 
Satır 98 ⟶ 93:
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.)
• Geniş bellek bloklarını taşıyan
* 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.
• 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.
Satır 112 ⟶ 103:
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.
 
== 2. 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 kodu]]ndan (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.
Satır 118 ⟶ 109:
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.
• '''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.
* '''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:
 
o ** 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.
• '''Yorumlar.''' Pek çok bilgisayar dilleri gibi çevirici tarafından göz ardı edilen yorumlar assembly kaynak koduna eklenebilirler.
o ** 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.
 
o ** 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.
• '''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:
 
o 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.
 
o 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.
 
o 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.
• 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.
* 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.
 
• 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.
 
== 3. Assembly dilinin kullanışı ==
 
'''3.1.=== 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.
Satır 151 ⟶ 133:
İ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.
 
'''3.2.=== 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.)
Satır 157 ⟶ 139:
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.
• 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.
* 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.
• 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.
Satır 171 ⟶ 149:
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.
 
'''3.3.=== 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<!--Böyle bir sözcük yok!--> (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.
Satır 181 ⟶ 159:
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.
 
== 4. İ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.
 
== 5. Daha fazla bilgi ==
• 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.
 
== 5. 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.
Satır 256 ⟶ 231:
</source>
 
== 6. Kaynaklar ==
{{kaynakça}}
# http://en.wikipedia.org/wiki/Assembly_language
# David Salomon, Assemblers and Loaders. 1993
# Hyde, op. cit., Foreword ("Why would anyone learn this stuff?")
Satır 274 ⟶ 248:
* [http://www.belgeler.org/howto/linux-inline-assembly.html Linux için Satıriçi Sembolik Makina Dili (Inline Assembly)]
 
[[Kategori:Çevirici diller| ]]
[[Kategori:Düşük seviyeli diller]]
[[Kategori:1949 yazılımlarıtanıtımları]]
[[Kategori:1940'larda oluşturulan programlama dilleri]]
[[Kategori:Gömülü sistemler]]
"https://tr.wikipedia.org/wiki/Assembly" sayfasından alınmıştır