13 ; shrinks array (4byte) by shifting blocks left
14 ; args: buffer, buffer_len, shift_pos (index that gets destroyed)
16 ; eax: location of new buffer
20 %define _BUFFER_LEN 12
23 %define BLOCK_OFFSET 8 ; mem location of block to be destroyed
32 mov eax, DWORD [ebp+_BUFFER_LEN]
33 sub eax, [ebp+_SHIFT_POS]
35 mov [ebp-SHIFT_LEN], eax
37 str_offset [ebp+_BUFFER], [ebp+_SHIFT_POS]
38 mov [ebp-BLOCK_OFFSET], eax
40 ; free string to be destoryed first
41 mov eax, DWORD [ebp-BLOCK_OFFSET]
47 mov eax, DWORD [ebp-SHIFT_LEN]
51 mov eax, DWORD [ebp-BLOCK_OFFSET]
54 push DWORD [ebp-BLOCK_OFFSET]
57 ; realloc to shrink the array
58 mov eax, DWORD [ebp+_BUFFER_LEN]
63 push DWORD [ebp+_BUFFER]
65 mov [ebp-NEW_BUFFER], eax
71 mov eax, [ebp-NEW_BUFFER]
77 ; grows array by shifting blocks right
78 ; args: buffer, buffer_len, shift_pos (new uninitalized index)
80 ; eax: location of new buffer
83 %define _BUFFER_LEN 12
86 %define BLOCK_OFFSET 8 ; mem location of block to be destroyed
94 ; realloc to make memory bigger first
95 mov eax, DWORD [ebp+_BUFFER_LEN]
100 push DWORD [ebp+_BUFFER]
102 mov [ebp-NEW_BUFFER], eax
105 mov eax, DWORD [ebp+_BUFFER_LEN]
106 sub eax, [ebp+_SHIFT_POS]
107 mov [ebp-SHIFT_LEN], eax
109 str_offset [ebp-NEW_BUFFER], [ebp+_SHIFT_POS]
110 mov [ebp-BLOCK_OFFSET], eax
113 mov eax, DWORD [ebp-SHIFT_LEN]
117 push DWORD [ebp-BLOCK_OFFSET]
118 mov eax, DWORD [ebp-BLOCK_OFFSET]
127 mov eax, [ebp-NEW_BUFFER]