Bahasa assembly adalah bahasa pemrograman tingkat rendah yang menampilkan instruksi-instruksi yang digunakan komputer untuk mengoperasikan perangkat kerasnya. Dalam artikel ini, kita akan membahas bahasa assembly sebagai pengantar pemrograman, lengkap dengan contoh kode dan penjelasannya. Jika Anda pernah bertanya-tanya apa itu “pointer” atau “stack” dan apakah Anda perlu mempelajari bahasa assembly dalam upaya Anda menjadi seorang programmer, silakan lanjutkan membaca. Artikel ini menjelaskan apa itu bahasa assembly, kelebihan dan kekurangannya, contoh kasus penggunaan umum bahasa assembly, serta beberapa sumber daya jika Anda ingin mempelajari topik ini lebih lanjut. Mari kita mulai!
Definisi Bahasa Perakitan
Bahasa perakitan adalah bahasa pemrograman tingkat rendah yang khusus untuk jenis prosesor tertentu. Bahasa ini biasanya ditulis dalam bentuk mnemonik, yaitu representasi simbolis dari kode mesin yang dihasilkan oleh assembler. Dalam bahasa perakitan, kode operasi (opcode) dari instruksi mesin digantikan oleh mnemonik, dan alamat instruksi atau operand digantikan oleh simbol alamat atau label. Pada perangkat yang berbeda, bahasa perakitan sesuai dengan set instruksi bahasa mesin yang berbeda, dan dikonversi menjadi instruksi mesin melalui proses perakitan. Terdapat kesesuaian satu-ke-satu antara bahasa perakitan tertentu dan set instruksi bahasa mesin tertentu, dan bahasa ini tidak dapat dipindahkan secara langsung antar platform yang berbeda.
Sejarah Bahasa Perakitan
Sejarah bahasa rakitan sudah ada sejak masa-masa awal perkembangan komputer. Salah satu bahasa rakitan pertama diciptakan pada tahun 1950-an untuk komputer IBM 701. Bahasa ini, yang disebut Autocode, dikembangkan oleh Alick Glennie dan didasarkan pada kode yang sudah ada yang digunakan untuk pendahulu IBM 701, yaitu IBM 650.
Autocode segera diikuti oleh sejumlah bahasa perakitan lainnya, termasuk FORTRAN Assembly Language (FAL) dan COBOL Assembly Language (CAL). Bahasa-bahasa ini dirancang untuk memudahkan pemrograman dalam bahasa tingkat tinggi masing-masing, dan mereka sangat sukses.
Bahasa pemrograman
Sejak kemunculan komputer elektronik pertama di dunia pada tahun 1946, cara dan bahasa komunikasi antara manusia dan mesin telah menjadi arah penelitian utama para insinyur perangkat lunak dan praktisi komputer. Bahasa pemrograman yang lebih efisien dan sederhana telah menjadi favorit baru para insinyur perangkat lunak. Seiring perkembangan pesat komputer, kecepatan peningkatan perangkat keras komputer semakin cepat, dan persyaratan terhadap bahasa pemrograman pun semakin ketat. Bahasa pemrograman telah berkembang pesat selama beberapa dekade terakhir, dan hingga saat ini telah ada 3 generasi bahasa pemrograman. Untuk memenuhi persyaratan pemrograman dan fungsi perangkat lunak di berbagai bidang, sejumlah besar bahasa pemrograman telah melalui proses modifikasi, penggantian, dan pengembangan, hingga akhirnya berkembang menjadi keragaman bahasa pemrograman saat ini. Meskipun banyak upaya dilakukan untuk menemukan bahasa universal yang dapat beradaptasi dengan semua lingkungan pemrograman, tidak ada satupun yang berhasil. Bahasa pemrograman terus berkembang pesat seiring dengan teknologi modern, dan kecerdasan manusia semakin terlihat jelas.

Generasi ke-1: Bahasa Mesin
Bahasa mesin adalah bahasa pemrograman generasi pertama. Pada awal penemuan komputer, untuk mengendalikan komputer agar dapat menyelesaikan tugas atau proyek mereka, orang hanya dapat menulis rangkaian angka biner seperti "0" dan "1" untuk mengendalikan komputer. Bahasa inilah yang disebut bahasa mesin. Secara intuitif, bahasa mesin sangat rumit dan sulit dipahami, dan maknanya sering kali dipahami dengan melihat tabel atau manual. Penggunaannya sangat merepotkan, terutama saat Anda perlu memodifikasi program yang sudah jadi. Bahasa mesin yang tidak teratur ini akan membuat Anda tidak bisa memulainya, dan sulit untuk menemukan kesalahan program. Selain itu, lingkungan operasi komputer yang berbeda-beda, serta instruksi dan metode operasinya juga berbeda. Jadi, ketika Anda memiliki spesifikasi dalam bahasa mesin ini, Anda hanya dapat menjalankannya pada komputer tertentu. Dan begitu Anda mengganti mesin, Anda perlu memprogram ulang, yang sangat mengurangi efisiensi penggunaan dan promosi program. Namun, karena spesifikasinya, bahasa mesin sangat cocok untuk jenis komputer tertentu, sehingga efisiensi operasinya jauh lebih tinggi daripada bahasa pemrograman lainnya.

Generasi ke-2: Bahasa perakitan
Tidak sulit untuk melihat bahwa bahasa mesin, sebagai bahasa pemrograman, memiliki fleksibilitas dan keterbacaan yang rendah. Untuk mengurangi ketidaknyamanan yang ditimbulkan oleh bahasa mesin bagi para insinyur perangkat lunak, orang-orang telah mengembangkan dan menyempurnakan bahasa mesin: menggunakan huruf dan kata-kata yang mudah dipahami dan diingat sebagai pengganti instruksi spesifik. Melalui metode ini, orang dapat dengan mudah membaca program yang telah selesai atau memahami fungsi yang dijalankan oleh program tersebut, dan perbaikan bug serta pengoperasian dan pemeliharaan program yang ada menjadi lebih mudah dan nyaman. Bahasa ini adalah apa yang kita sebut bahasa assembly, bahasa komputer generasi kedua.

Dibandingkan dengan bahasa mesin, bahasa perakitan memiliki ketergantungan yang lebih tinggi pada mesin serta lebih mudah diingat dan ditulis, namun pada saat yang sama tetap mempertahankan kecepatan dan efisiensi tinggi yang dimiliki bahasa mesin. Bahasa perakitan tetap merupakan bahasa yang berorientasi pada mesin; sulit untuk memahami maksud desain program dari kodenya, dan program yang dirancang tidak mudah dipindahkan ke platform lain, sehingga tidak sepopuler kebanyakan bahasa pemrograman tingkat tinggi lainnya. Oleh karena itu, dalam bahasa tingkat tinggi yang sangat berkembang saat ini, bahasa perakitan biasanya digunakan pada tingkat paling bawah, umumnya untuk optimasi program atau pengoperasian perangkat keras.
Generasi ke-3: bahasa pemrograman tingkat tinggi
Setelah bahasa pemrograman mengalami perkembangan dari bahasa mesin, bahasa perakitan, dan sebagainya, orang-orang menyadari faktor kunci yang membatasi generalisasi program—yaitu portabilitas program. Diperlukan desain program yang dapat berjalan di berbagai mesin tanpa bergantung pada perangkat keras komputer. Dengan cara ini, banyak proses pemrograman yang berulang dapat dihindari, dan efisiensi dapat ditingkatkan. Pada saat yang sama, bahasa tersebut harus mendekati bahasa matematika atau bahasa alami manusia. Pada tahun 1950-an, ketika komputer masih langka, bahasa pemrograman tingkat tinggi pertama kali muncul. Pada saat itu, biaya komputer masih tinggi, namun jumlah perhitungan per hari terbatas. Bagaimana cara memanfaatkan daya komputasi komputer yang terbatas secara efektif menjadi masalah yang dihadapi orang-orang pada masa itu. Pada saat yang sama, karena kelangkaan sumber daya, efisiensi operasional komputer juga menjadi tujuan yang dikejar oleh para insinyur pada era tersebut.

Komposisi Bahasa Perakitan
Karena sistem instruksi assembly yang sangat besar, diperlukan sistem instruksi yang memiliki sejumlah besar instruksi, format yang rumit, dan sulit diingat. Bagian tersulit dari instruksi adalah mode pengalamatan yang didukung oleh instruksi tersebut, dan intinya adalah bagaimana cara memperoleh operan dalam instruksi. Bagi prosesor, ini adalah cara menemukan data yang dibutuhkannya. Namun, bagi bahasa perakitan di tingkat bawah komputer, metode pengalamatan ini akan melibatkan sejumlah besar format penyimpanan komputasi, dan sangat terkait dengan metode manajemen penyimpanan yang kompleks, sehingga sulit untuk dipahami. Terakhir, instruksi perakitan juga terkait dengan cara memengaruhi bendera, tetapi bendera prosesor sangat kompleks, sehingga lebih sulit untuk memahami mekanismenya.
perintah kirim
Perintah pengiriman meliputi:
- instruksi transfer data umum: MOV;
- instruksi transfer bersyarat: CMOVcc;
- instruksi operasi tumpukan: PUSH, PUSHA, PUSHAD, POP, POPA, POPAD;
- instruksi pertukaran: XCHG, XLAT, BSWAP;
- instruksi transfer selektor alamat atau deskriptor segmen: LEA, LDS, LES, LFS, LGS, LSS, dll.
operasi logika
Bagian petunjuk ini digunakan untuk melakukan operasi aritmatika dan logika, termasuk:
- instruksi penjumlahan: ADD, ADC;
- instruksi pengurangan: SUB, SBB;
- instruksi tambah satu: INC;
- instruksi penyesuaian desimal: AAA, AAS, DAA, DAS;
- instruksi kurangi satu: DEC;
- instruksi operasi perbandingan: CMP;
- instruksi perluasan tanda: CBW, CWDE, CDQE;
- instruksi perkalian: MUL, IMUL;
- instruksi pembagian: DIV, IDIV;
- instruksi operasi logika: AND, NOT, OR, XOR, TEST.
perintah pergeseran
Bagian instruksi ini digunakan untuk menggeser operand register atau memori sebanyak jumlah yang ditentukan.
- instruksi pergeseran logis ke kiri: SHL;
- instruksi pergeseran logis ke kanan: SHR;
- instruksi pergeseran kiri aritmatika: SAL;
- instruksi pergeseran kanan aritmatika: SAR;
- instruksi pergeseran kiri melingkar: ROL;
- instruksi pergeseran kanan melingkar: ROR, dll.
manipulasi bit
Bagian petunjuk ini mencakup:
- instruksi pengujian bit: BT;
- instruksi uji dan set bit: BTS;
- instruksi uji bit dan reset: BTR;
- instruksi uji bit dan negasi: BTC;
- instruksi pemindaian bit ke depan: BSF;
- instruksi pemindaian bit mundur: BSR.
peralihan kendali
Bagian ini mencakup:
- instruksi lompatan tanpa syarat: JMP;
- instruksi lompatan bersyarat: JCC, JCXZ;
- instruksi loop: LOOP, LOOPE, LOOPNE;
- instruksi panggilan prosedur: CALL;
- instruksi kembali subprosedur: RET;
- instruksi interupsi: INTn, INT3, INTO, IRET, dan seterusnya.
Manipulasi string
Bagian petunjuk ini digunakan untuk mengoperasikan rangkaian data, termasuk:
- instruksi transfer string: MOVS;
- instruksi perbandingan string: CMPS;
- instruksi pemindaian string: SCANS;
- instruksi penyimpanan string: STOS;
- instruksi pemuatan string: LODS.
Masukan Keluaran
Bagian petunjuk ini digunakan untuk bertukar data dengan perangkat periferal, termasuk perintah masukan port IN/INS dan perintah keluaran port OUT/OUTS.
Contoh Bahasa Perakitan
Berikut ini adalah program bahasa rakitan sederhana yang akan menjumlahkan dua bilangan:
; add.asm
;
; This program adds two numbers together
;
section .data
; These are the two numbers we will be adding
; We must store them in memory so the CPU can access them
num1: dw 1234
num2: dw 5678
section .text
; This is the code section of the program
; The code is a set of instructions for the CPU to execute
global _start
_start:
; Load the two numbers into registers
mov eax, [num1]
mov ebx, [num2]
; Add the numbers together
add eax, ebx
; Store the result in the num1 memory location
mov [num1], eax
; Exit the program
mov eax, 1
int 0x80
Fitur Bahasa Perakitan
1. Ketergantungan pada mesin
Ini adalah bahasa tingkat rendah yang berorientasi pada mesin, biasanya dirancang untuk komputer tertentu atau keluarga komputer tertentu. Karena merupakan representasi simbolis dari instruksi mesin, mesin yang berbeda memiliki bahasa perakitan yang berbeda.
2. Kecepatan tinggi dan efisiensi tinggi
Bahasa perakitan mempertahankan keunggulan bahasa mesin, serta memiliki karakteristik langsung dan sederhana. Bahasa ini dapat secara efektif mengakses dan mengontrol berbagai perangkat keras komputer, seperti disk, memori, CPU, port I/O, dll., serta menggunakan memori yang lebih sedikit dan memiliki kecepatan eksekusi yang tinggi. Bahasa ini merupakan bahasa pemrograman yang efisien.
3. Kompleksitas penulisan dan debugging
Karena perangkat keras dikendalikan secara langsung, dan tugas-tugas sederhana pun memerlukan banyak pernyataan bahasa perakitan, maka perlu mempertimbangkan semua aspek saat merancang program. Semua kemungkinan masalah harus dipertimbangkan, dan berbagai sumber daya perangkat lunak dan perangkat keras harus dialokasikan dan digunakan secara wajar. Dengan demikian, hal ini tak terhindarkan akan menambah beban bagi programmer. Demikian pula, saat melakukan debugging program, jika terjadi masalah dalam operasi program, akan sulit untuk menemukannya.
Keuntungan
Sebagai bahasa pemrograman generasi kedua yang berada di atas bahasa mesin, bahasa assembly juga memiliki banyak keunggulan:
- Dapat dengan mudah membaca status memori dan status antarmuka I/O perangkat keras.
- Kode yang ditulis dapat dieksekusi dengan akurat karena terdapat jauh lebih sedikit tahapan kompilasi.
- Sebagai bahasa tingkat rendah, bahasa ini sangat fleksibel.
Kekurangan
- Karena kode tersebut sangat monoton dan hanya memiliki sedikit karakter instruksi khusus, hal ini membuat kode menjadi bertele-tele dan sulit ditulis.
- Karena assembly masih perlu memanggil memori untuk menyimpan data sendiri, sehingga mudah terjadi bug, dan tidak mudah untuk melakukan debug.
- Bahkan jika sebuah program telah selesai dibuat, akan membutuhkan banyak waktu untuk memeliharanya di kemudian hari.
- Karena kekhususan mesin, hal ini menyebabkan masalah ketidakcocokan kode.
Bahasa Perakitan vs Bahasa Mesin
Perbedaan utama antara bahasa perakitan dan bahasa mesin adalah bahwa bahasa perakitan merupakan bahasa pemrograman tingkat rendah yang memerlukan program perakit (assembler) terpisah untuk menerjemahkannya menjadi kode mesin, sedangkan bahasa mesin merupakan representasi langsung dari kode mesin yang mendasarinya.
Bahasa perakitan lebih mudah dibaca oleh manusia daripada bahasa mesin, tetapi tetap cukup sulit untuk dibaca dan ditulis. Bahasa ini dirancang agar mendekati kode mesin asli, sehingga memudahkan programmer untuk memahami apa yang dilakukan kode tersebut. Namun, hal ini juga membuatnya lebih sulit untuk menulis kode yang portabel, karena kode tersebut sangat terkait dengan arsitektur mesin tertentu.
Sebaliknya, bahasa mesin adalah kode asli untuk mesin, dan tidak dapat dibaca oleh manusia. Bahasa ini dieksekusi secara langsung oleh prosesor, sehingga lebih efisien daripada bahasa perakitan. Namun, bahasa ini jauh lebih sulit untuk diprogram, karena programmer harus berurusan dengan instruksi kode mesin yang mendasarinya.
Sumber Daya untuk Belajar Bahasa Perakitan
Jika Anda ingin mempelajari lebih lanjut tentang bahasa rakitan, ada banyak sumber daya yang bisa Anda manfaatkan. Anda dapat menemukan buku-buku tentang bahasa rakitan di Amazon dan di toko buku setempat. Anda juga dapat mengikuti kursus daring di situs web seperti Coursera, edX, dan Udemy. Jika Anda ingin mempelajari lebih lanjut tentang arsitektur komputer, ada banyak buku yang membahas topik ini pula. Sumber-sumber daya ini dapat membantu Anda memahami apa itu bahasa rakitan serta pengaruhnya terhadap desain perangkat keras dan perangkat lunak komputer.



