diff options
Diffstat (limited to 'calls.asm')
-rw-r--r-- | calls.asm | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/calls.asm b/calls.asm new file mode 100644 index 0000000..7d45fa7 --- /dev/null +++ b/calls.asm @@ -0,0 +1,77 @@ +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 |