1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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
|