Seite 1 von 1

[MODULE] BIT - Bit & Nibble Zugriff!

Verfasst: 13.09.2017 20:56
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)

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

Verfasst: 20.09.2017 08:15
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?

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

Verfasst: 20.09.2017 08:26
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.

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

Verfasst: 20.09.2017 09:02
von uweb
Danke, Rings!

PS
Bald gibt es mehr PB-Nutzer als FDP-Anhänger.
:)

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

Verfasst: 20.09.2017 14:41
von mk-soft
Für x86 und x64

Bitshift and Rotation

Link http://www.purebasic.fr/english/viewtop ... 12&t=66891