Seite 1 von 1
Speicherbereich vervielfältigen
Verfasst: 17.09.2004 11:12
von Lebostein
Hallo,
ich habe zum Beispiel im Speicher eine 4-Byte-Long-Variable stehen. Diese möchte ich möglichst schnell mehrere Tausend male hintereinander in einen anderen Speicherbereich kopieren. Mit CopyMemory() ist das ja kein Problem:
Code: Alles auswählen
zeiger = 0
For count = 0 To 10000
CopyMemory(quelle, ziel + zeiger, 4)
zeiger + 4
Next count
Mein Frage: Gibt es dafür eine andere Möglichkeit? Evtl. einen Assemblerbefehl oder -routine, mit der man den Speicher mit einer immer wiederkehrenden Bitfolge füllen kann?
Verfasst: 17.09.2004 12:41
von topsoft
Hallo,
STOSD ist dein Freund. Der Inhalt von EAX wird an die Speicherstelle die durch ES:EDI angegeben ist kopiert. EDI wird dabei automatisch erhöht oder erniedrigt, je nach Zustand des Direction Flag. In Verbindung mit dem Rep Befehl ist das genau das was du brauchst.
Etwa so:
mov eax, der_zu_kopierende_wert
mov ecx, anzahl_der_wiederholungen
cld ;damit es aufsteigendgeht
rep stosd ;wiederhole bis ecx = 0
Da ich auf Arbeit bin habe ich das jetzt nicht getestet!
Gruß Topsoft
Verfasst: 17.09.2004 14:43
von NicTheQuick
Ich kann kein Assembler und würde es daher so lösen:
Code: Alles auswählen
Value.l = 4 ; wird überall hingeschrieben
*MemStart.LONG = AllocateMemory(1024)
*MemEnde = *MemStart + 1024
While *MemStart >= *MemEnde
*MemStart\l = Value
*MemStart + 4
Wend
PS.: Code nicht getestet.
Verfasst: 17.09.2004 15:19
von Sylvia
Vorschlag von topsoft im Klartext:
Code: Alles auswählen
*Buffer=AllocateMemory(10000*4) ; = 0-9999
CLD
MOV EAX, 4 ; Wert
MOV ECX, 10000 ; Anzahl Wiederholungen
MOV EDI, *Buffer ; Startadresse
!REP STOSD ; STOSD = dword-Transfer
Debug PeekL(*Buffer+9999*4)
Nicht vergessen...Inline-Assembler Unterstützung
einschalten !
Verfasst: 17.09.2004 16:16
von Lebostein
Vielen Dank! Genau so was habe ich gesucht.
Hab mich vor etlichen Jahren schon mal mit Assembler befasst, muss mich wohl mal wieder einarbeiten....