Już w średnio zaawansowanych programach pojawia się potrzeba dynamicznego rezerwowania pamięci, w czasie działania programu, nie wiedząc z góry, ile pamięci będzie potrzeba. Na przykład, użytkownik podaje nam rozmiar tablicy a my musimy taką tablicę utworzyć i na niej operować (nie znając wcześniej nawet maksymalnego jej rozmiaru). Rozwiązaniem takich problemów jest właśnie dynamiczna alokacja pamięci. Pod Linuksem pamięć alokuje się funkcją sys_brk (ustalającą najwyższy dostępny adres w sekcji danych). Przyjmuje ona jeden argument:
Jeśli coś się nie udało, sys_brk zwróci -1 (i ustawi odpowiednio zmienną errno) lub też zwróci ujemny kod błędu.
Oczywiście, argument funkcji może być większy (alokacja) lub mniejszy (zwalnianie pamięci) od wartości zwróconej przez sys_brk przy EBX=0.
Jak widać, teoria nie jest skomplikowana. Przejdźmy więc może do przykładu. Ten krótki programik ma za zadanie zaalokować 16kB pamięci (specjalnie tak dużo, żeby przekroczyć 4kB - rozmiar jednej strony pamięci - i udowodnić, że pamięć rzeczywiście została przydzielona) i wyzerować ją (normalnie zapisywanie po nieprzydzielonej pamięci skończy się zamknięciem programu przez system).
; Dynamiczna alokacja pamięci pod Linuksem ; ; Autor: Bogdan D., bogdandr (at) op.pl ; ; kompilacja: ; ; nasm -f elf -o alok_linux.o alok_linux.asm ; ld -o alok_linux alok_linux.o section .text global _start _start: mov eax, 45 ; sys_brk xor ebx, ebx int 80h add eax, 16384 ; tyle chcemy zarezerwować mov ebx, eax mov eax, 45 ; sys_brk int 80h cmp eax, 0 jl .problem ; jeśli błąd, to wychodzimy i nic się ; nie wyświetli mov edi, eax ; EDI = najwyższy dostępny adres sub edi, 4 ; EDI wskazuje na ostatni dostępny DWORD mov ecx, 4096 ; tyle DWORDów zaalokowaliśmy xor eax, eax ; będziemy zapisywać zera std ; idziemy wspak rep stosd ; zapisujemy cały zarezerwowany obszar cld ; przywracamy flagę DF do normalnego stanu mov eax, 4 mov ebx, 1 mov ecx, info mov edx, info_dl int 80h ; wyświetlenie napisu .problem: mov eax, 1 xor ebx, ebx int 80h section .data info db "Udana alokacja pamieci.", 10 info_dl equ $ - info