Assembler, atau bahasa rakitan, adalah bahasa pemrograman tingkat rendah yang menyediakan representasi simbolis dari instruksi kode mesin komputer. Berbeda dengan bahasa pemrograman tingkat tinggi yang mengabstraksi detail perangkat keras, bahasa rakitan memungkinkan programmer untuk menulis program yang sangat sesuai dengan arsitektur komputer. Ini memberikan kontrol yang lebih mendetail kepada pengembang atas sumber daya perangkat keras, menjadikannya penting untuk tugas-tugas yang memerlukan interaksi langsung dengan atau manipulasi perangkat keras, seperti sistem operasi, sistem tertanam, dan aplikasi yang kritis terhadap kinerja.
Bahasa rakitan muncul pada awal era komputasi sebagai cara untuk menyederhanakan proses pemrograman menggunakan kode mesin biner. Assembler pertama kali dibuat untuk Electronic Numerical Integrator and Computer (ENIAC) pada tahun 1940-an, memungkinkan programmer untuk menulis instruksi dalam format yang lebih mudah dibaca manusia. Seiring evolusi arsitektur komputer, bahasa rakitan juga berkembang, dengan berbagai assembler dikembangkan untuk memenuhi berbagai desain perangkat keras.
Assembler terinspirasi langsung oleh arsitektur komputer tertentu yang ditargetkan. Setiap jenis prosesor memiliki bahasa rakitannya sendiri, seperti x86 (untuk prosesor Intel dan AMD), ARM (digunakan secara luas di perangkat mobile), dan MIPS (digunakan dalam sistem tertanam). Meskipun bahasa rakitan berbagi beberapa konsep dasar, mereka mencerminkan set instruksi unik dan kemampuan operasional dari platform perangkat keras masing-masing.
Saat ini, meskipun bahasa rakitan bukanlah bahasa utama untuk pengembangan aplikasi, ia tetap relevan di domain tertentu. Bahasa ini umum digunakan untuk menulis bagian kode yang kritis terhadap kinerja, driver perangkat, dan sistem waktu nyata. Selain itu, pemahaman tentang bahasa rakitan sangat penting untuk bidang seperti rekayasa balik, analisis malware, dan keamanan sistem.
Assembler menggunakan mnemonik, yang merupakan representasi simbolis dari instruksi mesin. Misalnya, MOV AX, 1
mewakili pemindahan nilai 1
ke dalam register AX
.
Bahasa rakitan memungkinkan manipulasi langsung register prosesor. Misalnya, instruksi ADD AX, BX
menambahkan nilai dalam register AX
dan BX
dan menyimpan hasilnya di AX
.
Label digunakan untuk menandai posisi dalam kode untuk lompatan dan loop. Sebuah label mungkin terlihat seperti start:
. Ini berguna untuk membuat loop dengan instruksi seperti JMP start
.
Direktif mengontrol perilaku assembler dan menyediakan metadata. Misalnya, direktif .data
dan .text
menunjukkan bagian untuk data dan kode, masing-masing.
Komentar dapat disertakan untuk tujuan dokumentasi menggunakan titik koma. Misalnya, ; Ini adalah komentar
.
Bahasa rakitan mendukung instruksi alur kontrol seperti JMP
, JE
(lompat jika sama), dan JNE
(lompat jika tidak sama), yang memungkinkan percabangan dalam eksekusi kode.
Setiap instruksi rakitan biasanya terdiri dari operasi (opcode) diikuti oleh operand. Operasi dapat bersifat unary, binary, atau menggunakan format yang lebih kompleks tergantung pada arsitektur set instruksi.
Bahasa rakitan memungkinkan penggunaan nilai segera langsung dalam instruksi, seperti MOV AX, 5
, di mana 5
adalah nilai segera yang ditugaskan ke register AX
.
Bahasa rakitan mendukung prosedur dan pemanggilan subrutin, yang memungkinkan penggunaan kembali kode. Ini dapat dipanggil menggunakan instruksi CALL
diikuti oleh label, misalnya, CALL myFunction
.
Meskipun bahasa rakitan tidak memiliki tipe data tingkat tinggi, data dapat dikelola menggunakan byte, word, atau double-word sesuai dengan arsitektur, dan alamat memori dapat dimanipulasi secara langsung.
Assembler mengubah kode bahasa rakitan menjadi kode mesin. Berbagai assembler ada, seperti NASM (Netwide Assembler), MASM (Microsoft Macro Assembler), dan GAS (GNU Assembler), masing-masing menargetkan arsitektur atau sistem operasi tertentu.
Lingkungan pengembangan untuk bahasa rakitan kurang umum dibandingkan dengan bahasa tingkat tinggi tetapi mencakup IDE tertentu seperti MPLAB X IDE untuk mikrokontroler PIC atau Keil untuk pengembangan ARM.
Untuk membangun proyek dalam bahasa rakitan, pengembang biasanya menulis kode sumber di editor teks, kemudian memanggil assembler melalui command line untuk menghasilkan file biner atau objek. Misalnya, menggunakan NASM, perintah yang umum mungkin terlihat seperti:
nasm -f elf64 myprogram.asm -o myprogram.o
Selanjutnya, pengikatan dapat dilakukan menggunakan linker seperti ld
untuk membuat executable:
ld myprogram.o -o myprogram
Bahasa rakitan terutama digunakan di bidang yang memerlukan kinerja yang dioptimalkan dan manipulasi perangkat keras langsung. Aplikasi kunci meliputi:
Berbeda dengan bahasa tingkat tinggi seperti C, C++, atau Java, yang menawarkan abstraksi atas perangkat keras, bahasa rakitan memberikan kontrol langsung atas instruksi mesin. Ini membuat program rakitan umumnya lebih cepat dan lebih kecil, yang penting di lingkungan yang terbatas sumber daya, tetapi jauh lebih tidak portabel.
Meskipun optimasi bahasa rakitan dapat menghasilkan kinerja yang lebih baik, bahasa seperti C dan C++ menyederhanakan proses pengembangan secara signifikan. Bahasa tingkat tinggi menangani manajemen memori, pemeriksaan kesalahan, dan menyediakan pustaka yang luas, menjadikannya cocok untuk sebagian besar aplikasi.
Sintaksis bahasa rakitan dianggap lebih kompleks dibandingkan dengan bahasa seperti Python atau JavaScript, yang mengutamakan keterbacaan dan kemudahan penggunaan. Mempelajari bahasa rakitan memerlukan pemahaman tentang arsitektur komputer, sementara bahasa tingkat tinggi mengabstraksi detail ini.
Beberapa alat ada untuk menerjemahkan bahasa tingkat tinggi ke bahasa rakitan atau memungkinkan bahasa rakitan berinteraksi dengan kode tingkat tinggi. Beberapa assembler dapat mengintegrasikan kode C secara langsung, memungkinkan proyek campuran. Alat seperti LLVM juga dapat menghasilkan bahasa rakitan dari kode yang ditulis dalam bahasa tingkat tinggi.
Bagi pengembang yang ingin mengonversi kode dari bahasa tingkat tinggi ke bahasa rakitan, bermanfaat untuk mempelajari set instruksi arsitektur target dan memanfaatkan alat pemprofilan untuk membimbing upaya optimasi. Juga disarankan untuk memanfaatkan compiler yang ada seperti GCC yang dapat menghasilkan kode rakitan untuk analisis atau penyempurnaan lebih lanjut.