global sys_write global sys_read global sys_errno global sys_alloc global sys_free global sys_exit section .text generic_sys_call_3: push ebp mov ebp, esp push ebx mov ebx, [ebp+8] mov ecx, [ebp+12] mov edx, [ebp+16] int 80h mov edx, eax and edx, 0fffff000h cmp edx, 0fffff000h jnz .okay mov [sys_errno], eax xor eax, eax not eax ; -1 .okay: pop ebx mov esp, ebp pop ebp ret sys_write: mov eax, 4 jmp generic_sys_call_3 sys_read: mov eax, 3 jmp generic_sys_call_3 sys_alloc: push ebp mov ebp, esp mov eax, 45 ; brk() xor ebx, ebx int 80h mov [initial_break], eax mov eax, 45 mov ebx, [initial_break] add ebx, [ebp+8] int 80h cmp eax, [initial_break] jz .error mov eax, [initial_break] jmp .quit .error: mov eax, -1 .quit: mov esp, ebp pop ebp ret sys_free: push ebp mov ebp, esp mov eax, 45 mov ebx, [ebp+8] int 80h mov esp, ebp pop ebp ret sys_exit: push ebp mov ebp, esp mov eax, 1 mov ebx, [ebp+8] int 80h mov esp, ebp pop ebp ret section .bss sys_errno resd 1 section .data initial_break dd 0