Assembly diline neden ihtiyacımız var?


27

Programı çoğunlukla yüksek dilde yazıyoruz. Bu yüzden okurken derleme diliyle karşılaştım. Böylece assembler assembly dilini makine diline dönüştürür ve derleyici de aynı dili yüksek dilde yapar. Assembly diline taşınması r1 r3, 5 taşı vb. Gibi komutlar buldum. Ve çalışmak oldukça zor. Öyleyse neden derleme dili oluşturuldu veya ilk dilden önce bile ilk gelen dil miydi? Neden bilgisayar mühendisliği sınıfımdaki montajcılar hakkında çalışıyorum?


13
Assembler insan tarafından okunabilen bir makine kodudur, bu yüzden.
Andrej Bauer

4
Çünkü donanıma yakın olduğumuzda işlerin nasıl yürüdüğünü bilmek önemlidir. Montaj yazdığımızda, bilgisayar donanımının düşük seviyede çalıştığını ve çalıştığını anlıyoruz. Bunun için en iyi yol, makine dili sıkıcı olduğundan ve derleme gibi okunamadığından derleme dilidir. Gerçekten sihirli bir kutu kullanmayı ve asla içine bakmamayı tercih eder misiniz?
Spencer Wieczorek

Yanıtlar:


32

"Öyleyse neden derleme dili oluşturuldu?"

Assembly dili, makine seviyesinde kodlama için tam bir kısa yol olarak oluşturuldu, böylece bütün gün 0s ve 1s saymanız gerekmez. Makine seviye kodu ile aynı şekilde çalışır: talimatlar ve işlenenler ile.

"Hangisi önce geldi?"

Wikipedia'da Programlama Dilleri Tarihi hakkında iyi bir makale var.

"Neden bilgisayar mühendisliği sınıfımdaki montajcılar hakkında çalışıyorum?"

Her ne kadar doğru olsa da, muhtemelen bir sonraki müşterinizin uygulamasını montajda yazarken kendinizi bulamazsınız, hala öğrenme montajından kazanılacak çok şey vardır.

Günümüzde, derleme dili temel olarak doğrudan donanım manipülasyonu, özel işlemci talimatlarına erişim veya kritik performans sorunlarını gidermek için kullanılır. Tipik kullanımlar aygıt sürücüleri, düşük seviye gömülü sistemler ve gerçek zamanlı sistemlerdir.

Assembly dili, bir programcı olarak alabileceğiniz işlemciye yakın olduğundan iyi tasarlanmış bir algoritma caydırıcıdır - montaj hız optimizasyonu için mükemmeldir. Her şey performans ve verimlilik ile ilgili. Assembly dili, sistemin kaynakları üzerinde tam kontrol sağlar. Bir montaj hattına benzer şekilde, tek bir değeri kayıtlara itmek için kod yazar, değerleri veya işaretçileri almak için doğrudan bellek adresleriyle uğraşırsınız. (kaynak: codeproject.com )


29

Assembly diline neden ihtiyacımız var?

Aslında, şu ana kadar ihtiyaç duyacağımız tek bir dil var; buna “makine dili” veya “makine kodu” denir. Bu gibi görünüyor:

0010000100100011

Bilgisayarınızın doğrudan konuşabileceği tek dil budur. Bir CPU'nun konuştuğu dildir (ve teknik olarak, farklı CPU tipleri farklı sürümleri konuşur). Aynı zamanda bakmak ve anlamaya çalışmak için berbat.

Neyse ki, her bir ikili bölüm belirli bir anlama gelir. Birkaç bölüme ayrılmıştır:

0010|0001|0010|0011

operation type  source register  other source  destination register
0010            0001             0010          0011

Bu değerler şunlara karşılık gelir:

operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3

Böylece bu işlem, 1 ve 2 numaralı kayıtlardaki sayıları ekler ve bu değeri 3 numaralı yazara koyar. Bu değerleri tam anlamıyla bir CPU'ya koyarsanız ve "git" diyerseniz, sizin için iki sayı ekleyecektir. "Çıkarma" işlemi, burada 0010 yerine 0011 ya da başka bir şey olabilir. Hangi değer olursa olsun CPU bir çıkarma işlemi yapar.

Böylece bir program şöyle görünebilir (bir şeyler açıklamak için makine kodunun bu özel versiyonunu yaptığım için onu anlamaya çalışmayın):

instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000

Bu okumak için emmek mi? Kesinlikle. Fakat CPU için buna ihtiyacımız var . Her makine kodu belirli bir eyleme karşılık geliyorsa, basit bir "İngilizce" kestirme yapmanıza izin verir ve programın ne yaptığını anladıktan sonra, onu gerçek bir ikili makine koduna dönüştürün ve çalışacak şekilde CPU'ya verin.

Bu yüzden, yukarıdaki orijinal talimatımız şuna benzeyebilir:

(meaning)      operation type  source register  other source  destination register
(machine code) 0010            0001             0010          0011
("English")    add             r1               r2            r3

Bu İngilizce sürümün makine koduyla tam olarak eşleştiğini unutmayın . Bu yüzden bu "İngilizce" nin bir satırını yazarken, gerçekten sadece dostça ve daha anlaşılır bir makine kodu yazıyoruz.

Evet, bu meclis dili. Bu yüzden var ve ilk başta yaratıldı.

Neden şimdi ihtiyaç duyduğumuzu anlamak için yukarıdaki cevapları okuyun, ancak bunu anlamanın anahtarı şudur: Üst düzey dillerin tek bir temsili yoktur, makine kodudur. Örneğin, C veya Python veya her neyse:

z = x + y

Bu, tıpkı yukarıdan eklememiz gibi, xkayıt 1'de, ykayıt 2'de olduğunu ve zkayıt 3'te sona ermesi gerektiğini varsayıyor . Peki ya bu satır?

z = x * 2 + (y / 6) * p + q - r

Bu satırı 16 bitlik ikilik olarak temsil etmeyi ve bir CPU'ya "git" demeyi deneyin . Yapamazsın Makine kodunun toplama, çıkarma ve aynı anda 4 veya 5 değişkenli başka bir işlemi gerçekleştirmek için tek bir işlem talimatı yoktur. Bu nedenle ilk önce bir makine kodu sırasına dönüştürülmelidir . Üst düzey bir dili “derlediğinizde” veya “yorumladığınızda” yaptığınız şey budur.

Bunu yapmak için programlarımız var, peki neden şimdi kuruluma ihtiyacımız var? Programınızın beklediğinizden daha yavaş çalıştığını ve nedenini bilmek istediğinizi varsayalım. Makine hattının bu satırdaki "çıktısı" na bakıldığında şöyle görünebilir:

1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010

Sadece bir satır Python yaptırmak için. Demek gerçekten hata ayıklamak istiyorsun? NO . Aksine, derleyicinizden size gerçekten kolayca anlayabileceğiniz formdaki çıktısını vermesini istersiniz; bu, bu makine koduna tam olarak uygun olan assembly dili sürümüdür . O zaman derleyicinizin aptalca bir şey yapıp yapmadığını anlayabilir ve düzeltmeye çalışabilirsiniz.

(@ Raphael'in tavsiyesine dair ek not: Aslında üçlü kodlar (üçlü temel) veya ondalık kodlar, hatta ASCII gibi ikili kodlar dışındaki şeylerle çalışan CPU'ları oluşturabilirsiniz.


2
Prensip olarak hiçbir şey, derlemeyle doğrudan çalışan bir CPU oluşturmamızı engellemez. ASCII sadece bu amaç için verimsiz bir kodlamadır, hepsi bu.
Raphael

Ekleme için teşekkürler. Katılıyorum, ancak meclisin amacını anlama amaçları için bunu atladım. Bir not ekleyeceğim.
Chris Cooper,

15

Öyleyse neden derleme dili oluşturuldu? Yoksa ilk dilden önce bile ilk gelen mi?

Evet, derleme, lehimleme telleri yerine, fiş panoları ve / veya çevirmeli şalterleri kullanan, metni girdi olarak kullanan ilk programlama dillerinden biriydi. Her bir derleme dili, doğrudan işlemci tarafından çalıştırılan opkodlara eşlenen talimatlar gibi yalnızca bir işlemci veya işlemci ailesi için oluşturuldu .

Neden bilgisayar mühendisliği sınıfımdaki montajcılar hakkında çalışıyorum?

Aygıt sürücülerini programlamanız veya derleyiciler yazmanız gerekiyorsa, gerekmediğinde bir işlemcinin nasıl çalıştığını anlamak önemlidir. Bunu anlamanın en iyi yolu montajda bazı kodlar yazmaktır.

Bir derleyicinin nasıl kod yazdığına bakarsanız, montajı bilmeden büyük olasılıkla anlaşılamayan konvansiyon çağırma seçeneklerini görmek yaygındır .

Bir hatayı çözmeniz gerekiyorsa ve sahip olduğunuz tek girdi bir çekirdek dökümü ise, derleme kodunu gösteren çıktıyı anlamak için derhal bilmeniz gerekir ve eğer şanslıysanız yüksek seviyeli bir dilde yüksek seviyeli ifadelerle desteklenirsiniz.


14

Daha az pratik bir özellik ekleyeyim. Bu (muhtemelen) tarihi bir sebep değil, bugün sizin için bir sebep.

Montaj (üst düzey dillerle karşılaştırıldığında) çıplak . Hiçbir şeyi (yazılımda yapılan) gizlemez ve göreceli olarak küçük, sabit bir işlem kümesine sahip olması anlamında basittir.

Bu kesin algoritma analizi için yardımcı olabilir. Anlambilim ve kontrol akışı o kadar basittir ki, tüm işlemleri saymak (veya beklenen sayı), kontrol akış grafiğini geçiş sayımları (olasılıklar) ile açıklamak suretiyle yapılabilir. Knuth bunu TAoCP kitaplarında büyük bir etki yapmakta ve var olan en katı algoritma analizlerinden bazılarını göstermektedir.

Fıkra: meslektaşım tam olarak bu amaç için Java Bytecode okumayı öğrendi.


4

Burada cevaplar var:

Tüm bu cevaplar şunları işaret eder:

  • Hız / Bellek Optimizasyonu
  • Makinenin nasıl çalıştığını anlama
  • Yani Noob Programcıları Uzman Oldu
  • Eğer derlemeyi biliyorsanız, Yüksek Lvl diliniz için nasıl derleyici yazacağınızı biliyorsunuzdur.
  • vb

1
Tüm bu görüşleri paylaşıyor musunuz? Tecrüben nedir? (Özellikle, "Yani Noob Programcıları Uzman Oldu" maddesi bana birkaç on yıl öncesine kadar modası geçmiş görünüyor.)
Raphael

Bu konuda bu kadar temkinli olmanız gerekmiyor. Sadece yinelenen soruya cevapları bağlıyorum Ve "Yani Noob Programcıları Uzman Oldu" burada en yüksek oyu aldı . Git onunla
tartış

1
Temkinli değilim, cevabınızı iyi bir cevap haline getirmenize yardımcı olmaya çalışıyorum (şu anda değil, sadece hiçbiri soruyu tam olarak cevaplayamayan birkaç kaynağa bağladığınız için). Kendi düşüncelerinizi karşılaştırmalı bir şekilde dahil etmek, bunun için ilk adımdır. (Düşünceyi dışlayıcı bir biçimde ilişkilendirerek, onlara bir değer verdiğinizi unutmayın; başka bir deyişle, görüşün neden bir cevap olarak (yeniden) bir cevap olarak kabul edildiğini tartışmanız gerekir.)
Raphael

Benim deneyimim, sadece bazı üst düzey programlama dillerine alıştıktan sonra, montaj dillerini öğrenmekle gerçekten nefret ediyorum ve mücadele ediyorum. Ve iyi programcılar olan veya önceden C ++ / C tanıyanları ASM'de programlayabildiklerini biliyorum. Benim
fikrimin cevabımda

İlk bağlantınız koptu.
Hola Soy Edu Feliz Navidad

1

Assembly = makine kodu
Bazı insanlar assembly dilinin CPU'nun anladığı sayısal kodlardan ne kadar farklı olduğu konusunda durmaya devam ediyor.
Bu (doğru olsa da) bu noktayı tamamen özlüyor.
Tercüme, derleme diliyle gittiğinde, sayısal (ikili, onaltılık değer) her ikisi de aynı şeydir.

Yere çevir veya düşür.
Eğer montajı tamamlarsan, gerçek bir bilgisayarın nasıl çalıştığını biliyorsun.
derz dolgu montajı şunları içerir:

  • Talimatları ve ne anlama geldiklerini öğrenmek (hah).
  • Talimat ne yaptığını anlamak, onlar neyi yok yapmak ve tüm yan etkiler .
  • Bir CPU'nun talimatları nasıl işlediğini öğrenme
    • Boru hattı nasıl çalışır?
    • Ne multiscalardemek
    • CPU çekirdeği nedir.
    • Önbellek nasıl çalışır?
    • Saymanın nasıl çevrileceğini anlama
    • Agner Fog'un öğretilerini öğrenme
  • Derleyicilerin nasıl kod ürettiklerini ve zaman zaman nasıl başarısız olduklarını anlamak.
  • İyi tanımlanmış ve çok özel sorunları optimize etmek.

Düzeneği taktıysanız, klavyenize bağlı olan işlemcinin nasıl çalıştığının neredeyse tamamen bir resmini görebilirsiniz.
Bu bilgiyi bir beyin cerrahının neşterini kullandığı gibi kullanmanız gerekir.

Kokuşmuş soyutlamalara
gerek duymazsınız Montajı (ve böylece ameliyat masasındaki CPU) takmadığınız sürece, RAM makinesinin soyutlamalarından (ya da Tanrı Turing makinesini dehşeti yasaklayan) manşetlerinden asla kurtulmazsınız .

L33t Hax0r 5k1llz
Meclisi ayrıca, 133thax0r'nin koruma planlarını yenmeyi nasıl başardığını anlamanıza yardımcı olur. (S: ASLR neden çalışmıyor ? Çünkü mov rax,fs:[28h]bunu bozuyor ).

% 0.1
Önemli olan montaj bilgisi değil, aynı zamanda o konuda çalışmakta olduğunuz makinenin bilgisidir.
Makineyi tanımak istiyorsanız, onu anlamalısınız ve bu, makinenin dilini konuşmak anlamına gelir.

Eğer yapmazsan, o zaman soyutlama ile sıkışmış demektir.
Bu bilim ve bu iyi, ama bu asla tam bir tablo değil.

Xhosa konuşmayı öğrenmek
guru seviyesini hedeflemediğiniz sürece, bildiklerinize en iyi şekilde uyursanız, bu tıklamalar hayatınızı zorlaştırır .

Çünkü eğlenceli.


1
Grok kelimesinin en sık karşılaştığım bir makalede kullanımı
rekciltnuc

-1

Bugüne kadar, önce IBM System 32'yi kullanarak RPG II'yi öğrendim ve daha sonra 370'ta APL'yi öğrendim. Tamamen boyut ve hız üzerindeydim. Mantram daha küçük ve hızlıydı. Assembly, orada en kompakt ve en hızlı dildir. Hem C hem de Assembly'de test programları hazırlardım. C programlarının 100 Kb gerektireceği durumlarda, eşdeğer bir Meclis programı genellikle 5 Kb'den az olacaktır. C derleyicisinin çıktısını okurken, parametreleri kontrol edip tekrar kontrol edecek kod bulacağım, hepsi oldukça zaman alan, nadiren ve egzotik ve gereksiz olan olası hataları için koşullu kontroller yapıyorlardı. ve yığınından.

Günümüzün programlama ortamında, kod yazma, ekstra güvenlik ve koruma sağlar. Bilgiyi doğrudan yüksek seviyeli dillere erişilemeyen bir donanım parçasından okuyabilmek, bir programın yalnızca bu makinede kullanılabileceği şekilde Derleme ile şifrelemenizi sağlar. Örneğin, ağ arabiriminin MAC adresini kullanarak bir kullanıcı anahtarını şifrelemek ve ardından bu anahtarı sabit sürücünün belirli bir kayıt dışı sektörüne park etmek, ardından sektörü kötü olarak işaretlemek, böylece diğer dosyaların üzerine yazamaz. Tabii ki sektörü kaybediyorsunuz, peki bu nedir? 2048 veya 4096 bayt milyarlarca veya trilyonlarca mı?


1
"Yüksek seviyeli dillere erişilemez" demek ne anlama geliyor?
David Richerby
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.