99 lines
1.7 KiB
NASM
99 lines
1.7 KiB
NASM
format ELF
|
|
public _add as 'heap.add'
|
|
public del as 'heap.del'
|
|
|
|
include '../include/macros.inc'
|
|
extrn exit
|
|
|
|
section '.bss' writeable
|
|
_heap:
|
|
db 0xB ; flag
|
|
dd 4 ; size
|
|
dd 4096 ; available memory
|
|
|
|
rd 4096
|
|
|
|
section '.text' executable
|
|
_add:
|
|
prelude
|
|
|
|
mov ecx, [ebp+2*4] ; size
|
|
mov eax, _heap
|
|
xor edx, edx
|
|
|
|
.loop:
|
|
cmp [eax], byte 0
|
|
je .empty
|
|
|
|
mov bl, [eax]
|
|
bt bx, 0
|
|
jc .busy
|
|
|
|
inc eax
|
|
cmp edx, 0
|
|
jne @f
|
|
mov edx, eax
|
|
@@:
|
|
cmp ecx, [eax]
|
|
jl .more
|
|
je .equal
|
|
; less
|
|
sub ecx, [eax]
|
|
add eax, [eax]
|
|
add eax, 4
|
|
jmp .loop
|
|
.equal:
|
|
mov [edx], byte 9
|
|
mov ebx, [ebp+2*4]
|
|
mov [edx+1], ebx
|
|
add edx, 5
|
|
mov [ebp+2*4], edx
|
|
postlude
|
|
ret
|
|
.more:
|
|
mov ebx, edx
|
|
add ebx, [ebp+2*4]
|
|
mov [ebx], byte 9
|
|
inc ebx
|
|
mov eax, [eax]
|
|
sub eax, ecx
|
|
mov [ebx], eax
|
|
|
|
add ebx, [ebp+2*4]
|
|
mov [edx-1], byte 9
|
|
mov edx, ebx
|
|
|
|
add edx, 5
|
|
mov [ebp+2*4], edx
|
|
postlude
|
|
ret
|
|
|
|
.empty:
|
|
cmp edx, 0
|
|
jne @f
|
|
mov edx, eax
|
|
@@:
|
|
je @f
|
|
dec edx
|
|
@@:
|
|
jmp .equal
|
|
|
|
.busy:
|
|
xor edx, edx
|
|
inc eax
|
|
add eax, [eax]
|
|
add eax, 4
|
|
|
|
jmp .loop
|
|
|
|
del:
|
|
push eax
|
|
mov eax, [esp+4*2]
|
|
sub eax, 5
|
|
and byte [eax], 254
|
|
mov eax, [esp+4]
|
|
mov [esp+4*2], eax
|
|
pop eax
|
|
add esp, 4
|
|
ret
|