Bitopeartion: Bit auf 0 setzen?



  • Hallo!
    Dass man ein Bit mit BTS auf 1 setzen kann ist mir geläufig, also z.B.

    mov eax, cr0
    bts eax, 31
    mov cr0, eax
    

    So kann man z.B. Paging Bit im Prozessorregister CR0 auf 1 setzen. Aber ich würde gerne genau das gegenteil tun, also ein Bit auf 0 setzen. Nehmen wir der Einfachheit halber doch mal das obige Beispiel. Also wie kann ich nach der oberen Operation das Bit wieder zurück auf 0 setzen?

    Vielen Dank schonmal!



  • "bts" steht für "set bit". Das Gegenstück heißt dann entweder "btr" (für "reset") oder "btc" (für "clear"), wäre meine Vermutung.



  • Christoph schrieb:

    "bts" steht für "set bit". Das Gegenstück heißt dann entweder "btr" (für "reset") oder "btc" (für "clear"), wäre meine Vermutung.

    Leider nicht ganz und zudem sind diese Befehle auch weitestgehend eher Relikte aus der Prae-Pentium-Zeit.

    bts steht fuer "Bit Test and Set" (entsprechend gibt es noch btr (reset), btc (complement) oder einfach bt). Dieser Befehl sichert das angegebene Bit in das CF und setzt es dann im Operanden.
    Dh. eher nicht einfach fuer das Setzen eines Bits gedacht - vor allem nicht besonders sinnvoll mit einer Konstanten als 2. Operand.

    Normalerweise setzt man Bits einfach mit einer or-Verknuepfung und loescht bits mit einer and-Verknuepfung - so auch in Assembler mit den Befehlen "or" und "and".



  • Nobuo T schrieb:

    ... auch weitestgehend eher Relikte aus der Prae-Pentium-Zeit.

    Wuerde ich nicht sagen. Gerade in heutigen Zeiten mit Multiprocessing sind diese Befehle interessant, da sie garantieren das nur ein Prozessor eine Variable modifiziert.



  • xor eax, eax
    


  • Hmmmmm schrieb:

    Nobuo T schrieb:

    ... auch weitestgehend eher Relikte aus der Prae-Pentium-Zeit.

    Wuerde ich nicht sagen. Gerade in heutigen Zeiten mit Multiprocessing sind diese Befehle interessant, da sie garantieren das nur ein Prozessor eine Variable modifiziert.

    Wo hast du das denn her? 😕



  • Gara schrieb:

    xor eax, eax
    

    setzt das komplette eax register auf 0.

    and eax, 0xFFFFFFFE löscht nur das niedrigste bit.



  • Nobuo T schrieb:

    Hmmmmm schrieb:

    Nobuo T schrieb:

    ... auch weitestgehend eher Relikte aus der Prae-Pentium-Zeit.

    Wuerde ich nicht sagen. Gerade in heutigen Zeiten mit Multiprocessing sind diese Befehle interessant, da sie garantieren das nur ein Prozessor eine Variable modifiziert.

    Wo hast du das denn her? 😕

    naja, btc ist atomic und du kannst damit direkt auf nem memorybereich arbeiten. (damit es multiprozessor safe ist, musst du lock davor schreiben denke ich).



  • rapso schrieb:

    Nobuo T schrieb:

    Hmmmmm schrieb:

    Nobuo T schrieb:

    ... auch weitestgehend eher Relikte aus der Prae-Pentium-Zeit.

    Wuerde ich nicht sagen. Gerade in heutigen Zeiten mit Multiprocessing sind diese Befehle interessant, da sie garantieren das nur ein Prozessor eine Variable modifiziert.

    Wo hast du das denn her? 😕

    naja, btc ist atomic und du kannst damit direkt auf nem memorybereich arbeiten. (damit es multiprozessor safe ist, musst du lock davor schreiben denke ich).

    Jup. Ohne lock bringt das nichts.
    Ansonsten ist sowas atomic evtl. fuer eine kritische Sektion zu gebrauchen o.Ae., stimmt.



  • Diese Befehle sind schon von Haus aus "gelockt". Man braucht kein "lock" mehr.



  • ich glaube nur die befehle mit x im prefix haben ein lock von haus an


Anmelden zum Antworten