- push ecx\r
- push edx\r
-\r
- mov eax, [first_free]\r
-\r
- .loop:\r
- mov ecx, [eax]\r
- mov [prev_pointer], ecx\r
-\r
- mov ecx, [eax+4]\r
- mov [size], ecx\r
-\r
- mov ecx, [eax+8]\r
- mov [next_pointer], ecx\r
-\r
- cmp [size], ebx\r
- jae .found\r
- cmp [next_pointer], 0\r
- je .error\r
- mov eax, [next_pointer]\r
- jmp .loop\r
-\r
- .error:\r
- xor eax, eax\r
- jmp .end\r
-\r
- .found:\r
- mov ecx, [size]\r
- sub ecx, ebx\r
- jz .equal\r
-\r
- cmp [next_pointer], 0\r
- jne .next_exists\r
- cmp [prev_pointer], 0\r
- jne .prev_but_no_next\r
-\r
-\r
- ;----------------------------------------------;\r
- ; no other block exists; add new free block ;\r
- ; with the reminding space as free, and move ;\r
- ; "first free" to that block.. ;\r
- ;----------------------------------------------;\r
- mov ecx, eax ; move address to ecx and\r
- add ecx, ebx ; add size. ecx=end requested\r
- mov dword [ecx], 0 ; set new header's prev to 0\r
- mov edx, [size]\r
- sub edx, ebx ; remaining space in edx\r
- mov [ecx+4], edx ; save it to new header\r
- mov dword [ecx+8], 0 ; no next pointer..\r
-\r
- mov [first_free], ecx\r
- mov ebx, eax ; eax is unchanged from loop\r
- jmp .end\r
-\r
- ;----------------------------------------------;\r
- ; no next block exists, make a new header at ;\r
- ; the end of the requested size with the ;\r
- ; reminder of the free space, and update the ;\r
- ; prev header's next pointer.. ;\r
- ;----------------------------------------------;\r
- .prev_but_no_next:\r
- mov ecx, eax ; move address to ecx and\r
- add ecx, ebx ; add size. ecx=end requested\r
- mov edx, [prev_pointer] ; set prev for new header\r
- mov [ecx], edx ; set new header's prev to 0\r
- mov edx, [size]\r
- sub edx, ebx ; remaining space in edx\r
- mov [ecx+4], edx ; save it to new header\r
- mov dword [ecx+8], 0 ; no next pointer..\r
-\r
- mov [prev_pointer+8], ecx\r
- mov ebx, eax ; eax is unchanged from loop\r
- jmp .end\r
-\r
-\r
- ;----------------------------------------------;\r
- ; both next and previous blocks exists, make a ;\r
- ; new header at the end of the requested size ;\r
- ; with the reminder of the free space, move ;\r
- ; data from next block to the new one but add ;\r
- ; size so it gets right, then update all prev/ ;\r
- ; next pointers for total 3 blocks.. puh.. ;\r
- ;----------------------------------------------;\r
- .next_exists:\r
- cmp [prev_pointer], 0\r
- je .next_but_no_prev\r
-\r
- mov ecx, eax ; move address to ecx and\r
- add ecx, ebx ; add size. ecx=end requested\r
- mov edx, [prev_pointer] ; set prev for new header\r
- mov [ecx], edx ; set new header's prev\r
- mov edx, [size]\r
- sub edx, ebx\r
- mov ebx, [next_pointer+4]\r
- add edx, ebx ; remaining space in edx\r
- mov [ecx+4], edx ; save it to new header\r
- mov edx, [next_pointer] ; address to next block\r
- cmp dword [edx], 0\r
- je .no_next_next\r
- mov dword [edx], ecx ; update next-next's prev..\r
- mov dword [ecx+8], edx ; address to next pointer.\r
-\r
- mov [prev_pointer+8], ecx\r
- mov ebx, eax ; eax is unchanged from loop\r
- jmp .end\r
- .no_next_next:\r
- mov dword [edx], 0\r
- mov dword [ecx+8], 0\r
- mov [prev_pointer+8], ecx\r
- mov ebx, eax ; eax is unchanged from loop\r
- jmp .end\r
-\r
-\r
- ;----------------------------------------------;\r
- ; we allocated the first free block, do the ;\r
- ; same as above, except ignore the prev block ;\r
- ; part, and move the "first free". ;\r
- ;----------------------------------------------;\r
- .next_but_no_prev:\r
- mov ecx, eax ; move address to ecx and\r
- add ecx, ebx ; add size. ecx=end requested\r
- mov dword [ecx], 0 ; set new header's prev to 0\r
- mov edx, [size]\r
- sub edx, ebx\r
- mov ebx, [next_pointer+4]\r
- add edx, ebx ; remaining space in edx\r
- mov [ecx+4], edx ; save it to new header\r
- mov edx, [next_pointer] ; address to next block\r
- cmp dword [edx], 0\r
- je .no_next_next2\r
- mov dword [edx], ecx ; update next-next's prev..\r
- mov dword [ecx+8], edx ; address to next pointer.\r
-\r
- mov [first_free], ecx ; zero and update first free.\r
- mov ebx, eax ; eax is unchanged from loop\r
- jmp .end\r
- .no_next_next2:\r
- mov dword [edx], 0\r
- mov ecx, [ecx+8]\r
- mov dword [ecx], 0\r
- mov [prev_pointer+8], ecx\r
- mov ebx, eax ; eax is unchanged from loop\r
- jmp .end\r
-\r
-\r
- ;-----------------------------------------;\r
- ; requested == size ;\r
- ; I prefered coding this one.. ;) ;\r
- ;-----------------------------------------;\r
- .equal:\r
- cmp [next_pointer], 0\r
- jne .next_exists2\r
- cmp [prev_pointer], 0\r
- jne .prev_but_no_next2\r
- mov [first_free], 0\r
- mov ebx, eax ; eax is unchanged from loop\r
- jmp .end\r
-\r
- .prev_but_no_next2:\r
- mov dword [prev_pointer+8], 0\r
- mov ebx, eax ; eax is unchanged from loop\r
- jmp .end\r
-\r
- .next_exists2:\r
- cmp [prev_pointer], 0\r
- je .next_but_no_prev2\r
- mov ecx, [prev_pointer] ; update prev and next's\r
- mov edx, [next_pointer] ; headers to bypass this\r
- mov [ecx+8], edx ; chunk.\r
- mov [edx], ecx\r
- mov ebx, eax ; eax is unchanged from loop\r
- jmp .end\r
-\r
- .next_but_no_prev2:\r
- mov ecx, [eax+8] ; get address of next header\r
- mov dword [ecx], 0 ; set prev in next header to\r
- mov [first_free], ecx ; zero and update first free.\r
- mov ebx, eax ; eax is unchanged from loop\r
-\r
- .end:\r
- pop edx\r
- pop ecx\r
- ret\r
+ push ecx\r
+ push edx\r
+\r
+ mov eax, [first_free]\r
+\r
+ .loop:\r
+ mov ecx, [eax]\r
+ mov [prev_pointer], ecx\r
+\r
+ mov ecx, [eax+4]\r
+ mov [size], ecx\r
+\r
+ mov ecx, [eax+8]\r
+ mov [next_pointer], ecx\r
+\r
+ cmp [size], ebx\r
+ jae .found\r
+ cmp [next_pointer], 0\r
+ je .error\r
+ mov eax, [next_pointer]\r
+ jmp .loop\r
+\r
+ .error:\r
+ xor eax, eax\r
+ jmp .end\r
+\r
+ .found:\r
+ mov ecx, [size]\r
+ sub ecx, ebx\r
+ jz .equal\r
+\r
+ cmp [next_pointer], 0\r
+ jne .next_exists\r
+ cmp [prev_pointer], 0\r
+ jne .prev_but_no_next\r
+\r
+\r
+ ;----------------------------------------------;\r
+ ; no other block exists; add new free block ;\r
+ ; with the reminding space as free, and move ;\r
+ ; "first free" to that block.. ;\r
+ ;----------------------------------------------;\r
+ mov ecx, eax ; move address to ecx and\r
+ add ecx, ebx ; add size. ecx=end requested\r
+ mov dword [ecx], 0 ; set new header's prev to 0\r
+ mov edx, [size]\r
+ sub edx, ebx ; remaining space in edx\r
+ mov [ecx+4], edx ; save it to new header\r
+ mov dword [ecx+8], 0 ; no next pointer..\r
+\r
+ mov [first_free], ecx\r
+ mov ebx, eax ; eax is unchanged from loop\r
+ jmp .end\r
+\r
+ ;----------------------------------------------;\r
+ ; no next block exists, make a new header at ;\r
+ ; the end of the requested size with the ;\r
+ ; reminder of the free space, and update the ;\r
+ ; prev header's next pointer.. ;\r
+ ;----------------------------------------------;\r
+ .prev_but_no_next:\r
+ mov ecx, eax ; move address to ecx and\r
+ add ecx, ebx ; add size. ecx=end requested\r
+ mov edx, [prev_pointer] ; set prev for new header\r
+ mov [ecx], edx ; set new header's prev to 0\r
+ mov edx, [size]\r
+ sub edx, ebx ; remaining space in edx\r
+ mov [ecx+4], edx ; save it to new header\r
+ mov dword [ecx+8], 0 ; no next pointer..\r
+\r
+ mov [prev_pointer+8], ecx\r
+ mov ebx, eax ; eax is unchanged from loop\r
+ jmp .end\r
+\r
+\r
+ ;----------------------------------------------;\r
+ ; both next and previous blocks exists, make a ;\r
+ ; new header at the end of the requested size ;\r
+ ; with the reminder of the free space, move ;\r
+ ; data from next block to the new one but add ;\r
+ ; size so it gets right, then update all prev/ ;\r
+ ; next pointers for total 3 blocks.. puh.. ;\r
+ ;----------------------------------------------;\r
+ .next_exists:\r
+ cmp [prev_pointer], 0\r
+ je .next_but_no_prev\r
+\r
+ mov ecx, eax ; move address to ecx and\r
+ add ecx, ebx ; add size. ecx=end requested\r
+ mov edx, [prev_pointer] ; set prev for new header\r
+ mov [ecx], edx ; set new header's prev\r
+ mov edx, [size]\r
+ sub edx, ebx\r
+ mov ebx, [next_pointer+4]\r
+ add edx, ebx ; remaining space in edx\r
+ mov [ecx+4], edx ; save it to new header\r
+ mov edx, [next_pointer] ; address to next block\r
+ cmp dword [edx], 0\r
+ je .no_next_next\r
+ mov dword [edx], ecx ; update next-next's prev..\r
+ mov dword [ecx+8], edx ; address to next pointer.\r
+\r
+ mov [prev_pointer+8], ecx\r
+ mov ebx, eax ; eax is unchanged from loop\r
+ jmp .end\r
+ .no_next_next:\r
+ mov dword [edx], 0\r
+ mov dword [ecx+8], 0\r
+ mov [prev_pointer+8], ecx\r
+ mov ebx, eax ; eax is unchanged from loop\r
+ jmp .end\r
+\r
+\r
+ ;----------------------------------------------;\r
+ ; we allocated the first free block, do the ;\r
+ ; same as above, except ignore the prev block ;\r
+ ; part, and move the "first free". ;\r
+ ;----------------------------------------------;\r
+ .next_but_no_prev:\r
+ mov ecx, eax ; move address to ecx and\r
+ add ecx, ebx ; add size. ecx=end requested\r
+ mov dword [ecx], 0 ; set new header's prev to 0\r
+ mov edx, [size]\r
+ sub edx, ebx\r
+ mov ebx, [next_pointer+4]\r
+ add edx, ebx ; remaining space in edx\r
+ mov [ecx+4], edx ; save it to new header\r
+ mov edx, [next_pointer] ; address to next block\r
+ cmp dword [edx], 0\r
+ je .no_next_next2\r
+ mov dword [edx], ecx ; update next-next's prev..\r
+ mov dword [ecx+8], edx ; address to next pointer.\r
+\r
+ mov [first_free], ecx ; zero and update first free.\r
+ mov ebx, eax ; eax is unchanged from loop\r
+ jmp .end\r
+ .no_next_next2:\r
+ mov dword [edx], 0\r
+ mov ecx, [ecx+8]\r
+ mov dword [ecx], 0\r
+ mov [prev_pointer+8], ecx\r
+ mov ebx, eax ; eax is unchanged from loop\r
+ jmp .end\r
+\r
+\r
+ ;-----------------------------------------;\r
+ ; requested == size ;\r
+ ; I prefered coding this one.. ;) ;\r
+ ;-----------------------------------------;\r
+ .equal:\r
+ cmp [next_pointer], 0\r
+ jne .next_exists2\r
+ cmp [prev_pointer], 0\r
+ jne .prev_but_no_next2\r
+ mov [first_free], 0\r
+ mov ebx, eax ; eax is unchanged from loop\r
+ jmp .end\r
+\r
+ .prev_but_no_next2:\r
+ mov dword [prev_pointer+8], 0\r
+ mov ebx, eax ; eax is unchanged from loop\r
+ jmp .end\r
+\r
+ .next_exists2:\r
+ cmp [prev_pointer], 0\r
+ je .next_but_no_prev2\r
+ mov ecx, [prev_pointer] ; update prev and next's\r
+ mov edx, [next_pointer] ; headers to bypass this\r
+ mov [ecx+8], edx ; chunk.\r
+ mov [edx], ecx\r
+ mov ebx, eax ; eax is unchanged from loop\r
+ jmp .end\r
+\r
+ .next_but_no_prev2:\r
+ mov ecx, [eax+8] ; get address of next header\r
+ mov dword [ecx], 0 ; set prev in next header to\r
+ mov [first_free], ecx ; zero and update first free.\r
+ mov ebx, eax ; eax is unchanged from loop\r
+\r
+ .end:\r
+ pop edx\r
+ pop ecx\r
+ ret\r