Assembly language / bahasa rakitan merupakan bahasa tingkat rendah yang berjalan dilevel mesin, berupa instruksi yang sudah disepakati, disusun dari bilangan biner yang dikumpulkan dalam satuan bilangan hex. Kegunaan bahasa ini tentu saja sama seperti bahasa permrograman lainnya, untuk memerintah si komputer berdasarkan kode yang kita buat. Namun lebih spesifik, assembly merupakan bahasa tingkat rendah yang tidak enak dibaca oleh manusia yang di era bahasa tingkat tinggi banyak digunakan salah satunya untuk analisa program (reverse engineer), membuat shellcode, dll.
gambar 1 (diambil dari om vivek securitytube.net)
% Register
Register merupakan salah satu hal penting yang sering dijumpai ketika mempelajari bahasa assembly, karena register bisa dibilang sebagai "tempat penyimpanan". Terdapat beberapa macam register dengan masing-masing kegunaannya. Namun yang sering digunakan adalah general purpose register, yaitu eax, ebx, ecx, dan edx untuk processor 32bit, rax, rbx, rcx, rdx untuk 64bit.
gambar 2 : register (tutorialspoint.com)
% System Call
System call (sys call) merupakan kumpulan fungsi / instruksi yang ada pada kernel sebuah sistem operasi. kernel ini bisa dibilang sebagai jembatan untuk interaksi antara manusia dan mesin. Berikut beberapa contoh syscall pada linux 32bit.
%eax | Name | %ebx | %ecx | %edx | %esx | %edi |
---|---|---|---|---|---|---|
1 | sys_exit | int | - | - | - | - |
2 | sys_fork | struct pt_regs | - | - | - | - |
3 | sys_read | unsigned int | char * | size_t | - | - |
4 | sys_write | unsigned int | const char * | size_t | - | - |
... |
Sebagai contoh, untuk menampilkan tulisan "hello" pada bahasa pyhton:
print "hello"
Berbeda dengan asm, untuk mencetak string hello pada layar, maka kita harus memanggil syscall sys_write dengan detail register eax = 4 (no sys_write), ebx = 1 (stdout, file descriptor), ecx="hello", edx = size "hello"
maka, secara singkatnya dapat ditulis :
mov eax, 4 mov ebx, 1 mov ecx, "hello" mov edx, 5
syscall tidak akan berjalan tanpa perintah interrupt (0x80 atau 80h), intruksi ini digunakan sebagai sinyal kepada kernel untuk melaksakan syscall yang dipanggil. maka kode lengkapnya:
mov eax, 4 mov ebx, 1 mov ecx, "hello" mov edx, 5 int 0x80
Referensi syscall number dan fungsinya : http://asm.sourceforge.net/syscall.html% Say Hello
Setelah membaca penjelasan singkat diatas, simak kode hello.asm berikut ini
section .data pesan db 'Hello asm, nice to meet you',0xa lenpesan equ $-pesan section .text global _start _start: mov eax, 4 ;panggil sys_write (4) mov ebx, 1 ;file descriptor, stdout mov ecx, pesan ;string yang ditampilkan mov edx, lenpesan ;panjang string yg ditampilkan int 0x80 ;interrupt, execute sys_write mov eax, 1 ;panggil sys_exit (1) int 0x80 ;interrupt, execute sys_exit
Kode ini berjalan pada OS linux 32bit, simpan kedalam file dengan nama hello.asm
Compile file tersebut (pada percobaan ini saya menggunakan nasm), hasil compile menghasilkan file object hello.o
langkah selanjutnya, link object tersebut dengan linker
Proses ini menghasilkan file dengan nama hello yang merupakan file executable, jalankan dengan perintah ./hello, atau jika tidak bisa, berikan permission chmod +x hello, kemudian ./hello
Hello asm, nice to meet you !!
Sekian penjelasan singkat dari saya, semoga bermanfaat.
Referensi :
- The Art of Assembly Language
- Tutorials Point - Assembly Language
- Youtube - windows asm
- http://en.wikibooks.org/wiki/X86_Assembly/Interfacing_with_Linux