Bereich gleich 0 setzen
-
Wie kann man mit möglich wenigen Clocks einen 64k-Bereich gleich 0 setzen ? Ich nehme dafür setmem, aber ich habe über den Debugger herrausgefunden, dass setmem auf memcpy zurückgreift. Wie würdet ihr so einen Bereich löschen ?
-
mit STOSD
-
Angenommen du möchtest die 64k im Bildschirmspeicher löschen (also ab Adresse 0xa000:0000) Und wir sind nehme ich an im Realmode
cld ; String-Operation vorwärts ausführen mov es, 0xa000 ; Bildschirmspeicher als Segment mov edi, 0 ; Anfang des Speichers mov ecx, 16000 ; Zahl der Wiederholungen / 4 (da wir ganze DWORDs verschieben!) mov eax, 0 ; Der zu speichernde Wert, sprich 0 rep stosd ; Speichere solange 0 bis ecx = 0 ist
Das sollte eigentlich die sache erledigen (wie immer ohe Gewähr ;))
-
Wieso dies?:
*
mov edi, 0 ; Anfang des Speichers
mov ecx, 16000 ; Zahl der Wiederholungen / 4 (da wir ganze DWORDs verschieben!)
*
Ist zwar nicht langsamer, als nur die 16Bit-Register zu beschreiben, aber der Code ist groesser :p
In 16Bit Code benutzt rep zum Zaehlen nur cx, egal, ob eine 32Bit-Instruction folgt oder nicht. Genauso benutzt stosd nur di. bei nem Overflow (0000FFFC => 00000000) ist edi anschliessend 0.
-
achja...aber ist wohl net sooo dramatisch War die gewohnheit wie lich wegen stosd sonst überall 32-bit-register benutzt habe
-
Und wenn ich einen Puffer löschen will ? Gebe ich da den Pointer als Adresse an ?
-
Jo..du musst nur sehen, dass es auf das Segment zeigt in dem deine Daten liegen und di muss dementsprechend auf den beginn des puffers zeigen