lang equ ru ; ; Assembler ; SMALL ; CODE ; Arrays ; Processing ; Libary ; ; Ver 0.04 ; ; This macro iterates through an array of elements, ; processing each element using the specified process. ; modificate eax,{ebx},{ecx},edx,esi,[edi],[ebp] macro array_processing object_array,process { movt edi,object_array movt ebp,process call array_processing_proc if ~ defined array_processing_used array_processing_used equ 1 jmp end_ap array_processing_proc: push ecx push ebx mov ecx,[edi] ; dword contain quantity of elements mov ebx,[edi+4] ; dword contain size of each element add edi,8 ap_read_next: ;pop ebx ;pop ecx pushad call ebp ;eax ;process popad ;push ecx ;push ebx add edi,ebx dec ecx jnz ap_read_next pop ebx pop ecx ret end_ap: end if } ; This macro iterates through an array of elements, ; processing each element using the specified process ; if object finded ina array macro returned ; with CF=0 and address of element in edi. ; if object not finded macro return CF=1 ; process must be return CF=0 if value euqal finded value ; and CF=1 if value not equal ; modificate eax,{ebx},{ecx},edx,esi,[edi],[ebp] macro array_find object_array,process { movt edi,object_array movt ebp,process call array_find_proc if ~ defined array_find_used array_find_used equ 1 jmp end_af array_find_proc: push ecx push ebx mov ecx,[edi] ; dword contain quantity of elements mov ebx,[edi+4] ; dword contain size of each element add edi,8 af_read_next: pushad call ebp ;eax ;process popad jnc af_finded add edi,ebx dec ecx jnz af_read_next ; not finded stc ; if not finded CF = 1 af_finded: ; if finded CF = 0 pop ebx pop ecx ret end_af: end if } ; ; process may get offests of elements from registers. macro compmas object_array_1,object_array_2,process { local loo,loo2 ;lea,[oa+8] mov esi,object_array_2 ; current position add esi,8 mov ecx,[object_array_2] ; dword contain quantity of elements mov ebx,[object_array_2+4] ; dword contain size of each element mov eax,0 loo2: push eax mov edi,object_array_1 ; current position add edi,8 mov ebp,[object_array_1] ; dword contain quantity of elements mov edx,[object_array_1+4] ; dword contain size of each element mov eax,0 ;count loo: pushad call process popad add edi,edx inc eax cmp eax,ebp jne loo add esi,ebx pop eax inc eax cmp eax,ecx jne loo2 } macro array_processing_nocall object_array,process { local read_next lea edi,[object_array+8] mov ecx,[object_array] ; dword contain quantity of elements read_next: pushad call process popad add edi,[object_array+4] ; edi = edi + size of one element dec ecx jnz read_next } macro array_find_nocall object_array,process { local read_next,finded lea edi,[object_array+8] ; edi = current position mov ecx,[object_array] ; dword contain quantity of elements read_next: pushad call process popad jnc finded add edi,[object_array+4] ; dword contain size of each element dec ecx jnz read_next ; not finded stc ; if not finded CF = 1 finded: ; if finded CF = 0 }