|
|
| Посл.отвђт | Сообщен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 |