Setiap jenis CPU memiliki bahasa mesin-nya masing-masing. Instruksi bahasa mesin dinyatakan dalam bilangan numeric (Binari) yang tersimpan sebagai byte dimemori. Masing-masing instruksi memiliki kode numerik yang unik yang disebut sebagai “operation code” atau “opcode”. Setiap perintah diawali dengan suatu opcode dan dapat diikuti oleh data.
Bahasa Assembly
Karena Bahasa Mesin sangat rumit untuk diprogram secara langsung (karena berupa bilangan numeric), sehingga dibuat suatu symbol pelambang (mnemonic) untuk mewakili masing-masing instruksi tersebut yang lebih mudah diingat dan dibaca oleh manusia (bayangkan apakah anda lebih mudah mengingat nama teman anda atau nomor telepon rumahnya?).
Apa itu Assembler ?
bahasa Assembly menggunakan mnemonic sebagai penganti bagi instruksi bahasa Mesin, sehingga program yang ditulis dalam bahasa Assembly tidak dapat secara langsung dieksekusi oleh CPU. Dalam hal ini Assembler berperan untuk menterjemahkan mnemonic tersebut menjadi bahasa Mesin yang dapat dieksekusi oleh CPU. Untuk melakukan assembler dapat menggunakan program DEBUG.EXE maupu berbagai aplikasi compiler seperti TASM, MASM, NASM, FASM maupun emulator8086.
Apa itu disassembler ?
Jika proses Assembler menterjemahkan program yang ditulis dengan bahasa Assembly menjadi bahasa mesin, maka proses disassembler adalah mengembalikan suatu binary program menjadi (mnemonic) bahasa Assembly. Tujuan dari disassembler adalah untuk keperluaan reversed engineering, dimana kita mempelajari maupun memperbaiki suatu software tanpa memiliki source code, misalnya untuk mempelajari teknik penyerangan suatu program malware untuk dibuat anti malwarenya, ataupun memeriksa kemungkinan suatu program terdapat payload.
Mengapa belajar Assembly
Assembly biasanya digunakan untuk kegiatan penting tertentu. Mengapa? Karena lebih mudah memprogram dengan menggunakan bahasa tingkat tinggi dari pada menggunakan assembly. Pemakaian assembly akan mengakibatkan program sulit untuk dialihkan ke platform yang berbeda (ingat bahwa masing-masing CPU memiliki bahasa Mesin yang berbeda), dan berikut ini adalah alasan mengapa anda mempelajari bahasa Assembly :
1. Program yang ditulis dengan assembly akan lebih cepat dan lebih kecil dibandingkan dengan kode yang dihasilkan dengan menggunakan compiler.
2. Assembly memungkinkan akses langsung ke fasilitas system hardware yang mungkin tidak dapat dilakukan dengan menggunakan bahasa tingkat tinggi (membaca/menulis data langsung ke sector, memformat harddisk).
3. Mempelajari assembly akan membantu pengertian yang lebih mendalam bagaimana computer bekerja.
4. Mempelajari pemrograman assembly akan membantu pengertian yang lebih baik tentang bagaimana compiler dan bahasa tingkat tinggi seperti C bekerja.
5. Dengan mengerti bahasa Assembly kamu dapat melakukan proses disassembly untuk menganalisa program tertentu.
CONTOH KODE ASSEMBLY SEDERHANA
mov ax, 26
- memindah angka 26 ke register AX
mov bx, 3
- memindah angka 3 ke register BX
mov ax, 3
mov bx, 5
add ax, bx - memindah angka 3 ke register AX, lalu memindahkan angka 5 ke register BX, lalu menambahkan AX dan BX, sehingga hasilnya adalah 8. Angka 8 tersimpan di register AX.
mov ax, 10
mov bx, 15
add ax, bx - memindah angka 10 ke register AX, lalu memindah angka 15 ke register BX, lalu menambahkan AX dan BX, sehingga hasilnya adalab 25. Angka 25 tersebut tersimpan di register AX.
mov ax, 8
add ax, 3 - memindah angka 8 ke register AX, lalu menambahkannya dengan angka 3.
mov ax, 0
cmp ax, 0
je fungsi1 - memindah 0 ke register AX, lalu mambandingkan AX dengan 0. Jika sama, maka kode akan pergi ke fungsi fungsi1.
mov ax, 5
add ax, 3
cmp ax, 8
je fungsi1 - memindahkan 5 ke register AX, lalu menambahkannya dengan 3 (hasilnya 8 dan hasilnya ada di register AX). Lalu AX dibandingkan dengan angka 8. Jika sama, maka kode akan pergi ke fungsi1.
mov dx, 0
mov ax, 6
mov bx, 4
div bx - memindahkan 0 ke DX, 6 ke AX dan 4 ke BX. Kemudian AX dibagi dengan BX (6 dibagi 4). Hasilnya disimpan di register AX dan sisanya disimpan di register DX. Sekarang, AX bernilai 1 dan DX bernilai 2.
mov dx, 0
mov ax, 25
mov bx, 8
div bx - memindahkan 0 ke DX, 25 ke AX dan 8 ke BX. Kemudian AX dibagi dengan BX (25 dibagi 8). Hasilnya akan disimpan di register AX dan sisanya akan disimpan di register DX. Dalam hal ini, register AX bernilai 3 dan DX bernilai 1.
mov ax, 1
mov bx, 0
and ax, bx - memindahkan 1 ke register AX dan 0 ke register BX. Lalu AX diberi operator DAN dengan BX (AX ^ BX). Dalam hal ini, hasilnya adalah 0. Angka 0 ini disimpan di register AX.
mov ax, 0
or ax, 1 - memindahkan 0 ke register AX, lalu register AX diberi operator ATAU dengan BX (AX v BX). Dalam hal ini, hasilnya adalah 1. Angka 1 ini disimpan di register AX.
mov al, 3
mov bl, 4
mul bl - memindahkan 3 ke register AL dan 4 ke BL. Lalu AL dikali BL, dan hasil ya disimpan di register AL.
mov al, 20
mov bl, 4
mul bl- memindahkan 20 ke register AL dan 4 ke register BL. Lalu AL dikalikan BL, dan hasilnya disimpan di register AL.
CATATAN:
Sebagian besar operasi aritmatika, hasilnya selalu disimpan di register AX.
mov ax, 0
cmp ax, 0
je fungsi1 - memindah 0 ke register AX, lalu mambandingkan AX dengan 0. Jika sama, maka kode akan pergi ke fungsi fungsi1.
mov ax, 5
add ax, 3
cmp ax, 8
je fungsi1 - memindahkan 5 ke register AX, lalu menambahkannya dengan 3 (hasilnya 8 dan hasilnya ada di register AX). Lalu AX dibandingkan dengan angka 8. Jika sama, maka kode akan pergi ke fungsi1.
mov dx, 0
mov ax, 6
mov bx, 4
div bx - memindahkan 0 ke DX, 6 ke AX dan 4 ke BX. Kemudian AX dibagi dengan BX (6 dibagi 4). Hasilnya disimpan di register AX dan sisanya disimpan di register DX. Sekarang, AX bernilai 1 dan DX bernilai 2.
mov dx, 0
mov ax, 25
mov bx, 8
div bx - memindahkan 0 ke DX, 25 ke AX dan 8 ke BX. Kemudian AX dibagi dengan BX (25 dibagi 8). Hasilnya akan disimpan di register AX dan sisanya akan disimpan di register DX. Dalam hal ini, register AX bernilai 3 dan DX bernilai 1.
mov ax, 1
mov bx, 0
and ax, bx - memindahkan 1 ke register AX dan 0 ke register BX. Lalu AX diberi operator DAN dengan BX (AX ^ BX). Dalam hal ini, hasilnya adalah 0. Angka 0 ini disimpan di register AX.
mov ax, 0
or ax, 1 - memindahkan 0 ke register AX, lalu register AX diberi operator ATAU dengan BX (AX v BX). Dalam hal ini, hasilnya adalah 1. Angka 1 ini disimpan di register AX.
mov al, 3
mov bl, 4
mul bl - memindahkan 3 ke register AL dan 4 ke BL. Lalu AL dikali BL, dan hasil ya disimpan di register AL.
mov al, 20
mov bl, 4
mul bl- memindahkan 20 ke register AL dan 4 ke register BL. Lalu AL dikalikan BL, dan hasilnya disimpan di register AL.
CATATAN:
Sebagian besar operasi aritmatika, hasilnya selalu disimpan di register AX.
Sources :
1. http://tutor-os-indo.heck.in/pengertian-bahasa-assembly-2.xhtml
2. https://anindazahra.wordpress.com/2013/10/27/pengenalan-bahasa-assembly-dan-bahasa-mesin/