.o's to .so
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
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
|
||||
Reference in New Issue
Block a user