forked from KolibriOS/kolibrios
161 lines
3.4 KiB
PHP
161 lines
3.4 KiB
PHP
|
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
|
||
|
}
|