Apakah layak mempelajari bahasa assembly? [Tutup]

97

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).

ApprenticeHacker
sumber
2
Perhatikan, bahwa bahasa assembly terkait dengan prosesor / pengontrol.
rmflow
7
Maksudmu ini bukan lintas platform? !!
ApprenticeHacker
2
Oke, jadi ada bahasa assembly yang berbeda untuk setiap prosesor ??? !!!!!!!!!!!!!!!!!!!!!!!!!
ApprenticeHacker
4
Bahasa assembly yang berbeda untuk setiap keluarga prosesor. Kode 386 berjalan pada prosesor x86 yang lebih baru termasuk penawaran Intel dan AMD - tetapi beberapa set fitur merupakan ekstensi kepemilikan. The bahasa adalah sama untuk petunjuk ini tambahan tapi biner yang dihasilkan tidak akan portabel.
spraff

Jawaban:

109

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.

spraff
sumber
7
Jawaban yang ditulis dengan baik +1. Belajar dan menggunakan adalah dua hal yang berbeda, mempelajarinya adalah ide yang bagus, jika menggunakannya harus disertai dengan pengalaman.
old_timer
Sebagai contoh, Linus Torvalds menggunakan disassembler untuk men-debug kodenya jadi saya pikir dia memiliki pengetahuan yang baik tentang perakitan x86.
Ivanzinho
55

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.

David Rodríguez - dribeas
sumber
4
Maksud Anda, saya harus mempelajari perintah dasar push, pop, mov, dan panggil ?
ApprenticeHacker
10
Saya setuju, kebutuhan untuk mengetahui perakitan sangat bergantung pada cabang pemrograman apa yang Anda tangani. Web / desktop / database? Lupakan assembler. Game komputer dan grafik? Ini bisa jadi agak berguna. Pengembangan OS atau sistem tertanam waktu nyata? Itu adalah suatu keharusan. Dan seterusnya.
Lundin
1
Anda salah mengartikan jawaban lain - tidak ada yang mengatakan Anda perlu / harus belajar berkumpul; hanya saja itu berguna atau bermanfaat, sesuai pertanyaannya. Jawaban Anda masih relevan.
Luc Danton
1
@ Burningprodigy: Saya percaya bahwa Anda harus memiliki beberapa pengetahuan dasar tentang bagaimana instruksi dalam assembler yang Anda gunakan (yaitu apa urutan argumen dan sejenisnya), dan beberapa pemahaman yang sangat mendasar tentang beberapa perintah, apa beban atau toko. Kemudian jika Anda perlu melihat beberapa bagian perakitan, Anda dapat menggunakan referensi untuk memahami masing-masing instruksi, dan dalam melakukannya Anda akan mulai mempelajari dasar-dasar yang Anda butuhkan.
David Rodríguez - dribeas
1
Saya setuju. Terutama hanya mengetahui perakitan akan memberi Anda sedikit manfaat terbaik tentang menilai efisiensi pada CPU modern. Jika itu tujuannya sedikit pengetahuan dasar perakitan dengan adil berbagi dasar-dasar arsitektur komputer jauh lebih berguna. Seringkali saya membutuhkan assembly untuk melihat-lihat dump dari program-program yang dioptimalkan, atau untuk bersenang-senang (misalnya hal-hal keamanan, menulis mini kernel, ..). Tetapi saya tidak dapat mengingat kapan terakhir kali saya mengubah beberapa keputusan desain karena pengetahuan perakitan.
Voo
28

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.

gigi tajam
sumber
24

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.

David Hammen
sumber
Dan kemudian, ketika Anda akhirnya telah belajar mereka semua dan berpikir Anda memiliki sekilas apa yang sedang terjadi, Anda menemukan J .
Micha Wiedenmann
4

Mengetahui ASM juga berguna saat men-debug, karena terkadang yang Anda miliki hanyalah "ASM dump of the error".

ain
sumber
2

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.

Necrolis
sumber
2

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.

GJ.
sumber
Mungkin yang Anda maksud adalah keluarga CPU yang bergantung?
Romeno