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