Sumber daya untuk belajar memprogram dalam kode mesin? [Tutup]

24

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.

As sekop
sumber
2
Apa sebenarnya masalahnya di sini? Jika Anda bertanya apakah mungkin untuk kode dalam kode mesin maka jawabannya mungkin "ya". Jika Anda meminta tutorial maka a) jelaskan itu pertanyaan Anda, tetapi b) itu bukan pertanyaan yang konstruktif.
ChrisF
6
Apakah C tidak cukup logam?
Tom Squires
6
Saya program bare metalsetiap kali menendang kotak server saya. Keajaiban bekerja!
yannis
7
Pernah dianggap lebih jauh ke bawah? Retas CPU Anda sendiri: opencores.org
SK-logic
3
@ SK-logic, ya, pemrograman kode mesin akan menjadi tidak tertahankan setelah sekitar 1 jam. Anda benar, ide yang lebih baik dan lebih produktif adalah turun ke implementasi CPU. Ada juga versi virtual dari 6502 ( visual6502.org ) serta orang-orang yang memiliki atau bercita-cita untuk membangun CPU menggunakan logika diskrit modern ( bradrodriguez.com/papers/piscedu2.htm )
Angelo

Jawaban:

27

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 asminstruksi (terutama fitur perakitan diperluas GCC ) di dalam fungsi C. Membaca kode perakitan (dihasilkan oleh gcc -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.

Basile Starynkevitch
sumber
8
"Orang tidak memprogram dalam C (...). Mereka menggunakan bahasa modern, mungkin dengan C backend"
Abyx
Saya pasti setuju. Dan proyek pekerjaan saya saat ini ( MELT , lihat gcc-melt.org ) adalah DSL yang diterjemahkan ke C.
Basile Starynkevitch
Saya menambahkan beberapa referensi ke ISA
Basile Starynkevitch
6
Bagaimana dengan mereka yang ingin membuat dan merakit? Ada alasan untuk mempelajari kode mesin, meskipun itu tidak umum.
Jetti
Saya akan mengatakan bahwa itu sedang belajar arsitektur set instruksi (menggunakan mnemonics perakitan). Anda jarang belajar secara eksplisit penyandian instruksi (misalnya NOP 0x90). Anda banyak yang perlu mengetahuinya saat menulis assembler atau generator kode mesin. (Demikian juga, Anda jarang perlu mempelajari dengan hati-hati pengkodean Unicode UTF8).
Basile Starynkevitch
13

Seperti yang dinyatakan sebelumnya Learn Assembly .

Bahasa assembly adalah bahasa pemrograman tingkat rendah untuk komputer, mikroprosesor, mikrokontroler, dan perangkat lain yang dapat diprogram. Ini mengimplementasikan representasi simbolis dari kode mesin dan konstanta lain yang diperlukan untuk memprogram arsitektur CPU yang diberikan.

Jadi Majelis adalah symbolic representation of machine code.

Anda sekarang mungkin bertanya, "Oke, jadi bagaimana saya mempelajari semua itu?" Saya senang Anda bertanya:

  1. Pahami apa itu. Ini tingkat yang sangat rendah dan akan memberi Anda pemahaman yang sangat mendalam tentang komputer. Anda mungkin ingin memulai dengan Wikipedia dan kemudian membaca bagian singkat ini .
  2. Pelajari itu! Bacaan terbaik mungkin Seni Bahasa Majelis dan Bahasa Majelis Langkah-demi-Langkah: Pemrograman dengan Linux
  3. Dapatkan coding!
Dinamis
sumber
Saya sedang membaca utas lainnya dan saya kira saya menemukan ini: programmers.stackexchange.com/a/82573/43388 hal semacam itu yang bisa saya temukan tutorialnya? Tapi, saya perlu belajar perakitan terlebih dahulu untuk membuat transisi lebih mudah.
AceofSpades
1
Terima kasih, saya kira saya perlu belajar berkumpul berdasarkan permintaan populer. +1
AceofSpades
8

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.

JBRWilkinson
sumber
6
Itu adalah hobi. Saya tertarik pada cara kerja dan belajar memanipulasi mereka pada tingkat yang sangat dasar jika memungkinkan. +1
AceofSpades
6

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.

Tikhon Jelvis
sumber
Terima kasih banyak atas tautannya dan menjelaskan dari mana saya harus memulai. +1
AceofSpades
6

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.

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.

Matt Stephenson
sumber
4

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.

Daniel Scocco
sumber
Jika poster asli membangun komputer dari awal, ia harus mendefinisikan (bukan hanya mempelajari) rakitannya sendiri.
Basile Starynkevitch
@aniel Saya mengerti alasannya dengan belajar menambahkan dari bit yang benar-benar level rendah. +1
AceofSpades
Alternatif untuk membangun komputer dari awal bisa dengan mempelajari beberapa prosesor lama (dan bahasa rakitannya) seperti Z80 atau 6502 yang masih cukup sederhana untuk dipahami. Saya kira bahkan ada emulator yang bisa Anda mainkan.
Giorgio
@AceofSpades Cara yang bagus untuk membangun CPU dan komponen CPU (mis. Penambah) dengan menggunakan redstone di Minecraft, saya akan merekomendasikan itu. Saya sudah mulai mengerjakan beberapa mesin sederhana di Minecraft, dan itu sangat meningkatkan pemahaman saya tentang teori dan logika di balik komputer.
Aaron
1

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

old_timer
sumber
1

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

br3w5
sumber