Вот, взято из AcedUtils:
Код:
{ G_SameLongs выполняет побайтное сравнение массивов 4-байтных элементов
(например, типа Integer), адресуемых P1 и P2. Количество элементов в каждом
из массивов задается параметром Count. Функция возвращает True, если все
соответствующие элементы обоих массивов равны, в противном случае возвращает
False. }
function G_SameLongs(P1, P2: Pointer; Count: Cardinal): Boolean;
ну и сама реализация
Код:
function G_SameLongs(P1, P2: Pointer; Count: Cardinal): Boolean;
asm
CMP EAX,EDX
JE @@ex
PUSH ESI
PUSH EBX
MOV ESI,ECX
AND ECX,$7
SHR ESI,3
JE @@nx
@@lp1: MOV EBX,[EAX]
CMP EBX,[EDX]
JNE @@zq1
MOV EBX,[EAX+4]
CMP EBX,[EDX+4]
JNE @@zq1
MOV EBX,[EAX+8]
CMP EBX,[EDX+8]
JNE @@zq1
MOV EBX,[EAX+12]
CMP EBX,[EDX+12]
JNE @@zq1
MOV EBX,[EAX+16]
CMP EBX,[EDX+16]
JNE @@zq1
MOV EBX,[EAX+20]
CMP EBX,[EDX+20]
JNE @@zq1
MOV EBX,[EAX+24]
CMP EBX,[EDX+24]
JNE @@zq1
MOV EBX,[EAX+28]
CMP EBX,[EDX+28]
JNE @@zq1
ADD EAX,32
ADD EDX,32
DEC ESI
JNE @@lp1
@@nx: JMP DWORD PTR @@tV[ECX*4]
@@ex: MOV EAX,1
RET
@@tV: DD @@tu0, @@tu1, @@tu2, @@tu3
DD @@tu4, @@tu5, @@tu6, @@tu7
@@zq1: POP EBX
POP ESI
XOR EAX,EAX
RET
@@tu7: MOV EBX,[EAX+ECX*4-28]
CMP EBX,[EDX+ECX*4-28]
JNE @@zq2
@@tu6: MOV EBX,[EAX+ECX*4-24]
CMP EBX,[EDX+ECX*4-24]
JNE @@zq2
@@tu5: MOV EBX,[EAX+ECX*4-20]
CMP EBX,[EDX+ECX*4-20]
JNE @@zq2
@@tu4: MOV EBX,[EAX+ECX*4-16]
CMP EBX,[EDX+ECX*4-16]
JNE @@zq2
@@tu3: MOV EBX,[EAX+ECX*4-12]
CMP EBX,[EDX+ECX*4-12]
JNE @@zq2
@@tu2: MOV EBX,[EAX+ECX*4-8]
CMP EBX,[EDX+ECX*4-8]
JNE @@zq2
@@tu1: MOV EBX,[EAX+ECX*4-4]
CMP EBX,[EDX+ECX*4-4]
JNE @@zq2
@@tu0: POP EBX
POP ESI
MOV EAX,1
RET
@@zq2: POP EBX
POP ESI
XOR EAX,EAX
end;
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.
Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
|