bits 32 section .text mmap2 equ 192 munmap equ 91 ; asm/unistd_32.h PROT_READ equ 0x1 PROT_WRITE equ 0x2 MAP_ANONYMOUS equ 0x20 MAP_PRIVATE equ 0x02 ; bits/mman.h ; void *mmap_alloc(size_t ile [ebp+8]) global mmap_alloc mmap_alloc: push ebp mov ebp, esp ; ramka stosu push ebx push edi push esi ; rejestry zarezerwowane dla f-cji wywolujacej xor ebx, ebx ; NULLujemy (ABI mowi, ze NULL == 0) void *addr mov ecx, [ebp+8] ; size_t length - podany do funkcji parametr mov edx, PROT_READ | PROT_WRITE ; int prot mov esi, MAP_ANONYMOUS | MAP_PRIVATE ; int flags mov edi, -1 ; int fd ; w ebp powinien sie jeszcze znalezc offset, ale mmap go ignoruje i dziala ; poprawnie bez niego, wiec w ogole go nie przekazujemy mov eax, mmap2 ; numer wywolania do eax int 0x80 ; wynik wywolania systemowego jest w eax, zwracamy go jako wynik funkcji pop esi pop edi pop ebx ; przywracamy rejestry mov esp, ebp pop ebp ret ; i powracamy do f-cji wywolujacej ; int mmap_free(void* p [ebp+8],size_t ile [ebp+12]) global mmap_free mmap_free: push ebp mov ebp, esp push ebx mov eax, munmap mov ebx, [ebp+8] mov ecx, [ebp+12] int 0x80 pop ebx mov esp, ebp pop ebp ret