Mengapa kita perlu bahasa rakitan?
Sebenarnya hanya ada satu bahasa yang kita perlukan , yang disebut "bahasa mesin" atau "kode mesin". Ini terlihat seperti ini:
0010000100100011
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:
0010|0001|0010|0011
operation type source register other source destination register
0010 0001 0010 0011
Nilai-nilai ini sesuai dengan:
operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3
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):
instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000
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:
(meaning) operation type source register other source destination register
(machine code) 0010 0001 0010 0011
("English") add r1 r2 r3
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:
z = x + y
Ini terdengar seperti tambahan kami dari atas, dengan asumsi x
ada di register 1, y
ada di register 2, dan z
harus berakhir di register 3. Tapi bagaimana dengan baris ini?
z = x * 2 + (y / 6) * p + q - r
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:
1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010
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.)