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


Anmelden zum Antworten