Assembly 32 bit & Penggunaan C Library dalam assembly (Linux) author: mywisdom "I'm getting dizzy with my linux worm so i spent a little time playing with this reminds me of my childhood trying to recall back old memories when there's segmentation form" .::before we start Beberapa section dalam linux assembly (untuk pembagian memori): - section text -> ditandai sbg read only karena berisi kode2 asm yang udah kita rakit. - section bss -> berisi variabel2 global yang belum ditentukan isinya - section data -> berisi data 2 variabel global yang udah ditentuin isinya - section stack -> berisi data2 variabel dari inputan user misal dari argc. .::calling c library from assembly codes Untuk menggunakan c library melalui kode assembly, maka kita akan memakai gaya pemrograman yang berbeda, agar gcc bisa menemukan entry point, berikut ini adalah kerangka dasar program asm yang akan menggunakan c library: global main ;dibutuhkan gcc untuk menemukan entry point main: push ebp mov ebp,esp ; rutin untuk mempersiapkan stack frame (ga diperlukan klo program gak pake operasi stack) ;kode assembly apa aja taroh di sini mov esp,ebp pop ebp ;restore ebp -> menghancurkan stack frame sebelum return to linux ret untuk include fungsi library c kita menggunakan statemen: extern misal: extern printf ; digunakan memanggil fungsi printf berikut ini contoh kode assembly yang memanggil fungsi printf (not a good sample): --------------------------- global main extern printf ;include fungsi printf dari library c section .data pawn db "you got pawned !", 10, 0 ; pawn=you got pawned format db "%s", 0 ;formatnya adalah string main push ebp mov ebp,esp mov eax,pawn ;offset pawn disimpan di register akumulator push eax ;simpan eax di stack mov eax,format ; di sini alamat offset format baru disimpan di stack push eax; karena stack memiliki sistem lifo (last in first out) -> print("%s",variabel) call printf mov esp,ebp pop ebp ret ------------------------- kompile : nasm -f elf print.asm gcc -o print print.o jika dijalankan makan akan melakukan printf string you got pawned # ./print you got pawned ! kode assembly di atas bisa kita persingkat menjadi seperti ini: ------------------------ global main extern printf ;include fungsi printf dari library c section .data pawn db "you got pawned !", 10, 0 ; pawn=you got pawned format db "%s", 0 ;formatnya adalah string main push dword pawn ;simpan alamat offset pawn ke stack push dword format; karena stack memiliki sistem lifo (last in first out) -> print("%s",variabel) call printf add esp,8 ;clean stack ret