blob: ef80957784cbd4eebeb9b400966bef35c62a15e7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# void *allocate(int n)
#
# A naive memory allocator that simply retrieves some new space from the OS.
# It is not possible to deallocate the memory again.
.globl allocate
.type allocate, @function
allocate:
push %rdi
# 1. Find the current end of the data segment.
movq $12, %rax # brk
xorq %rdi, %rdi # 0 means we retrieve the current end.
syscall
# 2. Add the amount of memory we want to allocate.
pop %rdi # the argument
push %rax # current end, which is where the allocated memory will start
addq %rax, %rdi # compute the new end
movq $12, %rax # brk
syscall
pop %rax # the old end, which is the address of our allocated memory
ret
|