
Code: Select all
Procedure O_CompareMemory(wert1.l,wert2.l,l.l)
;Erstmal die Werte in Eax und Ebx setzen
MOV eax,wert2
MOV ebx,wert1
;dann die länge in ECX und EDX laden
MOV ecx,l
;EDX erhält den wert von EDX%4
MOV edx,l
Or edx,-4
XOR edx,-4
;ECX wird durch 4 geteilt
SAR ecx,2
;Um ne endlosschleife zu verhindern, gucken ob ecx=0, dann direkt zum EDX-Part springen
CMP ecx,0
JE l_o_cm_middle
;Wenn ecx>0, wird immer Longweise, also 4 Byte auf einmal verglichen
O_CM_Begin:
MOV edi,DWord[eax]
CMP edi,DWord[ebx]
JNE l_o_cm_unlike
ADD eax,4
ADD ebx,4
DEC ecx
JNZ l_o_cm_begin
o_cm_middle:
;Direkt weg, wenn net Modulo 4
CMP edx,0
JE l_o_cm_is
MOV ecx,0
;Hier werden die übrigen bis zu 3 Byte einzeln verglichen
O_CM_Begin_B:
MOV cl,byte[eax]
CMP cl,byte[ebx]
JNE l_o_cm_unlike
INC eax
INC ebx
DEC edx
JNZ l_o_cm_begin_b
O_cm_is:
ProcedureReturn 1
O_CM_Unlike:
ProcedureReturn 0
EndProcedure
Code: Select all
;Test 1 228 Byte
text1.s="Das ist ein seehr langer text mit etwa 200 Zeichen, ok, noch nicht ganz, kann aber bald was werden, wenn ich nur lange mit dem Tippen von Buchstaben in dieses Fenster fortfahre und mir nicht einreden lasse, das mache keinen Sinn"
text2.s="Das ist ein seehr langer text mit etwa 200 Zeichen, ok, noch nicht ganz, kann aber bald was werden, wenn ich nur lange mit dem Tippen von Buchstaben in dieses Fenster fortfahre und mir nicht einreden lasse, das mache keinen Sinn"
x=GetTickCount_()
For a=1 To 100000
l1=CompareMemory(text1,text2,228)
Next
x2=GetTickCount_()
For a=1 To 100000
l2=o_CompareMemory(@text1,@text2,228)
Next
MessageRequester("Ergebnis:","1.) "+Str(x2-x)+" , "+Str(l1)+Chr(13)+"2.) "+Str(GetTickCount_()-x2)+" , "+Str(l2))
;Test 2, 400 kb
adra=AllocateMemory(400003)
adrb=AllocateMemory(400003)
For a=0 To 400002
PokeB(adra+a,Random(255))
Next
CopyMemory(adra,adrb,400003)
PokeB(adra+400002,19)
x=GetTickCount_()
For a=1 To 10000
l1=CompareMemory(adra,adrb,400003)
Next
x2=GetTickCount_()
For a=1 To 10000
l2=o_CompareMemory(adra,adrb,400003)
Next
MessageRequester("Ergebnis:","1.) "+Str(x2-x)+" , "+Str(l1)+Chr(13)+"2.) "+Str(GetTickCount_()-x2)+" , "+Str(l2))
