IASM: Bitmaske prüfen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

IASM: Bitmaske prüfen?

Beitrag von Mok »

Hallo.
Ich bräuchte ein schnelles Mittel, um zu überprüfen, ob in einer Variable eine bestimmte Bitmaske gesetzt ist. Laut i8086.de bietet sich hierfür die TEST-Instruktion an, indem ich in der Prüfmaske die zu überprüfenden Bits auf 1 setze, alle anderen auf 0. Laut dieser Beschreibung müsste im folgenden Programm 3x True ausgegeben werden.

Code: Alles auswählen

Define.l MyLong = %10010111101

!MOV eax, [v_MyLong]

!TEST eax, 00000000001b ; Bit 0 gesetzt?
!JZ @f
  Debug "True 1"
  
!@@:

!TEST eax, 10000100000b ; Bit 10 oder Bit 5 gesetzt?
!JZ @f
  Debug "True 2"

!@@:

!TEST eax, 00100000010b ; Bit 1 oder Bit 8 gesetzt?
!JNZ @f
  Debug "True 3"

!@@:
Verstehe ich da etwas falsch?
Gruß, Mok.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: IASM: Bitmaske prüfen?

Beitrag von STARGÅTE »

zuerst mal
MyLong = %10010111101
" ; Bit 1 oder Bit 8 gesetzt?"
das ist auf jedenfall False, weil 1 und 8 (0) sind.

Wenn du testen willst, ob ein Bit gesetzt ist, nutze einfach die PB Funktionen ...

Code: Alles auswählen

Define.l MyLong
MyLong = %10010111101
;         09876543210

If MyLong&(1<<0) ; Bit 0 gesetzt?
  Debug "True 1"
EndIf

If MyLong&(1<<5|1<<10) ; Bit 10 oder Bit 5 gesetzt?
  Debug "True 2"
EndIf

If MyLong&(1<<1|1<<8) ; Bit 1 oder Bit 8 gesetzt?
  Debug "True 3"
EndIf
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: IASM: Bitmaske prüfen?

Beitrag von Mok »

STARGÅTE hat geschrieben:zuerst mal
MyLong = %10010111101
" ; Bit 1 oder Bit 8 gesetzt?"
das ist auf jedenfall False, weil 1 und 8 (0) sind.
Das ist mir klar, darum habe ich auch JNZ statt JZ benutzt.
STARGÅTE hat geschrieben:

Code: Alles auswählen

MyLong&(1<<5|1<<10)
Ich seh das Programm vor lauter Code nicht mehr. Danke :allright:
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: IASM: Bitmaske prüfen?

Beitrag von Danilo »

Mok hat geschrieben:Laut dieser Beschreibung müsste im folgenden Programm 3x True ausgegeben werden.
EAX wird halt durch DEBUG verändert.

Code: Alles auswählen

Define.l MyLong = %10010111101

!MOV eax, [v_MyLong]
!TEST eax, 00000000001b ; Bit 0 gesetzt?
!JZ @f
  Debug "True 1"
  
!@@:

!MOV eax, [v_MyLong]
!TEST eax, 10000100000b ; Bit 10 oder Bit 5 gesetzt?
!JZ @f
  Debug "True 2"

!@@:

!MOV eax, [v_MyLong]
!TEST eax, 00100000010b ; Bit 1 oder Bit 8 gesetzt?
!JNZ @f
  Debug "True 3"

!@@:
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten