· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Снова битовые поля...

Посл.отвђт Сообщенiе


Дата: Апр 25, 2003 11:39:58

К примеру есть:

BITC RECORD fcBitA:1, fcBitB:1, fcBitC:1, fcBitD:1, fcDummyX:28

.data
bitA BITC <>

bit1 dd 0
bit2 dd 0
bit3 db 0
bit4 db 0

.code
begin:
;устанавливаем в 1
or bitA, 1
or bitA, 2
or bitA, 4
or bitA, 8

end begin

вопрос - как сделать типа

mov bit1, bitA.fcBitA
mov bit2, bitA.fcBitB
...
и т.д. ?


Дата: Апр 25, 2003 12:48:53 · Поправил: P2M

[code]
; mov bit1, bitA.fcBitA

test bitA.fcBitA, MASK bitA.fcBitA
jz clear

set:
or bit1, MASK bitA.fcBitA
jmp short skip

clear:
and bit1, not MASK bitA.fcBitA

skip:
[/code]


Дата: Апр 25, 2003 13:45:21

P2M Спасибо.
Но что-то MASK делает у меня не то что надо :(
(может руки кривые, но дебугер показывает ерунду)Вот что я нарыл - куском кода - надеюсь поймете

.486
.model flat, stdcall
option casemap :none ; case sensitive
incall macro incl
include c:\masm32\include\incl.inc
includelib c:\masm32\lib\incl.lib
endm
; ###################################################################### ###
include c:\masm32\include\windows.inc
incall user32
incall kernel32

BITC RECORD fcBitA:1, fcBitB:1, fcBitC:1, fcBitD:1, fcDummyX:28

.data
bitA BITC <0>

bit1 dq 0
bit2 dd 0
bit3 db 0
bit4 db 0

msgA db "Simple A" ,0
msgB db "Simple B" ,0
msgC db "Simple C" ,0
msgD db "Simple D" ,0
.code

begin:

or bitA, 1 ; bitA.fcBitA = 1
or bitA, 2 ; bitA.fcBitB = 1

or bitA, 4 ; bitA.fcBitC = 1
and bitA, not 4 ; bitA.fcBitC = 0

or bitA, 8 ; bitA.fcBitD = 1

mov al, BYTE PTR bitA; первый fcBitA
shr eax, 0 ; для первого бита можно и без
and eax, 1
mov BYTE PTR bit1, al

mov al, BYTE PTR bitA
shr eax, 1 ; второй fcBitB
and eax, 1
mov BYTE PTR bit2, al

mov al, BYTE PTR bitA
shr eax, 2 ; третий fcBitC
and eax, 1
mov BYTE PTR bit3, al

mov al, BYTE PTR bitA
shr eax, 3 ; четвертый fcBitD
and eax, 1
mov BYTE PTR bit4, al


;если, скажем, в структуре BITC fcBitB:2
; or bitA, 1 ; bitA.fcBitA = 1

; or bitA, 2 ; bitA.fcBitB = 1
; or bitA, 4 ; bitA.fcBitB = 2
;и все остальное
; or bitA, 8 ; bitA.fcBitC = 1
; and bitA, not 8 ; bitA.fcBitC = 0
; or bitA, 16 ; bitA.fcBitD = 1

; mov al, BYTE PTR bitA
; shr eax, 1 ; второй fcBitB
; and eax, 3 ; чтоб получить значение 1 или 2
; mov BYTE PTR bit2, al




cmp BYTE PTR bit1, 1
jne @F
invoke MessageBox, 0, addr msgA, 0, 0
@@:
cmp bit2, 1
jne @F
invoke MessageBox, 0, addr msgB, 0, 0
@@:
cmp bit3, 1
jne @F
invoke MessageBox, 0, addr msgC, 0, 0
@@:
cmp bit4, 1
jne @F
invoke MessageBox, 0, addr msgD, 0, 0
@@:

ret
end begin


Дата: Апр 26, 2003 09:37:55

megadeth
Вы невнимательно читали ответы в предыдущей теме.

Биты в RECORD'ах нумеруются от старших к младшим, т.е.:
BITC RECORD fcBitA:1, fcBitB:1, fcBitC:1, fcBitD:1, fcDummyX:28
надо понимать так:
BITC.fcBitA - 31-й бит
BITC.fcBitB - 30-й бит
BITC.fcBitC - 29-й бит
BITC.fcBitD - 28-й бит
BITC.fcDummyX - биты с 27-го по нулевой включительно

Для установки бита/тов BITC.fcBitA _надо_ использовать:
or bitA,MASK BITC.fcBitA

Для очистки бита/тов BITC.fcBitC _надо_ использовать:
and bitA,not MASK BITC.fcBitC

Для проверки бита BITC.fcBitA _надо_ использовать:
test bitA,MASK BITC.fcBitA
jnz @@bit_is_set
jz @@bit_is_clear

Для проверки битов BITC.fcDummyX _можно_ использовать:
mov eax,bitA
and eax,MASK BITC.fcDummyX
cmp eax,MASK BITC.fcDummyX
jz @@all_bits_is_set
jnz @@present_cleaned_bits

По поводу программы.
Вы хотите получить только три MessageBox'а, т.е. без "Simple C"?
Тогда программа может выглядеть так:
[code]
.486
.model flat, stdcall
option casemap :none ; case sensitive

incall macro incl
include c:\masm32\include\incl.inc
includelib c:\masm32\lib\incl.lib
endm

include c:\masm32\include\windows.inc
incall user32
incall kernel32

BITC RECORD fcBitA:1, fcBitB:1, fcBitC:1, fcBitD:1, fcDummyX:28

.data
bitA BITC <0>

msgA db "Simple A" ,0
msgB db "Simple B" ,0
msgC db "Simple C" ,0
msgD db "Simple D" ,0

bit1 dq 0
bit2 dd 0
bit3 db 0
bit4 db 0

.code

begin:

;
; приготовить bitA 0D000'0000h
;
and bitA,not MASK BITC.fcDummyX
or bitA,MASK BITC.fcBitA
or bitA,MASK BITC.fcBitB
and bitA,not MASK BITC.fcBitC
or bitA,MASK BITC.fcBitD


;
; заполнить bit1, bit2, bit3, bit4
;
test bitA,MASK BITC.fcBitA
jz @F
mov BYTE PTR bit1,1
@@:
test bitA,MASK BITC.fcBitB
jz @F
mov bit2,1
@@:
test bitA,MASK BITC.fcBitC
jz @F
mov bit3,1
@@:
test bitA,MASK BITC.fcBitD
jz @F
mov bit4,1
@@:

;
; вывод сообщений
;
cmp BYTE PTR bit1,1
jne @F
invoke MessageBox, 0, addr msgA, 0, 0
@@:
cmp bit2,1
jne @F
invoke MessageBox, 0, addr msgB, 0, 0
@@:
cmp bit3,1
jne @F
invoke MessageBox, 0, addr msgC, 0, 0
@@:
cmp bit4,1
jne @F
invoke MessageBox, 0, addr msgD, 0, 0
@@:

ret
end begin
[/code]


Дата: Апр 29, 2003 11:27:57

Спасибо - все работает - виноват - не внимателен :)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.078