Montajcı | ||
İlk versiyonun tarihi | 1949 | |
---|---|---|
Dosya uzantısı | asm ve s | |
Bir assembly dili veya assembly dili , bilgisayar programlamasında , makine dilini insan tarafından okunabilir bir biçimde temsil eden en düşük seviyeli dildir . Makine dili bitlerinin kombinasyonları, hatırlanması kolay olan " anımsatıcı " sembollerle temsil edilir . Montaj programı , örneğin, oluşturma amacıyla, makine diline Bu hafızaya yanı sıra ikili içine değerlerine (ondalık yazılmış) ve adreslerine yerle etiketleri dönüştürür, bir nesne dosyası ya da yürütülebilir dosya .
Mevcut uygulamada, aynı terim assembler , hem assembly dilini hem de onu çeviren assembly programını belirtmek için kullanılır. Bu nedenle "assembler'da programlamadan" bahsediyoruz.
İlişkili bellek konumu tarafından bir (gelişmiş) talimatta karşılaşılan her değişken adının ve her sabitin (kullanıcı tarafından ondalık olarak yazılan) ikiliye dönüştürülmesi, bir d işleminin tipik bir örneğidir. name assembler, bu özel durumda yaygın olarak kullanılmamaktadır.
Programları EDSAC (1949), ilk kaydedilen programlar ile bilgisayara , her bir komut için bir harf alfabetik bellek destekleyiciler ile yazılmıştır. Çeviri daha sonra programcılar tarafından uzun, sıkıcı ve hataya açık bir işlem olarak elle yapıldı.
İlk montaj programı, 1954'te IBM 701 ( IBM tarafından piyasaya sürülen ilk bilgisayar ) için Nathaniel Rochester tarafından yazılmıştır .
Assembly dilleri, sayısal komut kodlarını ezberleme ve adres hesaplamaları yapma ihtiyacını ortadan kaldırarak, birinci nesil bilgisayarların programcıları tarafından yapılan hataların çoğunu ortadan kaldırmıştır. Daha sonra her türlü programı yazmak için Assembly programlama kullanıldı.
1970'lerde ve 1980'lerde, uygulama yazmak için assembler kullanımının yerini büyük ölçüde yüksek seviyeli programlama dillerinin kullanımı aldı: Fortran , COBOL , PL / I , vb. : makinelerin gücü buna izin verdi ve birkaç saatlik programcı zamanından tasarruf etmek için bir derlemeye birkaç dakikalık bilgisayar zamanı ayırmak, zamanın derleyicileri daha az verimli kod sağlasa bile (daha büyük ve genellikle daha yavaş) karlı bir işlemdi. Ek olarak, bu yüksek seviyeli diller, tek bir donanım mimarisine olan bağımlılığın üstesinden gelmeyi mümkün kıldı.
İşletim sistemleri getirilmesi kadar montaj dilde yazılmıştır MCP için Burroughs ESPOL, bir lehçesinde yazılmış 1961 yılında, Algol .
Montajcı, teknik özelliklerin (azaltılmış bellek boyutu, düşük hesaplama gücü, özel bellek mimarisi, vb.) Güçlü kısıtlamalar getirdiği ve buna önemli bir psikolojik faktör olan "hobici" tutumun eklendiği ilk mikro bilgisayarlar lehine bir şekilde geri döndü. genel olarak bilgisayarla birlikte verilen yorumlanmış BASIC ile yazılan programların yavaşlığından memnun olmayan mikrobilgisayarların ilk kullanıcılarından .
Büyük programlar gibi mikrobilgisayarlar için montaj tamamen yazılmıştır DOS işletim sisteminin içinde , IBM PC (kod etrafında 4000 satır) ve Lotus 1-2-3 elektronik tabloya altında zaten vardı (onun rakibi Multiplan, CP / M , oldu C ile yazılmıştır ). 1990'larda, video konsollarının çoğu oyunu için de durum böyleydi (örneğin Mega Drive veya Super Nintendo için ).
Makine dili bir tek dildir işlemci yürütebilirsiniz. Ancak, her işlemci ailesi farklı bir talimat seti kullanır .
Örneğin, x86 ailesinin bir işlemcisi şu türden bir talimatı tanır:
10110000 01100001Assembly dilinde, bu talimat programcı için anlaşılması daha kolay olan bir eşdeğer ile temsil edilir:
movb $0x61,%al(10110000 = movb% al
01100001 = 0x61 $)
Bunun anlamı: " AL yazmacına 97 sayısını (değer onaltılık olarak verilir : 61 16 = 97 10 ) yazın ".
Bu nedenle, makine dilinin tam bir temsili olan assembly dili, her işlemci mimarisine özgüdür . Ek olarak, tek bir talimat seti için birden fazla anımsatıcı veya montaj dili sözdizimi grubu mevcut olabilir, böylece makro talimatlar yaratılabilir .
Montaj kodunun makine diline dönüştürülmesi, montaj programı adı verilen bir programla gerçekleştirilir . Bu işlemin tersi , yani, makine bir kod parçası assembler eşdeğer bulmak adı var olduğunu sökme .
Düşünüldüğünün aksine, montaj kodu ile makine dili arasında her zaman bire bir yazışma ( eşleştirme ) yoktur. Bu nedenle, bazı işlemcilerde demontaj, bir bilgisayar tarafından mükemmel bir şekilde derlenebilir kalırken, bir insanın anlaması çok zor olan bir kodla sonuçlanabilir. Bir demontajın imkansızlığının çeşitli nedenleri olabilir: kendi kendini değiştiren kodun kullanılması, değişken boyutta talimatlar, kod ile verileri ayırt edememe vb. ( anlaşılmaz kod )
Dahası, montaj kodunda bulunan birçok öğe, makine diline çevrilirken kaybolur. Assembler'da kod oluştururken, programcı bellekteki konumlara adlar atayabilir , kodu hakkında yorum yapabilir, makro komutları kullanabilir veya montaj sırasındaki koşullar altında üretilen kodu kullanabilir. Tüm bu öğeler, montaj sırasında makine için kesinlikle gerekli olana indirgenir ve bu nedenle sökme sırasında açıkça görünmez: örneğin, bellekteki bir konum yalnızca sayısal adresiyle veya bir ofsetle işaretlenir .
Çoğu komut setinde bazı temel işlemler mevcuttur.
Ve çok zaman alması gereken işlemler için bir veya birkaç talimat içeren özel talimatlar vardır. Örnekler:
Makine talimatlarını kodlamaya ek olarak, montaj dilleri , veri bloklarını bir araya getirmek ve etiketleri veya etiketleri tanımlayarak talimatlara adres atamak için ek yönergelere sahiptir .
Her derlemede değerlendirilen sembolik ifadeleri tanımlayabilirler, bu da kodu okumayı ve anlamayı daha da kolaylaştırır.
Karmaşık kodların veya veri bloklarının oluşturulmasını kolaylaştırmak için genellikle yerleşik bir makro dile sahiptirler.
İşte bazı basit örnekler:
(Yorumlar noktalı virgülden sonra gelir)
str: .ascii "Bonjour\n" .global _start _start: movl $4, %eax movl $1, %ebx movl $str, %ecx movl $8, %edx int $0x80 movl $1, %eax movl $0, %ebx int $0x80 ;Compilation: ;as code.s -o code.o ;ld code.o -o code ;Execution: ;./codeBirkaç farklılıkla aynı örnekler aşağıda verilmiştir:
(Yorumlar noktalı virgülden sonra gelir)
section .data ; Variables initialisées Buffer: db 'Bonsoir', 10 ; En ascii, 10 = '\n'. La virgule sert à concaténer les chaines BufferSize: equ $-Buffer ; Taille de la chaine section .text ; Le code source est écrit dans cette section global _start ; Définition de l'entrée du programme _start: ; Entrée du programme mov eax, 4 ; Appel de sys_write mov ebx, 1 ; Sortie standard STDOUT mov ecx, Buffer ; Chaine à afficher mov edx, BufferSize ; Taille de la chaine int 80h ; Interruption du kernel mov eax, 1 ; Appel de sys_exit mov ebx, 0 ; Code de retour int 80h ; Interruption du kernelAssembly dilinin kullanışlılığı hakkında tartışmalar var. Çoğu durumda, derleyiciler - optimize ediciler , yüksek seviyeli dili , çok iyi bir programcı tarafından elle yazılmış montaj kodu kadar verimli çalışan koda dönüştürebilirken , yazmak, okumak ve bakımını yapmak çok daha kolay, daha hızlı (ve dolayısıyla daha az verimli) olabilir. .
Verimlilik 1950'lerde zaten bir endişe kaynağıydı, IBM 704 bilgisayarı için Fortran dil kılavuzunda (1956'da piyasaya sürüldü) bir iz bulduk : Fortran tarafından üretilen nesne programları neredeyse iyi programcılar tarafından yazılanlar kadar verimli olacak .
Bu arada derleyiciler muazzam bir ilerleme kaydetmişlerdir, bu nedenle programların büyük çoğunluğunun artık ekonomik nedenlerle yüksek seviyeli dillerde yazıldığı açıktır; ek programlama maliyeti, performansta beklenen iyileşmeden kaynaklanan kazançtan daha ağır basmaktadır.
Bununla birlikte, assembler kullanımının hala haklı olduğu bazı çok özel durumlar vardır:
Bazı derleyiciler, en yüksek optimizasyon seçenekleri etkinleştirilmediğinde , yüksek seviyeli dilde yazılan programları montaj koduna dönüştürür; her yüksek seviyeli talimat, bir dizi titizlikle eşdeğer montaj talimatıyla sonuçlanır ve aynı sembolleri kullanır; bu, hata ayıklama ve profil oluşturma amacıyla kodu görmenize olanak tanır ve bu bazen bir algoritmayı elden geçirerek çok daha fazla zaman kazandırabilir . Bu teknikler hiçbir koşulda nihai optimizasyon için saklanamaz.
Genellikle mikro denetleyicilere dayanan gömülü sistemlerin programlanması, montaj programlaması için geleneksel bir "niş" dir. Aslında, bu sistemler genellikle kaynaklar açısından çok sınırlıdır (örneğin, bir PIC 16F84 mikro denetleyici 1.024 14-bit komutla sınırlıdır ve RAM'i 136 bayt içerir) ve bu nedenle olanaklarından yararlanmak için çok optimize edilmiş düşük seviyeli programlama gerektirir. Bununla birlikte, donanımın evrimi, bu sistemlerin bileşenlerinin sabit bir maliyetle ve sabit bir güç tüketimiyle gittikçe daha güçlü hale gelmesine neden olur, bir programlama "herhangi bir montajcıya" yapılan yatırım, çalışma saatleri içinde çok daha pahalı hale gelir ve bu durumda bir sorun haline gelir . çabayla anlamsız. Tipik olarak, assembly programlama çok daha uzun, daha hassastır (çünkü programcı, üst düzey bir dilde uzak durduğu geliştirmenin tüm mikro ayrıntılarını hesaba katmak zorundadır) ve bu nedenle, yüksek düzeyli dil programlamasından önemli ölçüde daha pahalıdır. Bu nedenle, yalnızca başka türlü yapılamayacak durumlar için ayrılmalıdır.
Çoğu derleyici makro dilini destekler . Bu, daha mantıklı ve daha az sıkıcı bir sıraya sahip olmak için birkaç talimatı bir araya getirme sorunudur.
Örneğin (Microsoft MASM assembler'da ):
MS-DOS altında bir karakter görüntüleyen bir makrodur . Örneğin aşağıdaki gibi kullanılacaktır:
Ve üretecek:
mov dl,"X" mov ah,2 int 21hSözde talimat, özel bir makro talimatı türüdür. Montaj yazılımının editörü tarafından önceden tanımlanmıştır ve işlevi, eksik bir işlemci talimatını taklit etmek veya mevcut bir talimatın kullanımını kolaylaştırmaktır. Sözde talimat, gerçek bir işlemci talimatına çok benzer bir ada sahip olduğundan, ilk bakışta onu ikincisinden biriyle karıştırmak mümkündür. Örneğin, bir RISC işlemcisi , programdaki belirli bir noktaya atlamanıza ve onu sırayla yürütmeye devam etmenize izin veren bir JMP talimatına sahip olmayabilir. Bu durumda, yazılım editörü programcısı için bir talimat “mov tarafından montaj sırasında değiştirilecek sahte talimat“JMP <parametre>”, yaratmış olacaktır pc , <parametre>”, pc olmak üzere olmanın işaretçi talimat idam edildi. Başka bir örnek, bir “PUSH <parametre>” sözde talimat adresinde <parametre> bir depolama ile değiştirilecektir tarafından işaret sp ikinci, önceden-Azaltma ile sp olan yığın işaretçi bir işlemci.
RISC mikro işlemcilerinde veya ARM ailesindekiler gibi mikro denetleyicilerde , değerine bakılmaksızın herhangi bir anlık sabitin bir kayda yüklenmesine izin veren bir montaj talimatı yoktur. Çoğu derleyici, bu tür bir yüklemeyi yürütme süresi açısından mümkün olan en verimli şekilde mümkün kılan ve bu görevi programcıya ayıran bir sözde talimata sahiptir.
Yapısal programlama desteği: Yapısal programlamanın bazı öğeleri, yürütme akışını kodlamak için Dr. HD Mills tarafından entegre edilmiştir (Mart 1970) ve S / 360 makro birleştiricisini if / else / endif ve hatta akış kontrol blokları ile genişleten Marvin Kessler tarafından uygulandı. Bu, montaj kodunda atlama işlemlerinin kullanımını azaltmanın veya ortadan kaldırmanın bir yoluydu .