Apakah masih bermanfaat untuk mempelajari ASM ?
Saya tahu sedikit tentangnya, tetapi saya belum benar-benar menggunakannya atau mempelajarinya dengan benar karena semua yang saya pelajari di assembler dapat saya lakukan dalam 1/10 waktu dengan beberapa bahasa seperti C atau C ++. Jadi, haruskah saya benar-benar mempelajari dan menggunakan ASM? Apakah itu akan membantu saya secara profesional? Akankah itu meningkatkan akal saya? Singkatnya, apakah itu akan membuat saya menjadi programmer yang lebih baik?
Catatan: Saya berbicara tentang perakitan level rendah seperti FASM atau NASM dan bukan sesuatu seperti HLA (High-Level Assembler).
programming-languages
assembly
nasm
ApprenticeHacker
sumber
sumber
Jawaban:
Saya belajar dari buku Kip Irvine . Jika Anda mengabaikan kritik (adil) dari perpustakaannya (tidak relevan), saya dapat merekomendasikannya sebagai pengantar yang baik untuk bahasa itu sendiri - meskipun untuk hal - hal yang benar - benar menarik Anda harus mencari obsesif di internet.
Saya pikir akan berguna untuk memahami apa yang terjadi di tingkat yang lebih rendah. Saat Anda meneliti assembler, Anda akan belajar tentang pipelining cpu, prediksi cabang, penyelarasan cache, SIMD, pengurutan ulang instruksi, dan sebagainya. Pengetahuan tentang ini akan membantu Anda menulis kode tingkat tinggi yang lebih baik.
Lebih jauh, kebijaksanaan konvensional adalah untuk tidak mencoba mengoptimalkan perakitan secara manual pada sebagian besar waktu tetapi membiarkan penyusun mengkhawatirkannya. Ketika Anda melihat beberapa contoh dari hal-hal bengkok yang dihasilkan penyusun, Anda akan lebih memahami mengapa kebijaksanaan konvensional berlaku.
Contoh: LFSR bekerja cepat dengan instruksi rotate-with-carry, untuk kasus tertentu seperti ini, menulis versi assembler sama mudahnya dengan untuk mengetahui apakah compiler cukup pintar untuk mengetahuinya atau tidak. Terkadang Anda hanya mengetahui sesuatu yang tidak dimiliki kompilator.
Ini juga meningkatkan pemahaman Anda tentang masalah keamanan - tulis-atau-eksekusi, tumpukan overruns, dll.
Beberapa masalah konkurensi hanya menjadi jelas saat Anda mengetahui apa yang terjadi di tingkat per instruksi.
Terkadang ini berguna saat men-debug jika Anda tidak memiliki kode sumber yang lengkap.
Ada nilai keingintahuan. Bagaimana fungsi virtual diterapkan? Pernah mencoba menulis program DirectX atau COM di assembler? Bagaimana struktur besar dikembalikan, apakah fungsi pemanggil menawarkan ruang untuk mereka atau sebaliknya?
Lalu ada bahasa rakitan khusus untuk perangkat keras grafis, meskipun bahasa shader naik tingkat beberapa tahun yang lalu, apa pun yang memungkinkan Anda memikirkan masalah dengan cara yang berbeda itu bagus.
sumber
Saya merasa menarik bahwa begitu banyak orang yang langsung mengatakan ya, Anda perlu / harus belajar perakitan. Bagi saya pertanyaannya adalah berapa banyak perakitan yang perlu Anda ketahui? Saya tidak berpikir Anda harus mengetahui assembly seperti bahasa pemrograman, artinya saya tidak percaya bahwa setiap orang harus bisa menulis program dalam assembly, tetapi di sisi lain, bisa membaca dan memahami apa itu sebenarnya. artinya (yang mungkin membutuhkan lebih banyak pengetahuan tentang arsitektur daripada assembler) sudah cukup.
Saya pasti tidak dapat menulis rakitan (yaitu menulis bagian kode yang tidak sepele dalam rakitan), tetapi saya dapat membacanya dan bersama dengan pengetahuan tentang arsitektur perangkat keras yang sebenarnya, dan konvensi pemanggil yang digunakan sudah cukup untuk menganalisis kinerja, dan mengidentifikasi bagian dari kode C ++ yang merupakan sumber rakitan itu.
sumber
Ya - alasan utama mempelajari assembly untuk developer C dan C ++ adalah membantu memahami apa yang terjadi di balik kode C dan C ++. Ini bukan berarti Anda benar-benar akan menulis kode dalam perakitan, tetapi Anda akan dapat melihat pembongkaran kode untuk menilai efisiensinya dan Anda akan memahami bagaimana fitur C dan C ++ yang berbeda bekerja jauh lebih baik.
sumber
Mempelajari banyak bahasa berbeda, dari banyak paradigma berbeda, sangatlah bermanfaat. Mempelajari Java, C ++, C #, dan Python tidak dihitung, karena semuanya adalah contoh dari paradigma yang sama.
Karena assembly adalah akar (well, dekat dengan root) dari semua bahasa, saya sendiri mengatakan bahwa mempelajari assembly adalah bermanfaat.
Kemudian lagi, ada baiknya mempelajari bahasa pemrograman fungsional, pemrograman logika, bahasa skrip, bahasa berbasis matematika. Anda hanya punya banyak waktu, jadi Anda harus memilih.
sumber
Mengetahui ASM juga berguna saat men-debug, karena terkadang yang Anda miliki hanyalah "ASM dump of the error".
sumber
Apakah Anda menggunakannya dalam apa yang Anda rencanakan? apakah itu akan membantu Anda dengan cara apa pun dalam apa yang saat ini Anda lakukan atau rencanakan? Itu adalah dua pertanyaan yang harus Anda tanyakan pada diri Anda sendiri, jawabannya adalah jawaban atas pertanyaan Anda.
Dalam pengertian yang lebih umum, ya, menurut pendapat saya sangat berharga untuk dipelajari asm (seperti x86 atau arm), seberapa baik itu melayani Anda tergantung pada apa yang Anda pemrograman dan bagaimana Anda men-debugnya.
sumber
Tergantung pada level pemrograman mana yang ingin Anda capai. Jika Anda perlu bekerja dengan debugger maka YA. Jika Anda perlu mengetahui cara kerja kompiler, YA. Setiap assembler / debugger bergantung pada CPU, jadi ada banyak pekerjaan, cukup periksa keluarga x86 seberapa besar dan usianya.
sumber