Speicherbereich vervielfältigen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Speicherbereich vervielfältigen

Beitrag 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?
topsoft
Beiträge: 67
Registriert: 16.09.2004 11:55
Wohnort: nrw

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Benutzeravatar
Sylvia
verheiratet<br>1. PureGolf-Gewinner
Beiträge: 487
Registriert: 29.08.2004 09:42
Wohnort: Old Europe

Beitrag 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 !
Basic Pur = PureBasic
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag 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....
Antworten