Assembly dilini öğrenmeye değer mi? [kapalı]


97

ASM öğrenmeye hala değer mi?

Biraz biliyorum ama gerçekten kullanmadım ya da doğru şekilde öğrenmedim çünkü assembler'da yapmayı öğrendiğim her şeyi 1 / 10'da C veya C ++ gibi bir dille yapabilirim. Öyleyse, ASM'yi gerçekten öğrenmeli ve kullanmalı mıyım? Profesyonel olarak bana bir faydası olacak mı? Becerikliliğimi artıracak mı? Kısacası, beni daha iyi bir programcı yapar mı?

Not: FASM veya NASM gibi düşük seviyeli montajdan bahsediyorum ve HLA (High-Level Assembler) gibi bir şeyden değil .


2
Montaj dilinin bir işlemci / denetleyiciye bağlı olduğunu unutmayın.
rmflow

7
Çapraz platform olmadığını mı söylüyorsun? !!
ApprenticeHacker


2
Tamam, yani her işlemci için farklı bir montaj dili var ??? !!!!!!!!!!!!!!!!!!!!!!!!!
ApprenticeHacker

4
Her işlemci ailesi için farklı bir montaj dili . 386 kodu, Intel ve AMD'nin teklifleri de dahil olmak üzere daha sonraki herhangi bir x86 işlemcisinde çalışır - ancak bazı özellik kümeleri mülkiyet uzantılarıdır. Dil bu ekstra talimatlar için aynıdır ancak ortaya çıkan ikili taşınabilir olmayacaktır.
spraff

Yanıtlar:


109

Kip Irvine'in kitabından öğrendim . Onun (alakasız) kütüphanelerinin (adil) eleştirilerini görmezden gelirseniz, bunu dilin kendisine iyi bir giriş olarak önerebilirim - ancak gerçekten ilginç şeyler için internette takıntılıları avlamanız gerekir.

Alt seviyelerde ne olduğunu anlamanın yararlı olduğunu düşünüyorum. Derleyiciyi araştırırken, cpu boru hattı oluşturma, dal tahmini, önbellek hizalama, SIMD, talimat yeniden sıralama vb. Hakkında bilgi edineceksiniz. Bunların bilgisi, daha iyi yüksek seviye kod yazmanıza yardımcı olacaktır.

Dahası, geleneksel akıl, çoğu zaman montajı elle optimize etmeye çalışmak değil, derleyicinin bu konuda endişelenmesine izin vermektir. Derleyicilerin ürettiği çarpık şeylerin bazı örneklerini gördüğünüzde, geleneksel bilgeliğin neden geçerli olduğunu daha iyi anlayacaksınız.

Örnek: LFSR'ler, taşıma ile döndür komutuyla hızlı çalışır, bunun gibi belirli durumlarda, derleyicinin anlamaya yetecek kadar akıllı olup olmadığını keşfetmek kadar assembler sürümünü yazmak kadar kolaydır. Bazen derleyicinin bilmediği bir şeyi bilirsiniz .

Ayrıca, güvenlik konularını anlamanızı da artırır - yazma veya çalıştırma, yığın taşmaları vb.

Bazı eşzamanlılık sorunları, yalnızca talimat başına seviyede neler olduğunun farkında olduğunuzda görünür hale gelir.

Tam kaynak koduna sahip değilseniz, bazen hata ayıklama sırasında yararlı olabilir.

Meraklılık değeri var. Yine de sanal işlevler nasıl uygulanır? Assembler'da DirectX veya COM programları yazmaya çalıştınız mı? Büyük yapılar nasıl döndürülür, çağıran işlev onlar için bir alan sunar mı yoksa tam tersi mi?

Sonra, grafik donanımı için özel montaj dilleri vardır, ancak gölgelendirici dilleri birkaç yıl önce yüksek seviyeye çıkmış olsa da, bir problem hakkında farklı bir şekilde düşünmenizi sağlayan her şey iyidir.


7
İyi yazılmış cevap +1. Öğrenme ve kullanma iki farklı şeydir, öğrenmek iyi bir fikirdir, ne zaman / ne zaman kullanılacağı deneyimle birlikte gelir.
old_timer

Bir örnek vermek gerekirse, Linus Torvalds kodunda hata ayıklamak için bir çözücü kullanıyor, bu yüzden x86 montajı konusunda iyi bilgiye sahip olduğunu düşünüyorum.
Ivanzinho

55

Pek çok insanın, montajı öğrenmeye ihtiyacınız olduğunu / öğrenmeniz gerektiğini söyleyerek atlamasını ilginç buluyorum. Bana göre soru ne kadar montaj bilmeniz gerektiğidir Assembly'yi bir programlama dili gibi bilmeniz gerektiğini düşünmüyorum, yani herkesin assembly'de bir program yazabilmesi gerektiğine inanmıyorum, diğer yandan onu okuyup gerçekte ne olduğunu anlayabilmek araçlar (bu, montajcıdan daha fazla mimari bilgisi gerektirebilir) yeterlidir.

Kesinlikle derleme yazamam (yani derlemede önemsiz olmayan herhangi bir kod parçasını yazamam), ancak onu okuyabilirim ve gerçek donanım mimarisi bilgisiyle birlikte ve kullanılan çağırma kuralları performansı analiz etmek için yeterlidir ve Bu derlemenin kaynağının hangi C ++ kodu parçası olduğunu belirleyin.


4
Yani temel push, pop, mov ve invoke komutlarını öğrenmem gerektiğini mi söylüyorsun ?
ApprenticeHacker

10
Katılıyorum, montaj bilgisine duyulan ihtiyaç büyük ölçüde hangi programlama dalıyla çalıştığınıza bağlıdır. Web / masaüstü / veritabanı? Assembler'ı unutun. Bilgisayar oyunları ve grafikler? Biraz kullanışlı olabilir. İşletim sistemi geliştirme mi yoksa gerçek zamanlı gömülü sistemler mi? Bu bir zorunluluktur. Ve bunun gibi.
Lundin

1
Diğer cevapları yanlış sunuyorsunuz - kimse toplantıya ihtiyacınız olduğunu / öğrenmeniz gerektiğini söylemiyor ; sadece soruya göre yararlı veya değerlidir. Cevabınız yine de alakalı.
Luc Danton

1
@burningprodigy: İnanıyorum ki, kullandığınız derleyicide komutların nasıl olduğuna dair bazı temel bilgilere (yani argümanların sırası ve benzerlerine) ve birkaç komutun çok temel bir anlayışına sahip olmanız gerektiğidir. veya bir mağaza. Daha sonra, bir montaj parçasına bakmanız gerekirse, talimatların her birini anlamak için bir referans kullanabilirsiniz ve bunu yaparken ihtiyacınız olan temel bilgileri öğrenmeye başlayacaksınız.
David Rodríguez - dribeas

1
Katılıyorum. Özellikle sadece montajı bilmek, modern CPU'larda verimliliği değerlendirme konusunda size en iyi ihtimalle çok az şey kazandıracaktır. Hedef buysa, bilgisayar mimarilerinin temellerinden adil bir pay alan biraz temel montaj bilgisi çok daha kullanışlıdır. Çoğu zaman derlemeye ihtiyacım olan optimize edilmiş programların dökümlerine bakmak ya da eğlence için (yani güvenlik malzemeleri, mini çekirdek yazmak, ..). Ancak montaj bilgisi nedeniyle bazı tasarım kararlarını en son ne zaman değiştirdiğimi hatırlayamıyorum.
Voo

28

Evet - C ve C ++ geliştiricileri için derlemeyi öğrenmenin birincil nedeni, C ve C ++ kodunun başlığı altında neler olup bittiğini anlamaya yardımcı olmasıdır. Aslında montajda kod yazacağınızdan değil, ancak verimliliğini değerlendirmek için kod demontajına bakabileceksiniz ve farklı C ve C ++ özelliklerinin nasıl daha iyi çalıştığını anlayacaksınız.


24

Pek çok farklı paradigmadan birçok farklı dil öğrenmeye değer. Java, C ++, C # ve Python öğrenmek, hepsi aynı paradigmanın örnekleri olduğundan sayılmaz.

Assembly, tüm dillerin kökünde (yani köke yakın) olduğu için, birincisi assembly öğrenmenin faydalı olduğunu söylüyorum.

Sonra tekrar, işlevsel bir programlama dili, mantık programlama, komut dosyası dilleri, matematik tabanlı diller öğrenmeye değer. Sadece çok zamanınız var, bu yüzden seçmek ve seçmek zorundasınız.


Ve sonra, sonunda hepsini öğrendiğinizde ve neler olup bittiğine dair bir anınızın olduğunu düşündüğünüzde, J'yi keşfedersiniz .
Micha Wiedenmann

4

Bazen sahip olduğunuz tek şey "hatanın ASM dökümü" olduğundan, ASM'yi bilmek hata ayıklama sırasında da yararlıdır.


2

Yapmayı planladığınız şey için herhangi bir faydanız var mı? Şu anda yaptığınız veya yapmayı planladığınız şeyde size herhangi bir şekilde yardımcı olacak mı? bunlar kendinize sormanız gereken iki soru, bunların cevabı sorunuzun cevabıdır.

Daha genel bir anlamda, evet, bence asm (x86 veya kol gibi bir şey) öğrenmeye değer olduğunu söyleyebilirim, size ne kadar iyi hizmet ettiği, neyi programladığınıza ve nasıl hata ayıkladığınıza bağlıdır.


2

Ulaşmak istediğiniz programlama seviyesine bağlı olarak. Hata ayıklayıcılarla çalışmanız gerekiyorsa EVET. Derleyicilerin nasıl çalıştığını bilmeniz gerekiyorsa YES. Herhangi bir derleyici / hata ayıklayıcı CPU'ya bağlıdır, bu nedenle çok iş vardır, sadece x86 ailesinin ne kadar büyük ve eski olduğunu kontrol edin.


CPU ailesine bağımlı demek istediniz mi?
Romeno
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.