purebasic.info

PureBasic forum
Текущее время: Вт апр 24, 2018 9:38 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Смотрим биты
СообщениеДобавлено: Пн мар 20, 2017 1:29 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 567
Благодарил (а): 2 раз.
Поблагодарили: 31 раз.
Пункты репутации: 9
Для отладки и прочего бывает нужно посмотреть что же там с битами,как они установлены?
Предложу вашему вниманию процедурки:
Обе они выводят результат в виде символа 2-байта(utf_16) для каждого сканируемого бита
1-я работает по принципу записи результата в заранее созданный строковый буфер
2-я собственно сама создаёт буфер и выводит результат уже строкой(что может замедлить работу)
Сканируемые биты выводятся справа налево так как они будут загружены в регистр процессора. :roll:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
ProcedureCDLL Memory_Bin_BUFF$_Len(*s,*s1,y);адрес памяти,буфер вывода результата,количество сканируемых бит  
 ;Автор под псевдонимом Сергейчик
 !push esi
  !push edi
  !mov dword esi,[esp+12]
  !mov dword edi,[esp+16]
  !mov eax,[esp+20];Количиство просматриваемых бит
  ;;;;;;;;;;;;;
  !jmp ff
  !tt:
 !mov word[edi],31h
  !tt1:
 !cmp eax,0
  !jz xx
  !add edi,2
  !ff:
 !sub dword eax,1
  !BT dword[esi],eax
  !JC tt;Переход, если бит равен 1
  !mov word[edi],30h
  !jmp tt1
  !xx:
 !mov word[edi+2],0h
  !pop edi
  !pop esi
  !retn 12
EndProcedure
 
 
 
Procedure.s BinMemory(*s,y=1);адрес памяти,количество сканируемых бит и вывод строкой
 ;Автор под псевдонимом Сергейчик
;If y>0
  Protected string.s=RSet(String,y,"1");создать буфер с количеством выводящих байт
  !mov dword esi,[p.p_s]
  !mov dword edi,[p.v_string]
  !mov eax,[p.v_y];Количество просматриваемых бит
  ;;;;;;;;;;;;;
  !jmp ff
  !tt:
 !cmp eax,0
  !jz xx
  !add edi,2
  !ff:
 !sub dword eax,1
  !BT dword[esi],eax
  !JC tt;Переход, если бит равен 1
  !mov word[edi],30h
  !jmp tt
  !xx:
 ProcedureReturn string
  ;EndIf
EndProcedure
 
 


Пример
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
Procedure.s BinMemory(*s,y=1);адрес памяти,количество сканируемых бит и вывод строкой
 ;Автор под псевдонимом Сергейчик
;If y>0
  Protected string.s=RSet(String,y,"1");создать буфер с количеством выводящих байт
  !mov dword esi,[p.p_s]
  !mov dword edi,[p.v_string]
  !mov eax,[p.v_y];Количество просматриваемых бит
  ;;;;;;;;;;;;;
  !jmp ff
  !tt:
 !cmp eax,0
  !jz xx
  !add edi,2
  !ff:
 !sub dword eax,1
  !BT dword[esi],eax
  !JC tt;Переход, если бит равен 1
  !mov word[edi],30h
  !jmp tt
  !xx:
 ProcedureReturn string
  ;EndIf
EndProcedure
 
 
 
Global r.s="S"
Global r1.l=2355.6888
Debug BinMemory(@r,16)
Debug BinMemory(@r1,32)
 



Последний раз редактировалось Сергейчик Пн окт 30, 2017 9:28 am, всего редактировалось 2 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Смотрим биты
СообщениеДобавлено: Пн мар 20, 2017 2:01 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 567
Благодарил (а): 2 раз.
Поблагодарили: 31 раз.
Пункты репутации: 9
И ещё пример. :roll:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
 
 
Procedure.s CHR_UTF8(Nomer.i)
  Protected stroka.s=#NULL$
  stroka=LSet(stroka,2,"")
  ;
  !push eax
  !push ebx
  !push edi
  ;
  !mov dword eax,[p.v_Nomer+12]
  !mov dword edi,[p.v_stroka+12]
  ;
  !CMP dword eax,0h
  !je dddw
  !cmp dword eax,127
  !Ja gyhw
  !
  ;//////////////////////////
  ;до (127),1 байтный utf-8
  !mov byte[edi],al
  !jmp dddw
  ;/////////////////////////
  !gyhw:
 !cmp dword eax,2047;от 800h до 10000h 3-х байтный utf-8
  !Ja sddw
  ;
  ;//////////////////////////////////
  ;от 127 до 800h 2-х байтный utf-8
  !mov byte bl,al
  ;===типа обнулить 6-7 бит
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 6-7 бит
  !or byte bl,128;поставить 7 бит
  ;===========================
  !shr ax,6
  !or byte al,192;C0h
  ;==========;
  !mov byte ah,bl
  !mov word[edi],ax
  !jmp dddw
  ;////////////////////////////////
  !sddw:
 !cmp dword eax,65535;>10000h это уже 4-х байтный utf-8
  !Ja sddfw
  !
  ;//////////////////////////////////////////////////////
  ;3-х байтный utf-8 символ с числом юникода от 800h до 10000h
  !mov byte bl,al
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 6-7 бит
  !or byte bl,128;поставить 7 бит
  ;
  !mov byte[edi+2],bl
  ;
  !mov word bx,ax
  !shr bx,6
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 6-7 бит
  !or byte bl,128;поставить 7 бит
  ;
  !shr ax,12
  !or byte al,224
  ;
  !mov byte ah,bl;2-й байт
  !mov word[edi],ax
  !jmp dddw
  ;
  !sddfw:
 ;//////////////////////////////////////////
  ;4-х байтный utf-8 символ с числом юникода от 10000h до 200000h(2097152)
  !mov byte bl,al
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 6-7 бит
  !or byte bl,128;поставить 7 бит
  ;
  !mov byte[edi+3],bl
  !mov word bx,ax
  !shr bx,6
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 6-7 бит
  !or byte bl,128;поставить 7 бит
  !mov byte[edi+2],bl
  ;
  !mov dword ebx,eax
  !shr ebx,12
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 6-7 бит
  !or byte bl,128;поставить 7 бит
  ;
  !shr eax,18
  !or byte al,240;f0h
  !mov byte ah,bl;2-й байт
  !mov word[edi],ax
  ;////////////////////////////////
  !dddw:
 !pop edi
  !pop ebx
  !pop eax
  ;
  ProcedureReturn stroka
EndProcedure
 
Procedure.s BinMemory(*s,y=1);адрес памяти,количество сканируемых бит и вывод строкой
  ;If y>0
  Protected string.s=RSet(String,y,"1");создать буфер с количеством выводящих байт
  !mov dword esi,[p.p_s]
  !mov dword edi,[p.v_string]
  !mov eax,[p.v_y];Количество просматриваемых бит
  ;;;;;;;;;;;;;
  !jmp ff
  !tt:
 !cmp eax,0
  !jz xx
  !add edi,2
  !ff:
 !sub dword eax,1
  !BT dword[esi],eax
  !JC tt;Переход, если бит равен 1
  !mov word[edi],30h
  !jmp tt
  !xx:
 ProcedureReturn string
  ;EndIf
EndProcedure
 
 
 
 
 
Global s.s
 
 
  For i=0 To 100 Step 2
 
    ;Debug BinMemory(@s+i,16)+#CRLF$
   
  Next
  For i=0 To 2500 Step 1
   
  s= CHR_UTF8(i)
  Debug BinMemory(@s,32)+Space(5)+Str(i)+#CRLF$
  Next
 
 



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB