Saya seorang mahasiswa, baru dalam pemrograman dan menyukainya, dari Jawa ke C ++ dan turun ke C. Saya pindah ke barebone dan berpikir untuk melangkah lebih jauh ke Assembly.
Tapi, yang mengejutkan saya, banyak orang mengatakan itu tidak secepat C dan tidak ada gunanya. Mereka menyarankan untuk belajar bagaimana memprogram kernel atau menulis kompiler C. Impian saya adalah belajar program dalam biner (kode mesin) atau mungkin program bare metal (program micro-controller secara fisik) atau menulis bios atau boot loader atau semacamnya.
Satu-satunya hal yang mungkin saya dengar setelah begitu banyak penelitian adalah bahwa hex editor adalah hal yang paling dekat dengan bahasa mesin yang bisa saya temukan di zaman dan zaman ini. Apakah ada hal lain yang tidak saya sadari? Apakah ada sumber daya untuk belajar memprogram dalam kode mesin? Lebih disukai pada mikrokontroler / mikroprosesor 8-bit.
Ini pertanyaan adalah sama dengan saya, tapi aku tertarik dalam belajar praktis pertama dan kemudian memahami teori.
sumber
program bare metal
setiap kali menendang kotak server saya. Keajaiban bekerja!Jawaban:
Orang tidak memprogram dalam kode mesin (kecuali mereka masokis). Mereka menggunakan (atau mengembangkan) alat untuk menghasilkan kode mesin (kompiler atau assembler, termasuk alat pengembangan silang), atau mungkin perpustakaan yang menghasilkan kode mesin (LLVM, libjit, GNU lightning, ....). Jadi sumber daya tentang pembuatan kode mesin, kompilasi, pengoptimal, dan arsitektur mikro juga relevan.
Dan sangat sering, kompiler optimisasi yang baik menghasilkan kode mesin yang lebih baik daripada yang bisa Anda lakukan. Anda mungkin tidak dapat menulis kode assembler 200 baris lebih baik daripada pengoptimal yang baik.
Jika Anda ingin memahami kode mesin, pelajari perakitan terlebih dahulu. Sangat dekat dengan kode mesin. Gunakan dengan bijak, hanya untuk hal-hal yang tidak dapat Anda kode dalam C (atau dalam bahasa tingkat tinggi, seperti Ocaml, Haskell, Common Lisp, Scala). Cara yang baik adalah sering menggunakan
asm
instruksi (terutama fitur perakitan diperluas GCC ) di dalam fungsi C. Membaca kode perakitan (dihasilkan olehgcc -S -O2 -fverbose-asm
) juga dapat membantu.The Linux Majelis HowTo adalah hal yang baik untuk membaca.
Arsitektur kumpulan instruksi prosesor saat ini (yaitu kumpulan instruksi yang dimengerti oleh chip) cukup rumit. Yang umum adalah x86 (PC biasa dalam mode 32 bit), X86-64 (PC desktop dalam mode 64 bit), ARM (smartphone, ...), PowerPC dll. Semuanya sangat kompleks (karena historis dan ekonomis alasan). Mungkin pertama-tama mempelajari seperangkat instruksi hipotetis seperti MMIX Knuth lebih sederhana.
sumber
Seperti yang dinyatakan sebelumnya Learn Assembly .
Jadi Majelis adalah
symbolic representation of machine code
.Anda sekarang mungkin bertanya, "Oke, jadi bagaimana saya mempelajari semua itu?" Saya senang Anda bertanya:
sumber
Saya sangat menyarankan agar Anda mempertimbangkan kembali tujuan Anda dan inilah alasannya:
Saya pertama kali belajar 6502 Bahasa Perakitan di BBC Microcomputer (Model B, 32K). Itu memiliki implementasi BASIC luar biasa yang mencakup assembler makro. Kami memilikinya di sekolah, jadi saya menulis semua jenis program nakal yang akan melakukan hal-hal seperti manipulasi buffer layar langsung untuk membuat Lemming berjalan di setiap layar, di sekitar ruangan (mereka terhubung jaringan) jika mesin tidak digunakan selama 10 menit . Itu menghasilkan cekikikan di antara teman-teman kelas 7 saya.
Ketika saya mendapatkan Commodore 64 di rumah, saya mengetahui bahwa ia memiliki CPU 6510 yang juga menjalankan 6502 bahasa assembly tetapi dengan beberapa tambahan yang menarik. Saya harus membeli assembler (menggunakan cartridge ) dan menjalankan program melalui BASIC. Dengan visi besar menulis game terlaris, saya akhirnya berhasil membuat beberapa demo yang register perangkat keras tampilan video sedikit-bengkok pada interrupt untuk melakukan efek bar warna yang menarik yang dianimasikan ke musik chip yang funky. Mengesankan, tapi tidak terlalu berguna.
Saya kemudian mendapatkan Acorn Archimedes A310 yang memiliki CPU ARM2 jadi saya menggunakan implementasi BASIC yang sama mengagumkannya dengan assembler makro bawaan seperti Micro Mikro (warisan yang sama). Saya berhasil menyusun beberapa permainan yang disediakan teman arty untuk grafis, ditambah beberapa demo trippy berbasis sinusoid. Kedua hal ini merupakan kerja keras untuk diprogram dan kode yang buruk dapat menurunkan mesin (secara tidak sengaja trip register reset perangkat keras, dll), kehilangan segalanya jika saya tidak menyimpan (ke disket!).
Di Universitas saya diperkenalkan ke C ++ dan karenanya C. Saya bisa menggunakannya untuk memprogram Sun / Solaris dan beberapa komputer mainframe besar lainnya. Saya tidak tahu apa arsitektur CPU mesin ini berjalan - saya tidak pernah perlu menggunakan assembler atau membaca kode mesin karena alat C ++ memberi saya kekuatan yang saya butuhkan untuk menghasilkan aplikasi profesional.
Setelah Uni, saya bekerja pada Windows dan beberapa rasa Unix. C dan C ++ bekerja pada semua mesin ini dan akhirnya Java juga melakukannya.
Saya kemudian bekerja pada Windows dan Dreamcast menggunakan C ++ dengan DirectX dengan rantai alat komprehensif untuk debugging.
Saya kemudian bekerja dengan chipset berbasis ARM untuk Smart TV (pada tahun 2000). Meskipun pengalaman saya dengan ARM2 mungkin relevan di sini, pekerjaan itu berbasis C. Saya menemukan bahwa semua masalah dengan perangkat keras yang saya lakukan pada Archimedes juga dapat dilakukan di C menggunakan operasi bit-twiddling langsung. Bagian dari peran saya adalah untuk memigrasi basis kode ke Windows, Playstation 2, Linux, TV dan chipset seluler lainnya. Semua platform ini tersedia dengan kompiler C (seringkali GCC) dan beberapa tingkat API untuk ditulis ke mesin yang mendasarinya - dunia yang disematkan jarang merupakan kernel O / S. Saya tidak pernah perlu mengetahui kode mesin lengkap untuk platform tertentu selain menulis boot loader dan mini-BIOS, yang keduanya melompat ke dalam kode C pada kesempatan pertama yang tersedia (setelah mengatur vektor perangkap,
Pekerjaan selanjutnya adalah bekerja dengan C ++, C # dan JavaScript pada Windows. Tidak ada kode mesin.
Pekerjaan saat ini bekerja dengan C ++, JavaScript, Python, LUA, HTML dan bahasa lainnya di berbagai platform. Saya tidak tahu kode mesin apa yang dijalankan platform ini, saya juga tidak perlu tahu - kompiler menerjemahkan kode kami menjadi apa pun yang diperlukan. Jika crash, saya menangkap kesalahan dalam debugger atau melalui diagnostik runtime (pengecualian, sinyal, dll).
Untuk bersenang-senang, saya mengembangkan aplikasi iOS pada waktu luang yang saya miliki di rumah. Ini menggunakan Objective-C dan API yang bekerja di beberapa chipset. Rupanya mereka berbasis ARM, tetapi saya belum pernah melihat kode mesin dalam pengembangan saya.
Meskipun ini merupakan latihan yang menarik untuk mempelajari bahasa rakitan, sekarang ada banyak alat dan bahasa tingkat lebih tinggi yang memungkinkan Anda menjadi urutan-besarnya (atau dua) lebih produktif.
Jumlah peluang kerja yang tersedia untuk programmer bahasa assembly / kode mesin yang menakjubkan sangat kecil dibandingkan dengan sesuatu seperti JavaScript, Java, C #, C ++ atau ObjC.
Saya menyarankan Anda menjadikan ini hobi / minat sampingan daripada tujuan utama.
sumber
Saran saya? Pelajari MIPS dan pelajari cara membangun prosesor MIPS (sederhana). Ini sebenarnya lebih mudah dari yang terlihat.
Keuntungan MIPS dibandingkan beberapa arsitektur lainnya adalah kesederhanaan. Anda tidak akan terjebak dalam banyak detail kecil, tetapi Anda masih akan mempelajari semua ide besar yang Anda butuhkan untuk menulis kode di arsitektur lain.
Secara kebetulan, ini adalah tugas akhir untuk kelas CS intro (ketiga) saya. Jika mau, Anda dapat membaca tugas dan menelusuri kuliah sebagai video atau slide .
Antara lain, kita lakukan penutup bagaimana kode MIPS akan berubah menjadi biner; kami bahkan harus men-decode beberapa kode mesin (sangat sederhana) pada ujian.
Bahkan jika Anda tidak ingin membahas semuanya, sebagian besar kuliah diberikan oleh salah satu dosen favorit siswa dan menyenangkan untuk ditonton sendiri.
sumber
Jalan yang bagus untuk ditempuh. Lompatan saya (jatuh?) Dari C ke Assembly dan lebih rendah adalah program dan Desain Komputer universitas , berdasarkan buku dengan nama yang sama.
Sangat merekomendasikan buku ini untuk bab-bab pertama tentang perakitan MIPS dasar, semua melalui pipelining dan arsitektur memori. Bahkan lebih baik mengikuti kursus dengan tema yang sama, atau mencari kuliah online.
Lihat juga MARS MIPS Simulator untuk membuat tangan Anda kotor menulis.
sumber
Jika Anda ingin memahami cara kerja mesin sepenuhnya, mengapa Anda tidak mencapai tingkat serendah mungkin dan membangun jalan Anda ke tempat Anda berada (misalnya, C, C ++)?
Maksud saya: mengapa Anda tidak membuat penambah 4-bit Anda sendiri dengan transistor di sirkuit (hanya Google itu jika Anda mencari instruksi / tutorial)?
Setelah itu membangun komputer kecil dengan beberapa RAM, dan kemudian mulai belajar Assembly dan menulis satu atau dua program dengan itu.
sumber
Saya memiliki satu set instruksi yang dibuat untuk ini, sebuah simulator, dan beberapa tutorial tentang dasar-dasar satu instruksi atau konsep per pelajaran. Cukup ketik programnya, jalankan, lalu pelajari apa yang dilakukannya, lanjutkan ke pelajaran berikutnya.
http://www.github.com/dwelch67/lsasim
Saya juga punya simulator untuk beberapa set instruksi umum juga. Setiap atau semua yang baik untuk digunakan untuk belajar asm (jika Anda benar-benar merasa Anda harus belajar x86, mempelajarinya terakhir, dan menggunakan simulator seperti yang saya garpu, 8088/86 pertama kemudian bergerak maju). Belajar melawan simulator memiliki pro dan kontra, satu pro besar, terutama ketika memulai, adalah Anda tidak menabrak apa pun dan Anda memiliki visibilitas yang bagus. Melompat lebih dulu ke platform tertanam, mikrokontroler, dll untuk mempelajari set instruksi baru Anda harus mengatasi rintangan karena tidak dapat melihat apa yang sedang terjadi, mengarah ke daftar panjang cara untuk gagal ...
sumber
Kode oleh Charles Petzold adalah pengantar yang sangat baik untuk subjek dan menjelaskan proses membangun komputer termasuk bagaimana membangun adders, counter dan array RAM dan memperkenalkan kode mesin dan bahasa assembly dan hubungannya dengan bahasa tingkat yang lebih tinggi. Ini juga merupakan bacaan yang bagus tentang sejarah komputasi.
Dan saya baru saja membaca pertanyaan ini di electronics.stackexchange yang bisa berguna juga
sumber
Untuk studi bahasa mesin dan pemrograman,
perangkat lunak MASM dapat digunakan.
Untuk MASM, tautan berikut dapat digunakan.
http://en.wikipedia.org/wiki/Microsoft_Macro_Assembler
http://www.microsoft.com/en-us/download/details.aspx?id=12654
sumber