Code: Alles auswählen
;- überprüft, ob (6) Zahlen in einem Bereich von (7) Zahlen (alles Byte-Werte) vorkommen
;- funktioniert auch mit ungeordneten Zahlenfolgen
;- "Helle" Klaus Helbing, 05.11.2006, PB v4.01
;- nutzt MMX und SSE
Global Anzahl.l = 1 ;hier für Test nur 1
Global Start.l
Global Z1.l = $0405070c ;sind die ersten vier Test-Zahlen (von 4,5,7,12,43,45)
Global Z2.l = $2b2df0f0 ;sind die letzten zwei Test-Zahlen mit 2 Platzhalter aufgefüllt
Global X1.w ; diese Platzhalter evtl. nicht nötig (?), ungleich Wert von unten (f1)!
Start = AllocateMemory(Anzahl*8) ;8 ist fast schon zwingend! Alignment!
;- Im RAM würden alle zu untersuchenden Zahlenfolgen stehen (im 8-ter Byte-Abstand)
!mov esi,[v_Start]
;- 8 Werte ins RAM schreiben für Test
!mov eax,50c1116h ;5,12,17,22,34,35,43 als Simulation vorhandener Werte im RAM
!mov [esi+4],eax
!mov eax,22232bf1h ;f1 als Platzhalter muss sein! Wert > max.möglicher Wert
!mov [esi],eax
!mov edx,0fdh ;irgend ein nicht möglicher Wert
!movd mm4,edx ;"Füllwert" ungleich Null
!mov eax,[v_Z1]
!movd mm1,eax
!psllq mm1,32 ;um 4 Bytes nach links verschieben
!mov eax,dword[v_Z2]
!movd mm2,eax
!por mm1,mm2 ;in mm1 stehen jetzt die 6 Zahlen (Z1 und Z2)
!movq mm3,mm1 ;mm1 sichern = Testzahlen
!movq mm0,[esi]
!movq mm5,mm0 ;mm0 sichern = Testfeld
;-------- zuerst die Linksverschiebung
!mov edi,5 ;abhängig von Anzahl der Zahlen!
W2:
!pcmpeqb mm0,mm3
!pmovmskb eax,mm0 ;für jede Übereinstimmung ist in al ein Bit gesetzt
!mov ecx,8
W1:
!shr al,1
!adc [v_X1],0
!dec ecx
!jnz l_w1
!dec edi
!jz l_w3
!psllq mm3,8
!por mm3,mm4
!movq mm0,mm5 ;mm0 wieder herstellen
!jmp l_w2
W3:
;-------- und jetzt die Rechtsverschiebung
!mov edi,6 ;abhängig von Anzahl der Zahlen!
!movq mm0,mm5 ;mm0 wieder herstellen
!movq mm3,mm1
!psrlq mm3,8
!mov edx,0fd000000h ;irgend ein nicht möglicher Wert
!movd mm4,edx ;"Füllwert" ungleich Null
!psllq mm4,32
W2R:
!pcmpeqb mm0,mm3
!pmovmskb eax,mm0 ;für jede Übereinstimmung ist in al ein Bit gesetzt
!mov ecx,8
W1R:
!shr al,1
!adc [v_X1],0
!dec ecx
!jnz l_w1r
!dec edi
!jz l_w3r
!psrlq mm3,8
!por mm3,mm4
!movq mm0,mm5 ;mm0 wieder herstellen
!jmp l_w2r
W3R:
MessageRequester("Übereinstimmungstest","Gefundene Übereinstimmungen : " + Str(X1))
!emms
End