Apakah ada buku kanonik tentang rakitan x86? [Tutup]

25

Ada banyak buku tentang kebaktian. Namun, mereka biasanya berurusan dengan ISA yang tidak saya pedulikan, seperti MIPS atau ARM. Saya tidak berurusan dengan arsitektur ini; tidak ada alasan bagi saya untuk mencoba mempelajarinya.

Tetapi buku-buku rakitan x86 tampaknya ... tidak ada.

Katakanlah misalnya saya sedang mencoba membuat kompiler mainan yang menghasilkan file Windows Portable Executable.

Apakah ada buku di luar sana yang merupakan standar de-facto untuk menggambarkan praktik terbaik, metodologi desain, dan informasi bermanfaat lainnya tentang perakitan x86? Bagaimana dengan buku itu yang membuatnya istimewa?

Billy ONeal
sumber
Berapa banyak pengalaman perakitan yang Anda miliki? Pernahkah Anda mencoba menggunakan GCC tanpa optimisasi untuk mengkompilasi program C sederhana ke dalam perakitan, lalu membalikkan rekayasa kode kembali ke program C?
Brian
10
@ Brian: Saya perlu tahu perakitan sebelum bisa melakukan itu.
Billy ONeal
Saya telah melihat salinan set instruksi x86. Ini adalah 2 volume, dan mungkin buku terbesar yang pernah saya lihat. Selamat bersenang-senang :)
AngryBird
2
Billy, Jika Anda tidak mengenal majelis sama sekali, maka salah satu dari mereka akan cukup baik untuk memulai dari untuk mendapatkan ide-ide umum. Majelis sangat dekat dengan arsitektur, sehingga petunjuk perakitan sangat mencerminkan desain khusus arsitektur. Saya mulai dengan perakitan x86, dan membaca "Bahasa Perakitan untuk Komputer Berbasis Intel" Kip Irvine. Buku itu sebenarnya dipasangkan dengan kelas online di community college. Saya tidak yakin pelajar seperti apa Anda, tetapi saya menemukan instruksi terbimbing paling baik untuk belajar.
Brian
@ Brian: Apa yang Anda maksud dengan "salah satu dari mereka"? Saya tidak mengerti apa "mereka" - buku apa pun? Adakah assembler? Ada ISA? Saya sudah bermain dengan assembler MIPS; Saya tidak dapat menemukan apa pun di x86.
Billy ONeal

Jawaban:

18

Saya menggunakan Bahasa Assembly untuk Prosesor x86 sebagai buku teks ketika saya masih kuliah dan merasa sangat mudah untuk dipahami. Saya memiliki edisi keempat yang lebih tua dan membandingkannya dengan edisi keenam dan tidak melihat banyak perubahan, jadi Anda mungkin bisa mengambil salinan yang lebih tua dengan harga murah. Orang-orang mengeluh tentang penggunaan perpustakaannya sendiri untuk I / O, tetapi dia memberi tahu Anda bagaimana melakukannya dengan cara "sulit" dalam bab-bab terakhir.

dboss
sumber
1
Buku yang sangat bagus!
Coder
Saya membaca buku Irvine edisi 5 ketika berjudul "Bahasa Perakitan untuk Komputer Berbasis Intel". :)
Brian
1
Saya pikir ini adalah saran yang sangat buruk, karena sebagian besar edisi kedua adalah khusus untuk sistem esoterik sendiri High Level Assembly yang pada dasarnya adalah versi bastardized dari C. Saya belum pernah membaca edisi pertama yang diterbitkan. Versi dos yang dapat Anda temukan di situsnya gratis dan belum pernah dipublikasikan adalah bacaan yang bagus . Ini juga sekitar 50% lebih lama dan tidak memiliki apa pun tentang HLA (yang merupakan total buang waktu).
Evan Carroll
1
@ EvanCarroll Saya bingung. Anda mengubah tautan ke buku yang salah, lalu mengkritik buku yang Anda ubah tautannya. Apakah itu tidak disengaja?
Merlyn Morgan-Graham
1
sepenuhnya kesalahan saya. @ MerlynMorgan-Graham baik pada Anda untuk menangkap dan memperbaikinya.
Evan Carroll
9

Seni Pemrograman Majelis adalah sumber yang bagus yang memiliki sedikit tentang pemrograman x86.

Dokumentasi ABI x64 juga berguna. Saya mencoba menemukan tautan ke versi yang ada di situs web AMDs, tetapi sepertinya saya tidak dapat menemukannya lagi, jadi saya rasa yang ini harus dilakukan.

Sesuatu yang dapat membantu [sedikit] saat belajar adalah, alih-alih mencoba menulis aplikasi lengkap dari awal dalam perakitan, alih-alih tulis sebagian besar dalam C (atau bahasa kompilasi lainnya) dan kemudian panggil sebidang kode perakitan dari bahwa. Setelah selesai, balikkan, tulis program perakitan, dan panggil beberapa fungsi C dari itu.

Sunting: Memperbaiki kesalahan ketik.

Orclev
sumber
1
Saran lain: Tulis program sederhana dalam C, kompilasi untuk perakitan, bersihkan sehingga assembler Anda dapat memasangnya, kemudian tingkatkan versi perakitan. Ini cara yang baik untuk mendapatkan beberapa fungsi minimum (membaca dari keyboard, menulis ke konsol) dengan cepat.
TMN
4

Buku yang sangat bagus untuk mempelajari x86 Assembly adalah Pentium Processor Optimization Tools . Meskipun fokus utama buku ini adalah optimalisasi kode perakitan, buku ini mengajarkan perakitan Pentium di sepanjang jalan, dan juga merupakan buku referensi yang bagus.

Sudah lama tidak dicetak tetapi tidak sulit untuk ditemukan digunakan.

Muncul dengan floppy disk yang berisi "pengoptimal kode perakitan". Itu sebenarnya tidak mengoptimalkan kode Anda, tetapi malah menghasilkan daftar komentar yang menunjukkan di mana inefisiensi seperti warung pipa terletak.

Alat yang datang dengan sebuah buku adalah versi terbatas dari produk yang lebih berfitur yang digunakan perusahaan penulis untuk dijual, tetapi karena alasan saya tidak terbiasa dengan mereka yang sudah lama keluar dari bisnis. Saya tidak tahu mengapa - saya akan berpikir alat seperti itu akan menjual seperti kue panas.

x86 secara umum adalah topik yang sangat kompleks karena ada banyak varian yang didukung oleh berbagai model mikroprosesor. Setelah Anda mengetahui dasar-dasarnya, Anda ingin berkonsultasi dengan buku data Intel atau AMD untuk chip yang tepat yang Anda targetkan. Sayangnya kode yang berjalan cepat pada satu model CPU mungkin tidak secepat pada chip yang berbeda.

Mike Crawford
sumber
Tidak benar-benar mengejar kinerja; hanya ingin dapat menghasilkan binari. Akan tetap memeriksanya :)
Billy ONeal
2
Anda juga perlu mempelajari cara menggunakan assembler tertentu, bukan hanya opcode perakitan. Setiap assembler melakukan hal-hal yang sangat berbeda. Jika Anda akan menulis banyak kode assembly, gunakan masm seperti yang dikembangkan dengan coders manusia dalam pikiran. Jika Anda hanya akan menulis snipet kecil dari inline assembly, Anda dapat menggunakan gcc dengan GNU sebagai (juga disebut gas) inline assembly. GNU sebagai sintaks sama sekali berbeda dari sintaks. Seperti yang ditulis terutama untuk digunakan sebagai back-end untuk gcc, untuk melakukan pembuatan kode yang dapat dieksekusi, dan juga tidak menyediakan banyak fitur yang diinginkan oleh coders manusia.
Mike Crawford
1

Mengapa tidak mencoba wikibook - http://en.wikibooks.org/wiki/X86_Assembly . Ini memberikan awal pengantar yang baik untuk bahasa assembly.

Yang sulit tentang perakitan adalah menyadari betapa sederhananya itu, dan bahwa Anda harus tetap dengan kesederhanaan itu.

Philip Oakley
sumber