Saya telah melakukan ini berkali-kali dan terus melakukan ini. Dalam hal ini di mana tujuan utama Anda adalah membaca dan bukan menulis assembler, saya rasa ini berlaku.
Tulis pembongkaran Anda sendiri. Bukan untuk tujuan membuat pembongkaran terhebat berikutnya, yang ini hanya untuk Anda. Tujuannya adalah mempelajari set instruksi. Apakah saya sedang mempelajari assembler di platform baru, mengingat assembler untuk platform yang pernah saya kenal. Mulailah dengan hanya beberapa baris kode, tambahkan register misalnya, dan ping pong-ing antara membongkar keluaran biner dan menambahkan instruksi yang semakin rumit di sisi masukan Anda:
1) pelajari set instruksi untuk prosesor tertentu
2) pelajari nuansa bagaimana menulis kode dalam assemble untuk prosesor tersebut sehingga Anda dapat menggoyangkan setiap bit opcode dalam setiap instruksi
3) Anda mempelajari set instruksi lebih baik daripada kebanyakan insinyur yang menggunakan set instruksi itu untuk mencari nafkah
Dalam kasus Anda ada beberapa masalah, saya biasanya merekomendasikan set instruksi ARM untuk memulai, ada lebih banyak produk berbasis ARM yang dikirim hari ini daripada yang lain (termasuk komputer x86). Tetapi kemungkinan Anda menggunakan ARM sekarang dan tidak cukup mengetahui assembler untuk menulis kode startup atau rutinitas lain yang mengetahui ARM mungkin atau mungkin tidak membantu apa yang Anda coba lakukan. Alasan kedua dan yang lebih penting untuk ARM pertama adalah karena panjang instruksi berukuran tetap dan selaras. Membongkar instruksi panjang variabel seperti x86 bisa menjadi mimpi buruk sebagai proyek pertama Anda, dan tujuannya di sini adalah untuk mempelajari set instruksi untuk tidak membuat proyek penelitian. ARM ketiga adalah set instruksi yang dilakukan dengan baik, register dibuat sama dan tidak memiliki nuansa khusus individu.
Jadi, Anda harus mencari tahu prosesor apa yang ingin Anda gunakan. Saya sarankan msp430 atau ARM pertama, lalu ARM pertama atau kedua kemudian x86 chaos. Apa pun platformnya, platform apa pun yang layak digunakan memiliki lembar data atau manual referensi pemrogram yang bebas dari vendor yang menyertakan set instruksi serta pengkodean opcode (bit dan byte dari bahasa mesin). Untuk tujuan mempelajari apa yang dilakukan compiler dan bagaimana menulis kode yang tidak harus dipermasalahkan oleh compiler, ada baiknya untuk mengetahui beberapa set instruksi dan melihat bagaimana kode tingkat tinggi yang sama diimplementasikan pada setiap set instruksi dengan setiap compiler dengan setiap optimasi pengaturan. Anda tidak ingin mengoptimalkan kode Anda hanya untuk mengetahui bahwa Anda telah membuatnya lebih baik untuk satu kompiler / platform tetapi jauh lebih buruk untuk yang lainnya.
Oh untuk membongkar set instruksi panjang variabel, alih-alih hanya memulai dari awal dan membongkar setiap kata empat byte secara linier melalui memori seperti yang Anda lakukan dengan ARM atau setiap dua byte seperti msp430 (msp430 memiliki instruksi panjang variabel tetapi Anda masih bisa mendapatkannya akan linier melalui memori jika Anda mulai dari titik masuk dari tabel vektor interupsi). Untuk panjang variabel, Anda ingin mencari titik masuk berdasarkan tabel vektor atau pengetahuan tentang bagaimana prosesor melakukan booting dan mengikuti kode dalam urutan eksekusi. Anda harus mendekode setiap instruksi sepenuhnya untuk mengetahui berapa banyak byte yang digunakan, maka jika instruksi tersebut bukan cabang tanpa syarat, anggap byte berikutnya setelah instruksi itu adalah instruksi lain. Anda harus menyimpan semua alamat cabang yang mungkin juga dan menganggap itu adalah alamat byte awal untuk instruksi lebih lanjut. Satu kali saya berhasil, saya membuat beberapa lintasan melalui biner. Mulai dari titik masuk, saya menandai byte itu sebagai awal instruksi kemudian diterjemahkan secara linier melalui memori sampai mengenai cabang tanpa syarat. Semua target cabang ditandai sebagai alamat awal dari sebuah instruksi. Saya membuat beberapa lintasan melalui biner sampai saya tidak menemukan target cabang baru. Jika suatu saat Anda menemukan mengatakan instruksi 3 byte tetapi karena alasan tertentu Anda telah menandai byte kedua sebagai awal instruksi, Anda mengalami masalah. Jika kode dibuat oleh kompilator tingkat tinggi, ini seharusnya tidak terjadi kecuali kompilator melakukan sesuatu yang jahat, jika kode memiliki assembler yang ditulis tangan (seperti misalnya game arcade lama), sangat mungkin bahwa akan ada cabang bersyarat yang tidak akan pernah terjadi seperti r0 = 0 diikuti dengan lompatan jika bukan nol. Anda mungkin harus mengeditnya dari biner untuk melanjutkan. Untuk tujuan langsung Anda yang saya asumsikan berada di x86, saya rasa Anda tidak akan mendapat masalah.
Saya merekomendasikan alat gcc, mingw32 adalah cara mudah untuk menggunakan alat gcc di Windows jika x86 adalah target Anda. Jika tidak mingw32 plus msys adalah platform yang sangat baik untuk menghasilkan kompilator silang dari binutils dan sumber gcc (umumnya cukup mudah). mingw32 memiliki beberapa keunggulan dibandingkan cygwin, seperti program yang jauh lebih cepat dan Anda menghindari cygwin dll neraka. gcc dan binutils akan memungkinkan Anda untuk menulis dalam C atau assembler dan membongkar kode Anda dan ada lebih banyak halaman web daripada yang dapat Anda baca yang menunjukkan kepada Anda bagaimana melakukan salah satu atau semua dari ketiganya. Jika Anda akan melakukan ini dengan set instruksi panjang variabel, saya sangat menyarankan Anda menggunakan set alat yang menyertakan disassembler. Pembongkaran pihak ketiga untuk x86 misalnya akan menjadi tantangan untuk digunakan karena Anda tidak pernah benar-benar tahu apakah itu telah dibongkar dengan benar. Beberapa di antaranya juga bergantung pada sistem operasi, tujuannya adalah untuk mengkompilasi modul ke format biner yang berisi petunjuk penandaan informasi dari data sehingga disassembler dapat melakukan pekerjaan yang lebih akurat. Pilihan Anda yang lain untuk tujuan utama ini adalah memiliki alat yang dapat dikompilasi langsung ke assembler untuk pemeriksaan Anda, lalu berharap bahwa ketika dikompilasi ke format biner, alat itu membuat instruksi yang sama.
Jawaban singkat (oke sedikit lebih pendek) untuk pertanyaan Anda. Menulis pembongkaran untuk mempelajari set instruksi. Saya akan mulai dengan sesuatu yang RISIKO dan mudah dipelajari seperti ARM. Setelah Anda mengetahui satu set instruksi yang lain menjadi lebih mudah untuk diambil, seringkali dalam beberapa jam, pada set instruksi ketiga Anda dapat mulai menulis kode hampir seketika dengan menggunakan lembar data / manual referensi untuk sintaks. Semua prosesor yang layak digunakan memiliki lembar data atau manual referensi yang menjelaskan instruksi hingga bit dan byte dari opcode. Pelajari prosesor RISC seperti ARM dan CISC seperti x86 cukup untuk merasakan perbedaannya, hal-hal seperti harus melalui register untuk semuanya atau dapat melakukan operasi secara langsung pada memori dengan register yang lebih sedikit atau tanpa register. Tiga instruksi operan versus dua, dll. Saat Anda menyetel kode tingkat tinggi, kompilasi untuk lebih dari satu prosesor dan bandingkan hasilnya. Hal terpenting yang akan Anda pelajari adalah bahwa betapapun baiknya kode tingkat tinggi ditulis, kualitas kompiler dan pilihan pengoptimalan membuat perbedaan besar dalam instruksi yang sebenarnya. Saya merekomendasikan llvm dan gcc (dengan binutils), keduanya tidak menghasilkankode yang bagus , tetapi mereka multi platform dan multi target dan keduanya memiliki pengoptimal. Dan keduanya gratis dan Anda dapat dengan mudah membuat kompiler silang dari sumber untuk berbagai prosesor target.