Kami kebanyakan menulis program dalam bahasa tingkat tinggi. Jadi saat belajar saya menemukan bahasa assembly. Jadi assembler mengkonversi bahasa assembly ke bahasa mesin dan compiler melakukan hal yang sama dengan bahasa tingkat tinggi. Saya menemukan bahasa assembly memiliki instruksi seperti memindahkan r1 r3, memindahkan 5 dll. Dan itu agak sulit untuk dipelajari. Jadi mengapa bahasa assembly dibuat? Atau bahasa yang lebih dulu bahkan sebelum bahasa tingkat tinggi? Mengapa saya belajar tentang assembler di kelas teknik komputer saya?
programming-languages
education
history
Nithin Jose
sumber
sumber
Jawaban:
"Jadi mengapa bahasa assembly dibuat?"
Bahasa assembly dibuat sebagai singkatan yang tepat untuk pengkodean level mesin, sehingga Anda tidak perlu menghitung 0s dan 1s sepanjang hari. Ini bekerja sama dengan kode level mesin: dengan instruksi dan operan.
"Yang mana yang lebih dulu?"
Wikipedia memiliki artikel yang bagus tentang Sejarah Bahasa Pemrograman
"Mengapa saya belajar tentang assembler di kelas teknik komputer saya?"
sumber
Sebenarnya hanya ada satu bahasa yang kita perlukan , yang disebut "bahasa mesin" atau "kode mesin". Ini terlihat seperti ini:
Ini adalah satu-satunya bahasa yang dapat digunakan komputer Anda secara langsung. Ini adalah bahasa yang digunakan CPU (dan secara teknis, berbagai jenis CPU berbicara dengan versi yang berbeda). Ini juga menyebalkan untuk dilihat dan mencoba untuk mengerti.
Untungnya, setiap bagian dari biner sesuai dengan makna tertentu. Ini dibagi menjadi beberapa bagian:
Nilai-nilai ini sesuai dengan:
Jadi operasi ini akan menambahkan angka-angka dalam register 1 dan 2 dan memasukkan nilai itu dalam register 3. Jika Anda benar-benar memasukkan nilai-nilai ini ke dalam CPU dan katakan "pergi", itu akan menambahkan dua angka untuk Anda. Operasi "kurangi" bisa jadi 0011 atau apalah, bukannya 0010 di sini. Nilai berapa pun akan membuat CPU melakukan pengurangan.
Jadi sebuah program bisa terlihat seperti ini (jangan mencoba memahaminya, karena saya membuat versi kode mesin khusus ini untuk menjelaskan banyak hal):
Apakah ini payah membaca? Pastinya. Tapi kami membutuhkannya untuk CPU . Nah, jika setiap kode mesin sesuai dengan tindakan tertentu, mari kita membuat singkatan "Bahasa Inggris" yang sederhana, dan setelah kita memahami apa yang sedang dilakukan program, ubahlah menjadi kode mesin biner nyata dan berikan kepada CPU untuk dijalankan.
Jadi instruksi asli kami dari atas dapat terlihat seperti:
Perhatikan bahwa versi bahasa Inggris ini memiliki pemetaan yang tepat untuk kode mesin . Jadi ketika kita menulis baris "Bahasa Inggris" ini, kita benar-benar hanya menulis kode mesin yang lebih ramah dan lebih dimengerti.
Nah, ini bahasa assembly. Itu sebabnya itu ada, dan mengapa itu awalnya dibuat.
Untuk memahami mengapa kita membutuhkannya sekarang, baca jawaban di atas, tetapi kunci yang perlu dipahami adalah ini: Bahasa tingkat tinggi yang tidak memiliki satu representasi adalah kode mesin. Misalnya dalam C, atau Python, atau apa pun:
Ini terdengar seperti tambahan kami dari atas, dengan asumsi
x
ada di register 1,y
ada di register 2, danz
harus berakhir di register 3. Tapi bagaimana dengan baris ini?Coba mewakili bahwa baris dalam 16 bit biner dan menceritakan CPU "pergi". Kamu tidak bisa Kode mesin tidak memiliki instruksi operasi tunggal untuk melakukan penambahan, pengurangan, dan apa pun lainnya dengan 4 atau 5 variabel sekaligus. Jadi itu harus dikonversi ke urutan kode mesin terlebih dahulu. Ini adalah apa yang Anda lakukan ketika Anda "mengkompilasi" atau "menafsirkan" bahasa tingkat tinggi.
Ya, kami punya program untuk melakukan itu, jadi mengapa kita perlu perakitan sekarang? Nah katakanlah program Anda berjalan lebih lambat dari yang Anda harapkan, dan Anda ingin tahu mengapa. Melihat "output" bahasa mesin dari baris ini, mungkin terlihat seperti:
Hanya untuk menyelesaikan satu baris Python. Jadi Anda benar-benar ingin men-debug itu?!?!?! NO . Sebaliknya, Anda meminta kompiler Anda dengan ramah memberi Anda output dalam bentuk yang sebenarnya bisa Anda pahami dengan mudah, yang merupakan versi bahasa assembly yang sesuai persis dengan kode mesin itu. Kemudian Anda dapat mengetahui apakah kompiler Anda melakukan sesuatu yang bodoh dan mencoba memperbaikinya.
(Catatan tambahan pada saran @ Raphael: Anda sebenarnya dapat membuat CPU yang berfungsi dengan hal-hal selain kode biner, seperti kode ternary (basis 3) atau decimal, atau bahkan ASCII. Namun untuk tujuan praktis, kami benar-benar telah menggunakan binary.)
sumber
Ya, assembly adalah salah satu bahasa pemrograman pertama yang menggunakan teks sebagai input, tidak seperti kawat solder, menggunakan papan plug, dan / atau membalik saklar. Setiap bahasa rakitan dibuat hanya untuk satu prosesor atau rangkaian prosesor karena instruksi dipetakan langsung ke opcode yang dijalankan oleh prosesor.
Jika Anda perlu memprogram driver perangkat atau menulis kompiler maka memahami cara kerja prosesor sangat berharga, jika tidak diperlukan. Cara terbaik untuk memahami ini adalah dengan menulis beberapa kode dalam rakitan.
Jika Anda melihat bagaimana kompiler menulis kode, biasanya melihat opsi untuk memanggil konvensi yang tanpa mengetahui rakitan mungkin tidak dapat dipahami.
Jika Anda harus menyelesaikan bug dan satu-satunya input yang Anda miliki adalah dump inti , maka Anda pasti perlu tahu assembly untuk memahami output yang merupakan kode assembly dan jika beruntung ditambah dengan pernyataan level yang lebih tinggi dari bahasa level tinggi.
sumber
Biarkan saya menambahkan satu aspek yang kurang praktis. Ini (mungkin) bukan alasan historis tetapi alasan untuk Anda, hari ini.
Majelis (dibandingkan dengan bahasa tingkat tinggi) telanjang . Itu tidak menyembunyikan apa pun (yang dilakukan dalam perangkat lunak), dan sederhana dalam arti bahwa ia memiliki rangkaian operasi yang relatif kecil dan tetap.
Ini dapat membantu untuk analisis algoritma yang tepat. Semantik dan aliran kendali sangat sederhana sehingga penghitungan semua operasi (atau angka yang diharapkan) dapat dilakukan dengan memberi anotasi pada grafik aliran kendali dengan jumlah transisi (probabilitas). Knuth melakukan ini dalam buku-buku TAoCP-nya dengan sangat baik, menunjukkan beberapa analisis algoritma yang paling ketat.
Anekdot: kolega saya telah belajar membaca Java Bytecode untuk tujuan ini.
sumber
Ada jawaban di sini:
Kapan kita membutuhkan bahasa assembly? pada Programmers.SE
Mengapa bahasa rakitan masih diperlukan jika kita memiliki bahasa tingkat tinggi yang menawarkan alat canggih? pada Stackoverflow
Mengapa mempelajari bahasa Majelis? oleh Gary L. Burt
Semua jawaban ini menunjuk ke:
sumber
Assembly = kode mesin
Beberapa orang terus membicarakan tentang bagaimana bahasa assembly berbeda dari kode numerik yang dimengerti CPU.
Ini (sementara benar) benar-benar melenceng.
Sejauh terjemahan berjalan bahasa assembly dan numerik (biner, hex apapun) adalah satu dan hal yang sama.
Grok atau drop it
Jika Anda grok rakitan Anda tahu bagaimana komputer yang sebenarnya bekerja.
perakitan grokking melibatkan:
multiscalar
artinyaJika Anda grok perakitan Anda juga memiliki gambaran yang hampir lengkap tentang bagaimana CPU terhubung ke keyboard Anda bekerja.
Anda perlu menggunakan pengetahuan ini seperti ahli bedah otak menggunakan pisau bedahnya.
Tidak perlu abstraksi bau
Kecuali jika Anda grok perakitan (dan dengan demikian CPU di atas meja operasi) Anda tidak akan pernah bebas dari cengkeraman abstraksi mesin RAM (atau Tuhan melarang mesin Turing horor ).
L33t Hax0r 5k1llz
Assembly juga membantu Anda memahami bagaimana 133thax0r berhasil mengalahkan skema perlindungan. (T: mengapa ASLR tidak berfungsi ? Karena
mov rax,fs:[28h]
merusaknya ).The 0,1%
Bukan pengetahuan tentang perakitan yang penting, tetapi pengetahuan tentang mesin yang Anda kerjakan yang penting.
Jika Anda ingin tahu mesin, Anda harus memahaminya dan itu berarti berbicara bahasa mesin.
Jika tidak, maka Anda akan terjebak dengan abstraksi.
Itu ilmu dan itu bagus, tapi itu tidak pernah gambaran lengkap.
Ini seperti belajar berbicara Xhosa,
kecuali jika Anda bertujuan untuk tingkat guru, tetap dengan apa yang Anda ketahui, klik itu akan mempersulit hidup Anda .
Karena itu menyenangkan.
sumber
Sampai saat ini, saya pertama kali belajar RPG II menggunakan IBM System 32, dan kemudian belajar APL pada 370. Saya semua tentang ukuran dan kecepatan. Mantra saya lebih kecil dan lebih cepat. Assembly adalah bahasa yang paling ringkas dan tercepat di luar sana. Saya akan membuat program pengujian di C dan Assembly. Di mana program C akan membutuhkan 100-an Kb, program Majelis yang setara seringkali kurang dari 5 Kb. Ketika mempelajari output dari kompiler C saya akan menemukan kode yang akan memeriksa dan memeriksa kembali parameter membuat pemeriksaan bersyarat untuk kemungkinan kesalahan yang cukup sering langka dan eksotis dan sangat tidak perlu, yang semuanya membutuhkan waktu, tetapi mengasapi memori terbesar melewati semua segalanya ke dan dari tumpukan.
Dalam lingkungan pemrograman saat ini, menulis kode memberikan tingkat keamanan dan perlindungan ekstra. Mampu membaca info langsung dari perangkat keras yang tidak dapat diakses ke bahasa tingkat tinggi, memungkinkan Anda mengenkripsi dengan Assembly dengan cara yang hanya bisa digunakan oleh program di mesin itu. Misalnya mengenkripsi kunci pengguna menggunakan alamat MAC dari antarmuka jaringan, dan kemudian memarkir kunci itu pada sektor tertentu dari hard drive kemudian menandai sektor tersebut sebagai buruk sehingga file lain tidak dapat menimpanya. Tentu saja Anda kehilangan sektor ini, tetapi apa itu? 2048 atau 4096 byte dari miliaran atau triliunan?
sumber