[MODULE] BIT - Bit & Nibble Zugriff!

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

[MODULE] BIT - Bit & Nibble Zugriff!

Beitrag von Mijikai »

Ein Modul für Bit & Nibble 8)
Viel Spaß!

Modul:

Code: Alles auswählen

;By Mijikai

DeclareModule BIT
  Declare.i Set(Target.i,Bit.i)
  Declare.i Get(Target.i,Bit.i)
  Declare.i Reset(Target.i,Bit.i)
  Declare.i Toggle(Target.i,Bit.i)
  Declare.i SetLowNibble(Target.i,Nibble.i)
  Declare.i SetHighNibble(Target.i,Nibble.i)
  Declare.i GetLowNibble(Target.i)
  Declare.i GetHighNibble(Target.i)
EndDeclareModule

Module BIT
   
  Procedure.i Set(Target.i,Bit.i)
    !mov rcx,[p.v_Target]
    !mov rdx,[p.v_Bit]
    !xor rax,rax
    !bts [rcx],rdx
    !setc al
    ProcedureReturn
  EndProcedure
  
  Procedure.i Get(Target.i,Bit.i)
    !mov rcx,[p.v_Target]
    !mov rdx,[p.v_Bit]
    !xor rax,rax
    !bt [rcx],rdx
    !setc al
    ProcedureReturn
  EndProcedure

  Procedure.i Reset(Target.i,Bit.i)
    !mov rcx,[p.v_Target]
    !mov rdx,[p.v_Bit]
    !xor rax,rax
    !btr [rcx],rdx
    !setc al
    ProcedureReturn
  EndProcedure
  
  Procedure.i Toggle(Target.i,Bit.i)
    !mov rcx,[p.v_Target]
    !mov rdx,[p.v_Bit]
    !xor rax,rax
    !btc [rcx],rdx
    !setc al
    ProcedureReturn
  EndProcedure
  
  Procedure.i SetLowNibble(Target.i,Nibble.i)
    !mov rcx,[p.v_Target]
    !mov rax,[rcx]
    !and rax,0F0h
    !or rax,[p.v_Nibble]
    !mov [rcx],rax
  EndProcedure
  
  Procedure.i SetHighNibble(Target.i,Nibble.i)
    !mov rcx,[p.v_Target]
    !mov rax,[rcx]
    !mov rdx,[p.v_Nibble]
    !and rdx,0Fh
    !shl rdx,04h
    !or rax,rdx
    !mov [rcx],rax
  EndProcedure
  
  Procedure.i GetLowNibble(Target.i)
    !mov rcx,[p.v_Target]
    !mov rcx,[rcx]
    !movzx rax,cl
    !and rax,0Fh
    ProcedureReturn
  EndProcedure
  
  Procedure.i GetHighNibble(Target.i)
    !mov rcx,[p.v_Target]
    !mov rcx,[rcx]
    !movzx rax,cl
    !sar rax,4h
    ProcedureReturn
  EndProcedure
  
EndModule
Beispiel:

Code: Alles auswählen

sample.a = 0
BIT::Set(@sample,4)
Debug BIT::Get(@sample,4)
BIT::Toggle(@sample,4)
Debug BIT::Get(@sample,4)
BIT::SetLowNibble(@sample,$A)
BIT::SetHighNibble(@sample,$F)
Debug Hex(sample,#PB_Ascii)
BIT::Reset(@sample,4)
Debug Hex(BIT::GetLowNibble(@sample),#PB_Ascii)
Debug Hex(BIT::GetHighNibble(@sample),#PB_Ascii)
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: [MODULE] BIT - Bit & Nibble Zugriff!

Beitrag von uweb »

Vielen Dank!

Es ist schon über 20 Jahre her, dass ich etwas mit Assembler gemacht habe. Da bin ich raus. Deswegen freue ich mich immer wenn ich gebrauchsfertigen Code finde.
Allerdings bekomme ich gleich für die erste Assembler-Anweisung einen Assmler error "illegal instruction" - noch mit dem 5.60-x86-Compiler unter Win7-64. Mache ich da irgend etwas falsch?

Nibbles scheinen ein interessantes Thema zu sein. Wenn ich es aber richtig sehe nutzt Du beim Aufruf nur ein Byte, empfängst aber ein Integer. Ich schätze mal, dass die CPU ohnehin immer mit Integer arbeitet. Dem Assembler-Vorteil gegenüber der AND-Variante steht also nicht nur der Procedure-Aufruf sondern auch die Umwandlung entgegen.

Wäre es nicht sinnvoller gleich 8 bzw 16 Nibbles (x86/x64) zu verwalten? Die Addresierung eines Nibbles könnte also auch in einem Nibble erfolgen.
Wären Macros bei so etwas nicht sinnvoller?
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Re: [MODULE] BIT - Bit & Nibble Zugriff!

Beitrag von Rings »

uweb hat geschrieben:Allerdings bekomme ich gleich für die erste Assembler-Anweisung einen Assmler error "illegal instruction" - noch mit dem 5.60-x86-Compiler unter Win7-64. Mache ich da irgend etwas falsch?
Nein, der Code ist nur für X64 Assembler geschrieben. X86 fehlt.
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: [MODULE] BIT - Bit & Nibble Zugriff!

Beitrag von uweb »

Danke, Rings!

PS
Bald gibt es mehr PB-Nutzer als FDP-Anhänger.
:)
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: [MODULE] BIT - Bit & Nibble Zugriff!

Beitrag von mk-soft »

Für x86 und x64

Bitshift and Rotation

Link http://www.purebasic.fr/english/viewtop ... 12&t=66891
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten