El nucleo proporciona la llamada al sistema sys_brk() para asignar memoria sin necesidad de moverla mas tarde. Esta llamada asigna memoria justo detras de la imagen de la aplicacion en la memoria. Esta funcion del sistema le permite establecer la direccion mas alta disponible en la seccion de datos.
Esta llamada al sistema toma un parametro, que es la direccion de memoria mas alta que se necesita establecer. Este valor se almacena en el registro EBX.
En caso de cualquier error, sys_brk() devuelve -1 o devuelve el propio codigo de error negativo. El siguiente ejemplo demuestra la asignacion de memoria dinamica.
EJEMPLO:
El siguiente programa asigna 16kb de memoria usando el sistema sys_brk():
section .data
msg db '16kb asignados', 10
len equ $ - msg
section .text
global _start
_start:
mov eax, 45 ; Cargamos 45 a eax
mov ebx, ebx ; Se hace solo para eetar seguro que ebx este limpio
int 0x80
add eax, 16384 ; Agregamos 16384 a eax, que es igual a 16kb
mov ebx, eax ; Lo movemos a ebx
mov eax, 45 ; Volvemos a cargar 45 para llamada al sistema
int 0x80
cmp eax, 0 ; Compara eax con 0
jl exit ; Salta a exit si el resultado es menor que
mov edi, eax ; Movemos eax, a edi
sub edi, 4 ; Restamos 4 a edi
mov ecx, 4096 ; Agregamos 4069 a ecx, este funcionara como contador
xor eax, eax ; Establece eax en 0
std ; Establece la direccion de flujo desendente (decre edi)
rep stosd ; Repite stosd. Almacena ceros de 32 bits y apunta a edi
cld ; Restablece el flujo en modo desendente
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, len
int 0x80
exit:
mov eax, 1
xor ebx, ebx
int 0x80