Montaj öğrenmeyi programlamada nasıl yardımcı olur? [kapalı]


132

Yaklaşık 10 yıldır daha yüksek seviyelerde programlama yapıyorum (Python, C #, VBA, VB.NET) ve neler olduğu konusunda "sıfır altında" tamamen sıfır bir anlayışa sahibim.

Öğrenme meclisinin faydalarının ne olduğunu ve programcı olarak bana nasıl yardımcı olacağını merak ediyorum. Bana daha yüksek seviye kodda yazdıklarım ile montajda olanlarla tam olarak arasındaki bağlantıyı gösterecek bir kaynak verebilir misiniz?


2
Eğer kodunuzun altında ne olduğunu gerçekten bilmek istiyorsanız, Intel işlemci el kitabına (yalnızca tanıtım kısmı) bakın: download.intel.com/products/processor/manual/325462.pdf . Belki bu istediğinden biraz daha derin, ama yararlı buluyorum.
superM

4
Başlığın altında özellikle .Net'te ne olduğunu bilmek istiyorsanız, CIL hakkında daha fazla bilgi edinmek isteyebilirsiniz. Bazı şekillerde montajlara benzer, ancak çok daha yüksek seviyededir. Bu nedenle, anlaşılması gerçek montajdan daha kolaydır.
svick,

6
Montajı öğrenirseniz for, bunun dışında değişkenleri bildirerek bir döngü optimize edeceğinizi düşünmekten kaçınabilirsiniz . örnek
StriplingWarrior

7
Aman Tanrım. Bana sadece 1 yıl önce üniversitede okuduğum Assembly dil sınıfını hatırlattın. Aldığımız basit şeylerin ne kadar basit yüzlerce, hatta daha küçük ve daha düşük seviyeli operasyonlarda çevrildiğini görmek şaşırtıcı. Bilgisayarlar olağanüstü makinelerdir.
Radu Murzea,

14
Öğrenme montajı, sizi tekrar HİÇ'den koruyan programlama dili kavramına derinden ve kalıcı bir sevgiyle bahsedecektir.
Shadur

Yanıtlar:


188

Çünkü gerçekten nasıl çalıştığını anlayacaksınız .

  • İşlev çağrılarının ücretsiz olmadığını ve neden çağrı yığınının taşabileceğini (örneğin özyinelemeli işlevlerde) anlayacaksınız. Argümanların fonksiyon parametrelerine nasıl iletildiğini ve bunun nasıl yapılabileceğini anlayacaksınız (hafıza kopyalamak, hafızaya işaret etmek).
  • Hafızanın ücretsiz olmadığını ve otomatik hafıza yönetiminin ne kadar değerli olduğunu anlayacaksınız. Hafıza sizin "sadece" sahip olduğunuz bir şey değildir, gerçekte yönetilmesi, ilgilenilmesi ve en önemlisi, unutulmaması gerekir (çünkü kendiniz serbest bırakmanız gerekir).
  • Kontrol akışının en temel düzeyde nasıl çalıştığını anlayacaksınız.
  • Yüksek seviye programlama dillerindeki yapıları daha çok takdir edeceksiniz.

Bunun sebebi, C # veya Python'da yazdığımız her şeyin, bir bilgisayarın gerçekleştirebileceği temel eylemler dizisine çevrilmesi gerektiğidir. Bir bilgisayarı sınıflar, jenerikler ve liste kavramaları açısından düşünmek kolaydır, ancak bunlar yalnızca üst seviye programlama dillerimizde mevcuttur.

Gerçekten güzel görünen, ancak işleri yapmanın düşük seviyeli bir yoluna çok iyi çevirmeyen dil yapıları düşünebiliriz. Gerçekten nasıl çalıştığını bilerek, işlerin neden böyle yürüdüklerini daha iyi anlayacaksınız.


12
"Üst seviye programlama dillerindeki yapıları daha fazla takdir edersiniz" için +1. Mükemmel cevap.
DevSolo

42
Bunun dışında, birkaç hafta süren Asm'den sonra, C'yi yüksek seviye bir programlama dili olarak düşünmeye başlayacaksınız. Düşük seviyeli gömülü cihaz geliştiricileriyle konuşmadığınız sürece, yüksek sesle söyleyerek çoğu insanın biraz çılgınca olduğunu düşünmenize neden olabilir.
Dan Neely,

19
@Dan: Bu terimlerin zaman içinde değişmesi biraz garip. 20 yıl önce, programlamaya başladığımda, birisine "Tabii ki C yüksek seviye bir dildir!" Bu açık olmalı ; standart bir yığın ve bellek erişim modeli sağlar. Ve bu da donanımdan uzak bazı ciddi soyutlamalar; Bir de düşük seviyeli dil, tüm belleğin izlemek zorunda kendiniz adreslerini, ya da bir şeyleri yapıyorsanız gerçekten fantezi, kendi yığın allocator yazın! Bu yüzden merak etmeliyim ki, bugün bir şeyi üst ya da alt seviye yapan kriterler nedir?
Mason Wheeler,

9
Yüksek seviye / düşük seviye bir ikili değildir. Hem montaj hem de Python'u kariyerinde yazan çok yönlü bir programcı C veya C ++ 'ı orta seviye bir dil olarak görebilir.
Russell Borogove

6
Bunlar anlaşılması gereken önemli şeylerdir, ancak bunlar kolayca soyut bir düzeyde ele alınmaktadır: örneğin, makine kullanım seviyesindeki bilgisayarların tanıtım kursunda. Ben bir montaj programcısı değilim ama eğer kendim söylersem onları iyi anlarım. Bazı SO cevaplarında, talimat önbellekleri ve boru hatları tartışmasını görüyorum ve bunlar gerçekten de başımı döndürüyor; fakat bu alt-öğretim seviyesi (şimdiye kadar) cevaplardan yoksundur. Peki, temel bir kursu almak yerine, montaj programlamasını öğrenmenin faydası nedir?
alexis

33

Genel olarak “başlık altında neler” olduğunu ve işaretçilerin nasıl çalıştığını ve kayıt değişkenlerinin ve mimarinin (bellek tahsisi ve yönetimi, parametre geçirme (değer / referansa göre), vb.) Anlamını daha iyi anlamanızı sağlayacaktır.

C ile hızlı bir bakış için bu nasıl?

#include <stdio.h>

main()
{
  puts("Hello World.");
  return(0);
}

derleme gcc -S so.cve montaj çıktısına bir göz atın so.s:

 $ cat so.s

    .file   "so.c"
    .section    .rodata
.LC0:
    .string "Hello World."
    .text
.globl main
    .type   main, @function
main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $16, %esp
    movl    $.LC0, (%esp)
    call    puts
    movl    $0, %eax
    leave
    ret
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
    .section    .note.GNU-stack,"",@progbits

2
+1: İyi bahşiş! C derleyicisinin ne yaptığını bakarak çok şey öğrenebilirsiniz.
Giorgio,

8
... SOS kasıtlı mıydı? (yardım çağrısı, vb.)
Izkata

1
@ Izkata ha ha .. iyi biri, bunu farketmedim bile. Hızlı bir şekilde test etmek so.ciçin stackoverflow soruları için (benimki gibi so.py, so.awkvb.) Standart bir dosyam var So.S .. :)
Levon

9
Derleme gcc -O -c -g -Wa,-ahl=so.s so.cyaparsanız C kodunun her satırı için montaj çıktısını görebilirsiniz. Bu, neler olduğunu anlamanızı biraz kolaylaştırıyor.
Mackie Messer,

1
Evet, çıktı uzun. 5:so.c5 satırının kodunu bulmak için arama yapabilirsiniz so.c.
Mackie Messer,

30

Sanırım aradığınız cevap burada: http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language

Makaleden bir alıntı:

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.

İşin aslı, daha karmaşık yüksek seviyeli diller olur ve ne kadar çok ADT (soyut veri türü) yazılırsa, bu seçenekleri desteklemek için daha fazla ek masraf söz konusudur. .NET, belki de MSIL şişmiş durumda. MSIL'i tanıdığınızı düşünün. Assembly dili burada parlıyor.

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.

Birleştirmede yazmak, işlemcinin ve belleğin "bir şeyler yapmak" için birlikte nasıl çalıştığını tam olarak anlamaktır. Uyarı alın, derleme dili şifreli ve uygulamaların kaynak kod boyutu üst düzey dilden çok daha büyük. Ancak, bu konuda hiçbir hata yapma, zaman ve meclisin ustalık etme çabalarına katılırsanız daha iyi olacaksınız ve sahada göze çarpacaksınız.

Ek olarak, bu kitabı tavsiye ederim, çünkü bilgisayar mimarisinin basitleştirilmiş bir sürümü var: Bilgi İşlem Sistemlerine Giriş: Bit ve Girişlerden C ve Ötesine, 2 / e Yale N. Patt, Teksas, Austin Sanjay J. Patel. Urbana / Champaign'deki Illinois Üniversitesi


7
Bu, ASM'nin ne için kullanıldığını ve HLL'lerin şişirildiğinden bahseder, ancak ASM'yi öğrenmek için verilen tek özel avantaj süper hızlı kod yazmaktır. Evet, fakat ASM'yi öğrenseniz bile, bunu uygulamalara dahil etme olasılığınız ne kadardır? İş uygulamaları yazdığınızı varsayalım, donanım denetleyicileri veya aygıt sürücüleri değil.

+1 @notkilroy, link ve özellikle kitap önerisi için teşekkürler
Anthony

2
@Jon, gerçekten iş yazılımı geliştiriyorsan neden olacağını anlamıyorum. DBA veya derleyici yazıyorsanız veya sınırlı hafıza alanına sahipseniz bir şey var, ancak pek çok insanın sık sık dokunduğunu sanmıyorum. Optimizasyon çoğunlukla derleme tarafından gerçekleştirilir, bu da derlemede yazmanın en büyük nedenidir. Bazen bellek sızıntılarını izlerken yardımcı olur.
Brynne

İş uygulamaları geliştirme konusunda uzman olduğum için öncelikle bir 4GL kullanan SQL tabanlı uygulama geliştirme araçlarına güveniyorum. Bir uygulamayı hızlı bir şekilde prototiplememe ve bunu bir üretim sistemine göre özelleştirmeme izin veriyorlar. Nadiren çağrılabilir bir cfunc yazmam gerekiyor. Teslim etme ve değişiklik yapma zamanı dünyamdaki büyük faktörlerdir!
Frank R.

2
Ben kesinlikle katılmıyorum. Otomatik bir optimize edici, hızlı montaj oluşturmada bir insan programcısını sık sık yenebilir.
DeadMG,

22

Benim düşünceme göre, pek yardımcı olmuyor.

X86 montajını çok iyi biliyordum. Kurslarımda bir araya geldiğimde biraz yardımcı oldu, mülakat sırasında bir kez çıktı ve bir derleyicinin (Metrowerks) hatalı kod ürettiğini kanıtlamama yardımcı oldu. Bilgisayarın gerçekte nasıl çalıştığını görmek büyüleyici ve onu öğrendiğim için entelektüel olarak daha zengin hissediyorum. O sırada oynamak çok eğlenceliydi.

Ancak, bugünün derleyicileri derleme üretmek için hemen hemen her kod parçasındaki neredeyse herkesten daha iyidir. Bir derleyici yazmıyorsanız veya derleyicinizin doğru olanı yaptığını kontrol etmiyorsanız, muhtemelen öğrenerek zamanınızı boşa harcıyorsunuzdur.

C ++ programcılarının hala faydalı bir şekilde sordukları soruların derleme tarafından bilgilendirildiğini itiraf ediyorum. Örneğin: yığın veya yığın değişkenleri kullanmalı mıyım? değere veya const referansına göre mi geçmeliyim? Ancak hemen hemen tüm durumlarda, bu seçimlerin hesaplamalı zaman tasarrufu yerine kod okunabilirliğine dayalı yapılması gerektiğini düşünüyorum. (Örneğin, bir değişkeni bir kapsamla sınırlamak istediğinizde yığın değişkenlerini kullanın.)

Mütevazı önerim, gerçekten önemli olan becerilere odaklanmak: yazılım tasarımı, algoritma analizi ve problem çözme. Büyük projeler geliştirme deneyimiyle sezginiz artacaktır, bu da bence fikrinizi arttırmaktan daha değerlidir.


2
Katılmıyorum Belirli bir algoritma ve donanımın iyi bir şekilde anlaşılması hakkında kapsamlı bilgiye sahipseniz, genellikle derleyici tarafından güvenli bir şekilde oynatılması gerektiğinden daha iyi bir şekilde oluşturulmuş montaj kodu oluşturmak mümkündür. Kodunuzun derleme nasıl çevrileceğini bilmek de optimizasyon yaparken yardımcı olur.
Leo,

Optimizasyon bunu öğrenmenin nedeni değil. Bu açıdan, Neil G ile aynı fikirdeyim. Bununla birlikte, Neil G noktasını kaçırıyor; Gerçek makinenin altında yatan kavrayışının, üst seviyedeki dili nasıl kullandığı hakkında bilgi verdiğini değerlendiriyor.
Warren P

Tecrübelerime göre, bir algoritma uygulayarak, bir şeyleri ölçerek, optimize etmek için yollar bularak, daha iyi bir yolla vb. Vb. Kullanarak hızlı bir şekilde yapılır. tekrarlanan arıtma şansına sahip olmak.
gnasher729

Bu günlerde mecliste kodlanacak çok az vaka var, ancak nasıl çalıştığını bilmek çok değerli ve her şeyin nasıl çalıştığını bilmek isteyenler için çok yardımcı olacak. Mesela neden olduğunu bilmediğimde olayları takip etmekte zorlanıyorum .
Winger Sendon

21

Çalıştığınız sistemdeki bir seviye daha derine aşina olmalısınız. Bir seferde çok fazla aşağı atlamak fena değil, ama birinin istediği kadar yardımcı olmayabilir.

Yüksek seviyeli bir dilde çalışan bir programcı daha düşük seviyeli bir dil öğrenmelidir (C mükemmel bir seçenektir). Bilgisayara bir nesneyi başlatmasını veya bir karma tablo veya küme oluşturmasını söylerken kapakların altında neler olup bittiğini takdir etmek için montajın sonuna kadar gitmenize gerek yok, ancak kod yazabilmelisiniz onlar.

Bir java programcısı için, biraz C öğrenmek, bellek yönetiminde argümanları iletmek konusunda size yardımcı olacaktır. Kapsamlı java kütüphanesinin bazılarını C'ye yazmak, hangi Set uygulamasının ne zaman kullanılacağının (bir karma mı istiyorsun, ağaç mı?) Anlaşılmasının bir yoludur. Char * ile dişli bir ortamda çalışmak, String'in neden değişmez olduğunu anlamada yardımcı olacaktır.

Bir sonraki seviyeye alındığında ... AC programcısı montaj konusunda biraz bilgi sahibi olmalı ve montaj tipleri (gömülü sistemler mağazalarında bulunanlar) muhtemelen kapılar seviyesindeki şeyleri anlamada başarılı olacaktır. Kapılarla çalışanlar bazı kuantum fiziğini bilmeli. Ve bu kuantum fizikçileri, hala bir sonraki soyutlamanın ne olduğunu çözmeye çalışıyorlar.


1
Bir seviye daha derin doğru. Bir çift için gitmeye meyilliyim, ancak x86 derleme bilgisinin bir C # programcısı için MSIL okumakla karşılaştırıldığında çok fazla para istediği için yatırıma değdiğini varsayalım. Üniversitede montaj ve katı hal fiziği üzerine çalışan biri olarak, kapı tasarımı fiziğini bilmenin, elektronik dalında lisans diploması almamın yanı sıra bana hiç yardımcı olduğunu sanmıyorum.
Muhammad Alkarouri,

@MuhammadAlkarouri Şu anki sızıntı, çalışmaların uzunluğu, direnç ve ısının sistem üzerindeki etkisini anlama çizgileri boyunca düşünüyordum. Altta yatan “neden” anlayışı, kararların asgari iz ayrımı ve işletme toleranslarının kurallarından daha fazla olmasına yardım eder.

5

Bildiğiniz dillerde C veya C ++ 'dan bahsetmediğinizden beri. Montaj hakkında düşünmeden önce onları iyi bir şekilde öğrenmeyi şiddetle tavsiye ederim. C veya C ++, yönetilen dillerde tamamen şeffaf olan tüm temel kavramları verecektir ve bu sayfada belirtilen kavramların çoğunu, gerçek dünya projelerinde kullanabileceğiniz en önemli dillerden biriyle anlayacaksınız. Programlama becerilerinize gerçek bir katma değer. Lütfen montajın çok özel alanlarda kullanıldığını ve neredeyse C veya C ++ kadar kullanışlı olmadığını unutmayın.

Yönetilmeyen dillerin nasıl çalıştığını anlamadan önce meclise dalmamanız gerektiğini söyleyeceğim. Bu neredeyse zorunlu bir okumadır.

Daha da aşağı gitmek istiyorsanız montajı öğrenmelisiniz. Dilin her yapısının tam olarak nasıl oluşturulduğunu bilmek istiyorsunuz. Bilgilendirici ama çok farklı bir seviye karmaşıklığı.


5

Bir dili iyi tanıyorsanız, en azından bir seviye daha düşük bir teknoloji seviyesine sahip olmalısınız.

Neden? İşler ters gittiğinde, altta yatan mekaniğin bilgisi, garip problemlerin hatalarını ayıklamayı ve doğal olarak daha verimli kodlar yazmayı çok daha kolaylaştırır

Python'u (/ CPython) bir örnek olarak kullanmak, garip çökmelere veya düşük performansa başlarsanız, C kodunu nasıl hata ayıklayacağınıza ilişkin bilgi, ref-sayma bellek yönetimi yönteminin bilgisiyle aynı şekilde çok faydalı olabilir. Bu aynı zamanda bir C uzantısı olarak bir şey yazıp yazamayacağınızı bilmenize yardımcı olur ...

Bu durumda sorunuzu yanıtlamak için, montaj bilgisi gerçekten deneyimli bir Python geliştiricisine yardımcı olmaz (soyutlamada çok fazla adım vardır - Python'da yapılan herhangi bir şey birçok montaj talimatıyla sonuçlanır)

.. ama eğer C ile deneyimliyseniz, o zaman "bir sonraki seviyenin altında" (montaj) bilmek gerçekten yararlı olacaktır.

Benzer şekilde, eğer CoffeScript kullanıyorsanız, Javascript'i bilmek çok yararlıdır. Clojure kullanıyorsanız, Java / JVM bilgisi faydalıdır.

Bu fikir aynı zamanda programlama dillerinin dışında da çalışır - Assembly kullanıyorsanız, altta yatan donanımın nasıl çalıştığını bilmek iyi bir fikirdir. Bir web tasarımcısıysanız, web uygulamasının nasıl uygulandığını bilmek iyi bir fikirdir. Bir araba tamircisi iseniz, bazı fizik bilgisine sahip olmak iyi bir fikirdir.


3

Küçük bir c programı yazın ve çıktıyı sökün. Bu kadar. Bununla birlikte, İşletim Sisteminin yararına eklenen daha büyük veya daha az derecede "temizlik" koduna hazırlanın.

Montaj, kaputun altında neler olup bittiğini anlamanıza yardımcı olur, çünkü doğrudan bellek, işlemci kayıtları ve benzerleriyle ilgilidir.

Eğer işleri karmaşıklaştıran bir işletim sisteminin tüm karmaşıklığı olmadan gerçekten metale geçmek istiyorsanız, Arduino'yu assembly dilinde programlamayı deneyin .


3

Kesin bir cevap yok çünkü programcılar bir tür değil. Neyin altında gizlenenleri bilmeniz gerekiyor mu? Eğer öyleyse, o zaman öğren. Sadece meraktan öğrenmek istiyor musun? Eğer öyleyse, o zaman öğren. Size faydası olmayacaksa, neden rahatsız ediyorsun? Araba kullanmak için bir tamircinin bilgi seviyesine ihtiyacı var mı? Bir tamirci sadece bir otomobil üzerinde çalışmak için bir mühendisin bilgi seviyesine mi ihtiyaç duyuyor? Bu ciddi bir benzetme. Bir tamirci tuttuğu araçların derinliğini anlamak için dalmadan çok iyi, üretken bir tamirci olabilir. Müzik için aynı. Gerçekten iyi bir şarkıcı ya da oyuncu olmak için melodi, armoni ve ritmin karmaşıklığını ortaya çıkarır mısınız? Hayır. Bazı istisnai yetenekli müzisyenler, size Dorian ve Lidya modları arasındaki farkı söyleyebilmeleri için bir nota okuyamıyorlar. İstersen, tamam, ama hayır, ihtiyacın yok. Eğer bir web geliştiricisiyseniz, montajın düşünebileceğim hiçbir pratik kullanımı yoktur. Gömülü sistemlerde veya gerçekten özel bir şeyde iseniz, o zaman gerekli olabilir, ama olsaydı, bunu bilirdiniz.

İşte Joel'in yüksek seviyeli olmayan bir dile eğilmenin bu değerini alması: http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html


2

Aslına bakarsanız, sizin için muhtemelen en iyi olan şey, (benim bildiğim kadarıyla) hiçbir yerde bulunmayan bir sınıf olacaktı: Makine / assembler dili ve depolama adresleme kavramlarına kısa bir genel bakış ile derleyici yapımı boyunca bir turu birleştiren bir sınıf olacaktı. , kod oluşturma ve çalışma zamanı ortamları.

Sorun şu ki, C # veya Python gibi donanım seviyesinden uzak, yüksek seviyeli bir donanım diliyle, yaptığınız her hareketin binlerce makine talimatı olmasa bile yüzlerce olacağı gerçeğini gerçekten takdir etmiyorsunuzdur. Yüksek seviyeli bir dilin birkaç satırının geniş miktarda depolamaya nasıl erişilebileceğini ve değiştirilebileceğini anlama eğiliminde değiliz. “Kapakların altında” neler olup bittiğini tam olarak bilmek zorunda değilsiniz, ancak neler olup bittiğinin kapsamı ve meydana gelen şeylerin genel bir anlayışı için takdir almanız gerekiyor.


1

Bu soruya cevabım nispeten yakın zamanda gelişti. Mevcut cevaplar geçmişte ne söyleyeceğimi kapsıyordu. Aslında, bu hala en üst cevap olan - "üst seviye programlamadaki yapıları takdir ediyor" noktasında ele alınmaktadır , ancak bahsetmeye değer olduğunu düşündüğüm özel bir durum ...

Bir araştırmaya atıf yapan Jeff Atwood blog yazısına göre , anlaşmayı anlama, programlamayı anlamada kilit bir konudur. Öğrenci programcılar ya gösterimin sadece bilgisayarın izlediği adımları, nedenlerin sebeplerini temsil ettiğini ya da matematiksel denklemlere benzeyen yanıltıcı analojiler tarafından sürekli karıştırıldığını anlarlar.

6502 montajcısından aşağıdakileri anlarsanız ...

LDA variable
CLC
ADC #1
STA variable

Bu gerçekten sadece adımlar. Sonra bunu bir atama ifadesine çevirmeyi öğrendiğinde ...

variable = variable + 1;

Matematiksel bir denklem için yanıltıcı bir analojiye ihtiyacınız yok - haritalandırmak için zaten doğru bir zihinsel modeliniz var.

EDIT - elbette, aldığınız açıklama LDA variabletemelde ACCUMULATOR = variableise, bazı derslerden ve referanslardan tam olarak ne alıyorsanız, başladığınız yere geri dönersiniz ve hiç bir yardımı olmaz.

Birincisi Commodore Basic olan ikinci dilim olarak 6502 assembler'ı öğrendim ve o zamanlar çok fazla bir şey öğrenmedim - kısmen öğrenecek çok az şey olduğu için, fakat o zamandan daha sonra çok daha ilginç göründüğü için . Kısmen, kısmen, 14 yaşında bir inek olduğum için.

Yaptıklarımı yapmamı önermiyorum, ama çok basit bir assembler dilinde birkaç basit örnek çalışmanın daha yüksek seviyeli dilleri öğrenmeye değecek bir başlangıç ​​olacağını düşünün.


0

Derleyici bir yazar değilseniz ya da yüksek düzeyde optimize edilmiş bir şeye ihtiyacınız yoksa (veri işleme algoritması gibi), öğrenme montaj kodlaması size hiçbir fayda sağlamaz.

Montajda yazılan kodların yazılması ve bakımı çok zordur, bu nedenle assembler dilini çok iyi biliyor olsanız bile, başka yollar olmadıkça kullanmamalısınız.

" SSE için En İyileştirme: Bir Vaka Çalışması " makalesi, meclise girmeniz durumunda ne yapabileceğinizi gösterir. Yazar algoritmayı 100 devir / vektörden 17 devir / vektöre kadar optimize etmeyi başardı.


1
Yazar, C ++ sürümünde herhangi bir vektör talimatı veya intrinics kullanmadı. SSE kodu yazmak için assembler gerekmez.
gnasher729

@ gnasher729 Evet, ihtiyacınız yok. Ancak montaj ile program çok daha hızlı çalışabilir. Bir insan daha akıllı olabilir, sonuçta derleyici olarak (nadir durumlarda).
BЈовић

0

Montajda yazmanız, ayrıntıların miktarına bağlı olarak size hızda sihirli bir artış sağlamaz (kayıt tahsisi vb.) Muhtemelen şimdiye kadarki en önemsiz algoritmayı yazacaksınız.

Ek olarak, modern (70-80'lerden sonra okunan tasarımlı) işlemciler montajı size neler olduğunu (çoğu işlemcide) ne olduğunu bilmek için yeterli sayıda ayrıntı vermeyecektir. Modern PU (CPU ve GPU'lar), zamanlama talimatlarının yürüdüğü kadar karmaşıktır. Montajın (veya sözde montajın) temellerini bilmek, daha fazla bilgi sağlayacak bilgisayar mimarisi kitapları / kurslarını (önbellek, sıra dışı çalıştırma, MMU vb.) Anlamayı sağlayacaktır. Genellikle onları anlamak için karmaşık ISA'yı bilmeniz gerekmez (MIPS 5 oldukça popülerdir IIRC).

Neden işlemci anlamak? Neler olup bittiğini anlamanız size daha fazla bilgi verebilir. Diyelim ki matris çarpımını saf bir şekilde yazdınız:

for i from 0 to N
    for j from 0 to N
        for k from 0 to N
            A[i][j] += B[i][k] + C[k][j]

Amacınız için 'yeterince' iyi olabilir (4x4 matris ise, yine de vektör talimatlarıyla derlenebilir). Ancak, büyük dizileri derlerken oldukça önemli programlar var - bunları nasıl optimize edersiniz? Kodu derleme bölümüne yazarsanız, iyileştirmenin% birkaçına sahip olabilirsiniz (çoğu kişinin yapacağı gibi yapmazsanız - naif bir şekilde, kayıtları yetersiz kullanmak, sürekli belleğe yüklemek / saklamak ve daha sonra HL dilinde daha yavaş programa sahip olmak) .

Bununla birlikte, tho satırlarını tersine çevirebilir ve sihirli bir performans elde edebilirsiniz (neden? Bunu 'ev ödevi' olarak bırakıyorum) - IIRC, büyük matrisler için çeşitli faktörlere bağlı olarak 10x bile olabilir.

for i from 0 to N
    for k from 0 to N
        for j from 0 to N
            A[i][j] += B[i][k] + C[k][j]

Dedi - bunu yapmak mümkün derleyiciler üzerinde çalışıyoruz ( LLVM kullanarak herhangi bir şey için gcc ve Polly için grafit ). Hatta bunu dönüştürebiliyorlar bile (üzgünüm - bellekten engelleme yazıyorum):

for i from 0 to N
    for K from 0 to N/n
        for J from 0 to N/n
            for kk from 0 to n
                for jj from 0 to n
                    k = K*n + kk
                    j = J*n + jj
                    A[i][j] += B[i][k] + C[k][j]

Özetlemek gerekirse - bir montajın temellerini bilmek, işlemci tasarımından daha hızlı programlar yazmanıza olanak tanıyan çeşitli 'ayrıntılara' bakmanıza olanak tanır. RISC / CISC veya VLIW / vektör işlemci / SIMD / ... mimarileri arasındaki farkları bilmek iyi olabilir. Ancak x86 ile başlamayacağım çünkü oldukça karmaşık olma eğilimindedirler (muhtemelen ARM de) - bir sicilin ne olduğunu bilmek vb. Başlangıç ​​için IMHO yeterlidir.


Birkaç kod örneği vermeniz ilginç, ancak hiçbiri assembly dilinde değil.
Robert Harvey,

-1

Normalde hata ayıklama amacıyla ÇOK önemlidir. Sistem bir talimatın ortasına düştüğünde ve hatanın bir anlamı olmadığında ne yaparsınız? Yalnızca güvenli kod kullandığınız sürece .NET dilleri ile ilgili bir sorun daha azdır - sistem sizi her zaman kaputun altında olanlardan koruyacaktır.


-2

Kısacası bence cevabı eğer montajı öğrenirseniz daha fazlasını yapabilirsiniz. Montaj öğrenme, eğer montajı bilmiyorsanız, çalışması zor olan gömülü aygıt programlama, güvenlik penetrasyonu ve çevreleme, tersine mühendislik ve sistem programlama alanlarına erişim sağlar.

Program performansını arttırmayı öğrenmeye gelince, bu uygulama programlamasında şüphelidir. Çoğu zaman, hem diskte hem de ağda giriş / çıkış erişiminizi optimize etmek, GUI'yi nasıl oluşturduğunuzu optimize etmek, doğru algoritmaları seçmek, tüm çekirdeğinizi en üst düzeye çıkarmak gibi, bu optimizasyon seviyesine başlamadan önce odaklanılacak çok şey var. , en iyi donanım parası üzerinde çalışan satın alınan ve yorumlanan derlenmiş dillere geçiş yapabilirsiniz. Diğer son kullanıcılar için bir yazılım oluşturmazsanız, donanım bir programcının saatlik ücretine kıyasla, özellikle de bulut kullanılabilirliği bakımından ucuzdur.

Ayrıca, bir otobüse çarptıktan sonra kodunuzun okunabilirliği ile artan program yürütme hızını ölçmeniz, son sürümü yazdıktan bir yıl sonra değiştirmek için çıkmanız veya kod tabanına geri dönmeniz gerekir.


-3

Öğrenme algoritmalarını öneririm: sıralama, bağlantılı listeler, ikili ağaçlar, karma vb.

Ayrıca bkz. Bilgisayar Programlarının Yapısı ve Yorumlanması. Lisp.us birkaç ilkel komut, bir lisp ilkel ve bazı assembler provokatifleri).

Son olarak, assembler'ın ARM gibi kolay bir öğrenmeyi öğrenmeniz gerekiyorsa (ayrıca x86'dan yaklaşık 4 kat daha fazla cihazda kullanılır).


-8

Cevap, sadece kullandığınız dilin sonunda yorumlanmalı veya derlenmeli. Dil veya makine ne olursa olsun.

Dillerin tasarımı CPU'nun çalışma şeklinden kaynaklanmaktadır. Düşük seviye programlarda daha fazla, yüksek seviye programlarda daha az.

Sadece assembler'ı öğrenmekle kalmayacağınızı değil, assembler öğrenerek öğrendiğiniz CPU mimarisini bilmeniz gerektiğini söyleyeceğim.

Bazı örnekler: Bunun neden işe yaramadığını anlamayan ve hatta onu çalıştırdığınızda ne olduğunu bilmediğinden daha az sayıda java programcısı var.

String a = "X";
String b = "X";
if(a==b)  
    return true;

Küçük bir montajcı bilseydiniz, bir bellek konumunun içeriğinin, o konuma işaret eden işaretçi değişkenindeki sayı ile aynı olmadığını her zaman bilirsiniz.

Daha da kötüsü, yayınlanan kitaplarda bile, JAVA ilkelleri gibi bir şey okuyacaksınız, tamamen yanlış olan referansla değer ve nesneler tarafından geçirilir. Java'daki tüm argümanlar değere göre iletilir ve Java, nesneleri değerlere göre iletilen, yalnızca işaretçilerden oluşan işlevlere geçiremez.

Şimdi neler olup bittiğini açık bir şekilde birleştirirseniz, çoğu yazarın size sadece aldatıcı bir yalan verdiğini açıklamak o kadar karmaşık değildir.

Elbette, bunların etkileri incedir ancak daha sonra başınızı belaya sokabilir. Assembler olduğunu biliyorsanız sorun değil, hayır ise, uzun bir hata ayıklama gecesinde bulunuyorsunuz.


5
İlk paragrafınız tamamen yanlış: diller ASM'de derlenmemiş, Makine Kodunda derlenmiştir. Tercümanlar da ASM'de derlenmezler, kodu veya bayt kodunu yorumlarlar ve önceden derlenmiş makine kodunda çağrı fonksiyonlarını veya yöntemlerini kullanırlar.

6
Java hakkında iddia ettiğiniz her şey de yanlıştır. String a = "X"; String b = "X"; if( a==b) return true;Aslında derleyici == truedenilen bir şey yüzünden bununla başlıyor String interning. Diğer tüm Java ifadeleri de yanlıştır. Java'da işaretçiler yoktur , aynı şey olmayan referanslara sahiptir . Ve bunların hiçbirinin hiçbir şekilde assembler ile ilgisi yok. Java, ilkelleri değere ve referanslara göre değerlerden geçirir. Java'da işaretçiler yoktur, bu yüzden hiçbir şeyden geçiremezler. Yine tüm ASM bilmek ile ilgisi yoktur.

Ben her zaman daha üst seviyedeki dillerin ASM'ye değil, nesne (makine kodu) veya sözde kod olarak derlendiğini düşündüm.
Frank R.

@FrankComputer doğru, ancak makine kodu montaj talimatlarına çok 1: 1 eşlemesini bayt eder, böylece kolayca bir kod nesnesi ve ASM (kod çözme veya montaj) arasında çeviri yapabilirsiniz
dbr 14:12

2
@FrankComputer son kez gcc derlenmiş C / C ++ / fortran / java / ada / etc iç bayt koduna ve iç bayt koduna assembler baktım. Daha sonra makine koduna dönüştürmek için bu assembler kodunu bir assembler'a gönderir.
ctrl-alt-delor
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.