Segmen-Segmen Program di Dalam Memori : * Data Segment (Data + BSS + Heap) * Stack * Code segment atau bisa juga disebut segment text Secara lebih detail : - Segmen .text Bagian kode-kode eksekusi program utama yang akan diload ke memori, di mana section ini merupakan read only -Segmen .data Bagian ini merupakan bagian untuk pendeklarasian variabel dengan ukuran yang sudah fix. -Segmen .bss Bagian ini merupakan bagian deklarasi variabel yang tidak diisi. misal: ------------- section .bss nm: resw 10 ------------- - Daerah Heap Bagian heap dimulai di akhir segment .bss - Segmen stack Bagian ini bekerja dengan sistem LIFO (Last in First Out), merupakan daerah yang menyimpan informasi sementara. jika digambarkan kurang lebih seperti ini: "It's ALL About LIFO (Last in First Out)" untuk memahami cara kerja stack mari kita buat sample program dengan push (menyimpan ke stack): "saatnya bertele tele sebentar" ----------------------- global _start section .text _start: push ebp mov ebp,esp push 'AAAA' push 'BBBB' push 'CCCC' push 'DDDD' push 'EEEE' push 'FFFF' push 'GGGG' push 'HHHH' push 1 pop eax int 80h ------------------------- lakukan kompile dengan opsi -g : nasm -f elf stack.asm ld -o stack stack.o examine dengan gdb: ---------------------------------- mywisdom# gdb -q stack (gdb) l 1 global _start 2 section .text 3 _start: 4 push ebp 5 mov ebp,esp 6 push 'AAAA' 7 push 'BBBB' 8 push 'CCCC' 9 push 'DDDD' 10 push 'EEEE' (gdb) l 11 push 'FFFF' 12 push 'GGGG' 13 push 'HHHH' 14 push 1 15 pop eax 16 int 80h (gdb) b 6 Breakpoint 2 at 0x8048083: file stack.asm, line 6. (gdb) run The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /root/c/stack Breakpoint 2, 0x08048083 in _start () (gdb) p $esp $4 = (void *) 0xbfbfea30 (gdb) p $ebp $5 = (void *) 0xbfbfea30 ----------------------- karena perintah: -------------------------- mov ebp,esp -------------------------- --------------------- (gdb) b 7 Breakpoint 1 at 0x8048088: file stack.asm, line 7. (gdb) run Starting program: /root/c/stack Breakpoint 1, 0x08048088 in _start () (gdb) i r eax 0x0 0 ecx 0x0 0 edx 0x0 0 ebx 0x0 0 esp 0xbfbfea2c 0xbfbfea2c ebp 0xbfbfea30 0xbfbfea30 esi 0x0 0 edi 0x0 0 eip 0x8048088 0x8048088 eflags 0x202 514 cs 0x33 51 ss 0x3b 59 ds 0x3b 59 es 0x3b 59 fs 0x3b 59 gs 0x3b 59 (gdb) --------------------- kita bisa lihat ada perubahan : ----------------------------- esp 0xbfbfea2c (3217025580) ebp 0xbfbfea30 (3217025584) --------------------------- di sini kita bisa lihat dari top of stack telah dipush word pertama 'AAAA' : --------------------------- (gdb) x/s 0xbfbfea2c 0xbfbfea2c: "AAAA" (gdb) -------------------------- push 'BBBB': esp 0xbfbfea28 (3217025576) ebp 0xbfbfea30 (3217025584) (gdb) x/s 0xbfbfea28 0xbfbfea28: "BBBBAAAA" (gdb) ------------ push "CCCC": esp 0xbfbfea24 (3217025572) ebp 0xbfbfea30 (3217025584) (gdb) x/s 0xbfbfea24 0xbfbfea24: "CCCCBBBBAAAA" (gdb) --------------- push "DDDD" esp 0xbfbfea20 (3217025568) ebp 0xbfbfea30 (3217025584) (gdb) x/s 0xbfbfea20 0xbfbfea20: "DDDDCCCCBBBBAAAA" (gdb) --------------------- push "EEEE" esp 0xbfbfea1c (3217025564) ebp 0xbfbfea30 (3217025584) (gdb) x/s 0xbfbfea1c 0xbfbfea1c: "EEEEDDDDCCCCBBBBAAAA" (gdb) --------------- s/d HHHH: esp 0xbfbfea10 (3217025552) ebp 0xbfbfea30 (3217025584) (gdb) x/s 0xbfbfea10 0xbfbfea10: "HHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA" (gdb) ------------------ Dari gambaran di atas kita sudah mengetahui cara kerja stack dengan operasi push, saat terjadi push nilai esp setiap kali kita melakukan push selalu bergeser ke alamat memori yang lebih kecil, Selisih antara ebp dan esp ---- 0xbfbfea30-0xbfbfea10 = 20h = 32 desimal = jumlah karakter yang telah dipush. selanjutnya kita akan melakukan tes pop : misal kita edit program tadi kita tambahkan pop: ------------------------ global _start section .text _start: push ebp mov ebp,esp push 'AAAA' push 'BBBB' push 'CCCC' push 'DDDD' push 'EEEE' push 'FFFF' push 'GGGG' push 'HHHH' pop eax pop eax pop eax pop eax pop eax pop eax pop eax pop eax push 1 pop eax int 80h ------------------------- dengan : pop eax berarti kita memindahkan top stack ke register eax.