Linuxda Assembler dili ilə proqramlaşdırma

Biz Univeristetdə Assembler dili keçirilir Düzdü keçilir demək olarsa…
Müəllim bizə laboratoriya işi verib 🙂 Kodu nə Linuxda Nə VVindovvsda işlədə bilmədim 🙂 Düzünə qalsa Assembler dilinin çətinliyini qəbul edirəm Amma bu dili öyrənməkdə qərarlıyam…
Birinci Linuxda Assembler kodları necə kompilyasiya olunur?
Mən iki cür edirəm
$as kod.asm -o program.o

$nasm -f elf kod.asm
ld -o kod kod.o
./kod
İnternetde çox axtarışlar elədim Orda nümunə şəklində yazılmış bir kod işlədi
Assembler dilində NASM MASM FASM nədir Kimsə Assembler dilində anlayışları var?
Heç kim məsləhət verməyə çalışmasın ki Assembler dilini öyrənmə Qərarlıyam bu dili öyrənəcəm Amma başlanğıcı edə bilmirəm


Yadda saxlama
Kateqoriya: Proqramlaşdırma . , . Qısa keçid.

Verilmiş cavablar və yazılan şərhlər (3 cavab var)

(00:59, 29/02/2012 ) #9771

İstəyirsən bu linklərə bir göz gəzdir.

http://stackoverflow.com/questions/3314919/compile-run-assembler-in-linux
http://www.forumacil.com/bilgisayar-bilgileri/172172-asm-dosya-uzantisi-assembly-programlama-kaynak-kodu.html

1Assembly Nedir ?
2 
3    Assembly Nedir ?
4 
5    Bir Çevirme Dili (Assembly Language) 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 “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 “Assembler” olarak adlandırılan faydalı bir program tarafından hedef bilgisayarın makine koduna çevrilir. (Bir çevirici bir derleyiciden (compiler) farklıdır, bu genellikle “mnemonic” ifadelerden makine komutlarına teke tek (izomorfik) çeviriler yapar.)
6    Assembly dili karmaşık programlar yazmak için kullanılan düşük seviyeli bir programlama dilidir. Assembly insanlar tarafından anlaşılması zor olan makina 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.
7    Assembly dilini makina koduna çeviren programlara assembler denir. Bir assembler'ı derleyiciden ayıran en önemli özellik bire bir 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.
8    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.
9    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.
10 
11 
12    1. Önemli Kavramlar
13 
14    1.1. Çevirici (Assembler)
15 
16 
17    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.
18    Ç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.
19    Daha sofistike (karmaşık) olan Yüksek Seviyeli çeviriciler aşağıda belirtilenler gibi dil özetlerini (abstractions) sağlarlar:
20 
21    • Yüksek kontrol yapıları
22 
23    • Yüksek seviyeli prosedür fonksiyon deklarasyonları ve talepleri
24 
25    • Yapılar/kayıtlar, birlikler, sınıflar ve takımlar dahil yüksek seviyeli özet veri türleri
26 
27    • Sofistike makro işleme
28 
29 
30 
31    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.
32 
33    1.2.Assembly (Çevirme) Dili
34 
35    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.
36    Örneğin; bir x86/IA-32 işlemci makine dilinde ifade edilmiş olan aşağıdaki ikili (binary) komutu yerine getirebilir:
37 
38    • Binary (ikili) : 10110000 01100001 (Altı haneli ondalık: 0xb061)
39    Muadil assembly dilinin sunumu daha kolay hatırlanır (daha fazla “mnemonic” tir ):
40 
41    • Mov al. 061h
42    Bu komut şunu ifade eder:
43 
44    • 61 (97 ondalık) altı haneli değeri “al” adı verilen işlemci kaydedicisinin içine naklediniz
45    “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.
46    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 dil 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.
47    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 itibariyle 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.
48    “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.
49 
50    1.3.Makine Dili
51 
52    Makine dili münferit ifadelerden (statements) veya komutlardan (instructions) tesis edilir. İşlem mimarisine bağlı olarak, verilen bir komut (emir)
53 
54    • aritmetik, adresleme, veya kontrol fonksiyonarı için belli kayıt yerlerini (registers)
55 
56    • belli hafıza yerlerini veya ofsetleri
57 
58    • İşlem faktörlerini (operands) yorumlamak için kullanılan belli adresleme şekillerini belirleyebilir.
59    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.
60    Pek çok komut grubunda yer alan bazı işlemler:
61 
62    • Taşıma
63    . 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)
64    . 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.
65    . donanım cihazlarından verileri okuyunuz ve yazınız.
66 
67 
68    • Hesaplama
69    . 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.
70    . 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.
71    . 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)
72 
73 
74    • Program akışının etkilenmesi
75    . programda başka bir yere atlayınız ve orada komutları yerine getiriniz.
76    . belli bir koşulun oluşması halinde başka bir yere atlayınız.
77    . başka bir yere atlayınız, ancak (bir çağrıya) dönüş noktası olarak bir sonraki komutun yerini saklayınız.
78    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:
79 
80    • Bir defada “stack” ( bir uçtan erişilebilir birbirini takip eden bellek yerlerinin bir bloğu) üzerinde pek çok kayıt yerlerini (registers) saklayan
81 
82    • Geniş bellek bloklarını taşıyan
83 
84    • Karmaşık (complex) ve/veya kayan nokta (floating point) aritmetiği (sinüs, kosinüs, karekök, vs.)
85 
86    • Bir atomik test et ve kur (test-and-set) komutunu yerine getiren
87 
88    • ALU’yu bir “register” (kayıt yeri) yerine bellekten gelen bir “operand” (işlem faktörü) ile birleştiren komutlar.
89 
90    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.
91    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.
92    2.Dil Tasarımı
93 
94    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.
95    Pek çok assembly dillerinde ortak olarak bulunan diğer elemanlar arasında aşağıdakiler yer alır:
96 
97    • 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.
98 
99    • 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.
100 
101    • Yorumlar. Pek çok bilgisayar dilleri gibi çevirici tarafından göz ardı edilen yorumlar assembly kaynak koduna eklenebilirler.
102 
103    • Makrolar. Pek çok çevirici bir takım argümanlara dayalı kod veya veri üreten dahili (embedded) bir makro dile sahiptirler. Makrolar tekrardan 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:
104 
105    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.
106    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.
107    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.
108    Pek çok assembly dilleri yukarıda belirtilen temel karakteristikleri paylaşırlar. Ancak, bazı olağandışı istisnalar bulunmaktadır, şöyle ki;
109 
110    • 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.
111 
112    • 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.
113 
114    • 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.
115    Büyük ölçekli assembly dilinin gelişmesindeki gerilemeden buyana daha sofistike çeviriciler için çok az görünür talep olmuştur.
116 
117 
118    3.Assembly Dilinin Kullanımı
119 
120    3.1.Tarihsel Perspektif
121 
122 
123    Tarihsel olarak tamemen 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.
124    İ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.
125 
126    3.2.Mevcut (günümüzdeki) Kullanım
127 
128 
129    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 aşikar performans etkisi olmaksızın yorumlanan dillerin kullanımı artırılmıştır).
130    Aslında günümüz uzman pratisyenlerin assembly dilini tercih edebileceği sadece çok az durum vardır: şöyle ki:
131 
132    • 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.
133 
134    • 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.
135 
136    • Ekstrem (aşırı) optimizasyonun gerekmesi halinde, örneğin; işlemci yoğun algoritma içindeki bir dahili döngü(loop) içinde.
137 
138    • 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.
139 
140    • Yüksek seviyeli dilin mevcut olmaması halinde, örneğin; bir yeni veya uzmanlaşmış işlemcide.
141 
142    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.
143    Ancak, assembly dili pek çok Bilgisayar Bilimi programlarında hala öğ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 hala ö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 itibariyle 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.
144 
145    3.3.Tipik Uygulamalar
146 
147 
148    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.
149    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.
150    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.
151    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.
152    4.İlgili Terminoloji
153 
154    • 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.
155    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.
156 
157    • Tüm makro işlem dahil bir çeviricinin çalıştığı hesapsal (computational) adım assembly (çevirme) zamanı olarak bilinir.
158 
159    • 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”).
160 
161    • 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.
162 
163 
164    5.Daha Fazla Bilgi
165 
166    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.
167    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.
168    İş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.
169    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.
170    Ö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.
171    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ı.
172    Assembly dil programlarını hatadan arındırmak (debug) için pek çok kişi bir benzetici (emulator) kullanır.
173    Aşağıda C, Visual Basic ve Assemblyde introduction programlarının farkı. Dil seviyesi yükseldikçe kod kısalmaktadır:
174 
175 
176    Assembly
177 
178    title Hello World Program (hello.asm)
179 
180    dosseg
181    .model small
182    .stack 100h
183 
184    .data
185    hello_message db 'Hello World!',0dh,0ah,'$'
186    .code
187    main proc
188    mov ax,@data
189    mov ds,ax
190 
191    mov ah,9
192    mov dx,offset hello_message
193    int 21h
194 
195    mov ax,4C00h
196    int 21h
197    main endp
198    end main
199 
200    C
201 
202    #include<stdio.h>
203 
204    int main()
205    {
206    printf("Hello World\n");
207    return 0;
208    }
209 
210    Visual Basic
211 
212    Sub Main()
213    MsgBox("Hello, World!") '
214    End Sub
215 
216 
217 
218    Not: Alıntıdır (Wikipedia)
Cavablamaq üçün sağ sütundan hesaba daxil olmaq lazımdır

(09:28, 29/02/2012 ) #9789

Linuxda assembler kodu aşağıdakı kimi kompilyasiya olunur:
əvvəlcə hər hansı mətn redaktorunda deyək ki gedit -də assembler proqramının mətn kodu yığılır, daha sonra assembler proqramı vastəsilə mətn koddan obyekt kod yaradılır, sonuncu mərhələdə isə obyekt koddan linker proqramı vastəsilə icraolunabilən ikili fayl – proqram alınır.

Misal üçün aşağıdakı kodu Linuxda kompilyasiya edək:

1.data
2 
3str:
4.ascii "Salam dunya \n\0"
5 
6 size:
7.word 14
8 
9.text
10 
11.globl _start
12 
13_start:
14 
15movl $4, %eax
16movl $1, %ebx
17movl $str, %ecx
18movl $14, %edx
19int $0x80
20 
21movl $1, %eax
22int $0x80

Əvvəlcə bu mətni init.s adlı faylda yadda saxlayırıq. Daha sonra terminal proqramını yükləyib həmin faylın yerləşdiyi qovluğa daxil oluruq.

ls əmri ilə qovluqda init.s faylının olduğuna əmin olaq:

[ferid@fedora tmp]$
[ferid@fedora tmp]$ ls
init.s
[ferid@fedora tmp]$
[ferid@fedora tmp]$

Daha sonra as assembler proqramı vastəsilə init.s faylından init.o adlı obyekt fayl yaradırıq

[ferid@fedora tmp]$
[ferid@fedora tmp]$ as init.s -o init.o
[ferid@fedora tmp]$

İndi ls əmri ilə işçi qovluqda olan faylların siyahısına baxsaq init.o adlı yeni faylın yarandığını görərik:

[ferid@fedora tmp]$
[ferid@fedora tmp]$ ls
init.o init.s
[ferid@fedora tmp]$
[ferid@fedora tmp]$

init.o obyekt fayldır. Ondan icraolunabilən (executable) proqram faylı almaq üçün ld linker proqramı vastəsilə onu linkləməliyik. Bunun üçün aşağıdakı əmri daxil edirik:

[ferid@fedora tmp]$
[ferid@fedora tmp]$ ld init.o -o init
[ferid@fedora tmp]$

Yenə ls ilə faylların siyahısına baxsaq yeni bir init faylın yarandığını görərik:

[ferid@fedora tmp]$
[ferid@fedora tmp]$ ls
init init.o init.s
[ferid@fedora tmp]$
[ferid@fedora tmp]$

init bizim proqram faylıdır. Onu icra eləmək üçün ./init əmrini daxil etmək lazımdır:

[ferid@fedora tmp]$
[ferid@fedora tmp]$ ./init
Salam dunya
[ferid@fedora tmp]$
[ferid@fedora tmp]$

Ekranda salam dunya sərti çap olundu. as və ld proqramlarına gəlincə, məncə onlar bir çox linux paylanmalarında sistem ilə birlikdə gəlir. Bunu yoxlamaq üçün terminaldan as -v və ld -v əmrlərini daxil edə bilərsən.

[ferid@fedora tmp]$ as -v
GNU assembler version 2.21.51.0.6 (x86_64-redhat-linux) using BFD version version 2.21.51.0.6-6.fc15 20110118
[ferid@fedora tmp]$
[ferid@fedora tmp]$ ld -v
GNU ld version 2.21.51.0.6-6.fc15 20110118
[ferid@fedora tmp]$

Nasm , fasm , masm bunlar da hamısı assembler proqramlarıdılar, hansı ki as proqramı kimi mətn fayldan obyekt fayl alır. Lakin as bunların içində ən geniş istifadə olunanıdır (GNU/Linux sistemlərində).

Assembler dilini örgənmək üçün düzgün kitab seçmək çox mühümdür. Mənim internetdə izlədiyim bir çox kitablar təəsüf ki, bu dili örgənməyə yaramır. Mən assembler dilini örgənmək üçün Jonathan Bartlett -in Programming from the Ground Up kitabını məsləhət görürəm. Assembler barəsində tanıdığım kitabların içərisində nəinki ən yaxşısıdır, heç ona bənzəyəni yoxdur. Olduqca sadə dildə yaddaşın strukturu, proqramın strukturu, prosessorun reqistrləri, prosessorun yaddaşa müraciət metodları v.s. ətraflı izah olunur, müvafiq proqram kodları ilə birlikdə. Bu kitab başlanğıc səviyyə üçün nəzərdə tutulub. Daha sonra professionallar üçün Intel 80386 Programmer’s Reference Manual pdf , http
məsləhət görülür.

Cavablamaq üçün sağ sütundan hesaba daxil olmaq lazımdır

(17:46, 29/02/2012 ) #9828

Cox sagolun cavablara gore 🙂

Cavablamaq üçün sağ sütundan hesaba daxil olmaq lazımdır

Bu suala aid öz sualım var:
Sual verin
Bu suala cavab vermək istəyirəm:
Cavab verin

Cavab verin


Cavab yazmaq üçün lütfən sağ sütundan və ya buradan hesaba daxil olun.

Üzvlər üçün giriş

Qeydiyyat
Login with Facebook

Elan qutusu

Son cavablar və şərhlər

SN cavab verdi - Kripto vergi (23 saat əvvəl)

Nicat97 cavab verdi - ilkaddimlar.com-a nə oldu? (8 gün əvvəl)

nicatmemmedli cavab verdi - Proqramlaşdırma - fəlsəfə (11 gün əvvəl)

nicatmemmedli cavab verdi - ilkaddimlar.com-a nə oldu? (11 gün əvvəl)

Software Developer cavab verdi - ilkaddimlar.com-a nə oldu? (21 gün əvvəl)

E. Hacı cavab verdi - Adsense ya görə VÖEN gəlir vergisi 20% istəyirlər (31 gün əvvəl)

Triste cavab verdi - Adsense ya görə VÖEN gəlir vergisi 20% istəyirlər (32 gün əvvəl)

E. Hacı cavab verdi - Adsense ya görə VÖEN gəlir vergisi 20% istəyirlər (32 gün əvvəl)

Triste cavab verdi - Adsense ya görə VÖEN gəlir vergisi 20% istəyirlər (32 gün əvvəl)

E. Hacı cavab verdi - Telefon almışam kamerasında ləkə var qaytarmaq istəyirəm, mağaza qaytarmır (33 gün əvvəl)

Software Developer cavab verdi - Rus dili yatırımı (33 gün əvvəl)

Cənab cavab verdi - Rus dili yatırımı (33 gün əvvəl)

Software Developer cavab verdi - Rus dili yatırımı (34 gün əvvəl)

Cənab cavab verdi - Rus dili yatırımı (34 gün əvvəl)

Software Developer cavab verdi - Rus dili yatırımı (34 gün əvvəl)

Software Developer - 615 xal

E. Hacı - 608 xal

Onar Alili - 526 xal

Dilsuz - 448 xal

Cabbarov Sübhan - 434 xal

Maqa - 346 xal

Ruslan Butdayev - 328 xal

Namiq Bəndəli - 297 xal

U.Tarlan - 244 xal

Meherremoff - 234 xal

Sistemə daxil olmuş 23307 sualdan 92%-dən çoxu cavablandırılmışdır.

Proyekt haqqında

E-Haci.net istehsalı. © 2010-2025