purebasic.info

PureBasic forum
Текущее время: Вт ноя 19, 2019 2:14 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Инкримент HEXa
СообщениеДобавлено: Вт окт 15, 2019 10:32 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 914
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
Типа инкримента Hex(который в юникоде utf16). :D
Код:
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
 
 
Global s.s="00000000000000000000000000000000000000000000000000000000000000000";типа переменной 256 бит только в символах юникода для hexa
 
Procedure LetHex(strokahex.s);присваивание
  Len(strokahex)
  !add dword eax,eax
  !mov dword edi,[v_s]
  ;============
  ;очистка предыдущего значения
  !cikl2:
 !mov word [edi],48;'0'
  !add dword edi,2
  !cmp word [edi],0
  !jnz cikl2
  ;==========
  !sub dword edi,eax
  !mov dword esi,[p.v_strokahex]
 
  !cmp word [esi],0
  !jz wyiti
 
  !cikl:
 !mov word ax,[esi]
  !mov word [edi],ax
  !add dword esi,2
  !add dword edi,2
  !cmp word [esi],0
  !jnz cikl
 
  !wyiti:
EndProcedure
Procedure IncHex()
!mov dword esi,[v_s]
!add dword esi,128
!a20:
 
!cmp word [esi],57;=9
!jz bb
!cmp word [esi],70;F
!jnz ff
!ess:
!mov word[esi],48
!sub dword esi,2
!cmp word [esi],70
!jz ess
 
!cmp word [esi],57;=9
!jz bb
!add word[esi],1
!jmp rr
 
!ff:
!add word [esi],1
!jmp rr
 
!bb:
!add word [esi],8
!rr:
 
EndProcedure
 
  LetHex("FFFAAAAFFF555EEEFFFFFFFFF");присваивание
 
  Debug s
  IncHex();Инкримент
  Debug s
 
    LetHex("FFFAAAAFFF555EEEFFFF999");присваивание
 
  Debug s
  IncHex();Инкримент
  Debug s
      LetHex("111");присваивание
 
  Debug s
  IncHex();Инкримент
  Debug s
 
 
 
 
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Инкримент HEXa
СообщениеДобавлено: Вс окт 27, 2019 6:46 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 914
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
 
;Автор под псевдонимом Сергейчик (c)
Structure registr256
  reg64_0.q;младшие данные
  reg64_1.q
  reg64_2.q
  reg64_3.q
EndStructure
 
Global registr256.registr256
Procedure.s BinMemory(*s,y=1);адрес памяти,количество сканируемых бит и вывод строкой
  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
EndProcedure
Procedure Letregistr64(*adres,hexstroka.s);присвоение числа hex-bin
 !PUSH esi
 !PUSH edi
 !mov dword esi,[p.v_hexstroka+8]
 
 !mov dword edi,[p.p_adres+8]
 !cikkll6:
;
!shl dword [edi+4],4
!mov byte al,[edi+3]
!shr byte al,4
!or byte[edi+4],al
!shl dword [edi],4
;
!mov byte al,[esi]
!cmp byte al,58
!jl menhe
!cmp byte al,91
!jl menhe2
;
!sub byte al,87
!or byte[edi],al
!jmp dd5
!menhe:
!sub byte al,48
!or byte[edi],al
!jmp dd5
;
!menhe2:
!sub byte al,55
!or byte[edi],al
 
!dd5:
!add dword esi,2
!cmp word [esi],0
!jnz cikkll6
 
 !pop edi
 !pop esi
EndProcedure
Procedure Letregistr256(*adres,hexstroka.s);присвоение числа hex-bin
 ;если без лидирующих нулей то нужно обнулять
    registr256\reg64_0=0
    registr256\reg64_1=0
    registr256\reg64_2=0
    registr256\reg64_3=0
 ;================
 !PUSH esi
 !PUSH edi
 !mov dword esi,[p.v_hexstroka+8]
 !mov dword ecx,esi
 !sub dword ecx,2
 ;============
 !cmp word [esi],0
 !jz wwee
 !tyyu:
!add dword esi,2
 !cmp word [esi],0
 !jnz tyyu
 !sub dword esi,2
 ;======
 !mov dword edi,[p.p_adres+8]
;========
!cikkll65s:
!mov byte al,[esi]
!cmp byte al,58
!jl menhes
!cmp byte al,91
!jl menhe2s
;
!sub byte al,87
!or byte[edi],al
!jmp dd5s
!menhes:
!sub byte al,48
!or byte[edi],al
!jmp dd5s
;
!menhe2s:
!sub byte al,55
!or byte[edi],al
;===========
!dd5s:
!sub dword esi,2
!cmp dword ecx,esi
!jz wwee
;
!mov byte al,[esi]
!cmp byte al,58
!jl menhesf
!cmp byte al,91
!jl menhe2sf
;
!sub byte al,87
!shl byte al,4
!or byte[edi],al
!jmp dd5sf
!menhesf:
!sub byte al,48
!shl byte al,4
!or byte[edi],al
!jmp dd5sf
;
!menhe2sf:
!sub byte al,55
!shl byte al,4
!or byte[edi],al
 
!dd5sf:
!sub dword esi,2
!add dword edi,1
!cmp dword ecx,esi
!jnz cikkll65s
;
!wwee:
!pop edi
 !pop esi
EndProcedure
Procedure.s Hexregistr256();вывод в строковом(юникод)hexe без лидирующих нулей
 Static hexstroka.s="00000000000000000000000000000000000000000000000000000000000000000";Буфер можно сделать глобально
 Protected adres.i=@hexstroka
 Protected adresregistra.i=@registr256
 ;
!PUSH esi
!PUSH edi
!PUSH ecx
;
!MOV dword edi,[p.v_adres+12];Загружаем адрес буфера глобальной строковой переменной для вывода
!mov dword esi,[p.v_adresregistra+12]
!mov dword ecx,31;количество сканируемых байтов
;===для вывода без лидирующих нулей
!rkb623:
!cmp byte[esi+ecx],0
!jnz rkb625
!sub ecx,1
!cmp dword ecx,-1
!jnz rkb623
!mov dword [edi],30h
!jmp rkb6234
 
!rkb625:
!mov byte al,[esi+ecx]
!cmp byte al,15
!ja rkb62
!cmp byte al,9
!ja f6667
!add  byte al,48
!mov byte [edi],al
!add dword edi,2
!jmp gff
!f6667:
!add  byte al,55
!mov byte [edi],al
!add dword edi,2
!jmp gff
;=================
 
!rkb62:
!movzx eax,byte ptr esi+ecx;al;расширяем до 32 бит с старшими быйтми с нулями=32 битное число
;
!mov dword eax,[Table_HEX+eax*4];*4 смещение в таблице по полю dword(2 символа )
;
!MOV dword[edi],eax
!add dword edi,4
!gff:
!sub ecx,1
!cmp dword ecx,-1
!jnz rkb62
!mov word [edi],0h
!rkb6234:
!pop ecx
!Pop edi
!Pop esi
;
 ProcedureReturn hexstroka
 
EndProcedure
Procedure.s Hexregistr2562();вывод в строковом(юникод)hexe с нулями
 Static hexstroka.s="00000000000000000000000000000000000000000000000000000000000000000";Буфер можно сделать глобально
 Protected adres.i=@hexstroka
 Protected adresregistra.i=@registr256
 ;
!PUSH esi
!PUSH edi
!PUSH ecx
;
!MOV dword edi,[p.v_adres+12];Загружаем адрес буфера глобальной строковой переменной для вывода
!mov dword esi,[p.v_adresregistra+12]
!mov dword ecx,31
!rkb6:
!
!movzx eax,byte ptr esi+ecx;al;расширяем до 32 бит с старшими быйтми с нулями=32 битное число
;
!mov dword eax,[Table_HEX+eax*4];*4 смещение в таблице по полю dword(2 символа )
;
!MOV dword[edi],eax
!add dword edi,4
!sub ecx,1
!cmp dword ecx,-1
!jnz rkb6
!mov word [edi],0h
!pop ecx
!Pop edi
!Pop esi
;
 ProcedureReturn hexstroka
 ;{;
 DataSection
!Table_HEX:
;     0 1 2 3 4 5 6 7 8 9 A B C D E F
!du '000102030405060708090A0B0C0D0E0F';0F
!du '101112131415161718191A1B1C1D1E1F';1F
!du '202122232425262728292A2B2C2D2E2F';2F
!du '303132333435363738393A3B3C3D3E3F';3F
!du '404142434445464748494A4B4C4D4E4F';4F
!du '505152535455565758595A5B5C5D5E5F';5F
!du '606162636465666768696A6B6C6D6E4F';6F
!du '707172737475767778797A7B7C7D7E7F';7F
!du '808182838485868788898A8B8C8D8E8F';8F
!du '909192939495969798999A9B9C9D9E9F';9F
!du 'A0A1A2A3A4A5A6A7A8A9AAABACADAEAF';AF
!du 'B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF';BF
!du 'C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF';CF
!du 'D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF';DF
!du 'E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF';EF
!du 'F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF',0;FF
EndDataSection
;};
EndProcedure
Procedure IncRegistr256()
  If registr256\reg64_0=-1
    registr256\reg64_0=0
      If registr256\reg64_1=-1
        registr256\reg64_1=0
              If registr256\reg64_2=-1
                registr256\reg64_2=0
                  If registr256\reg64_3=-1
                    MessageRequester("End","Min hex HISLO=0");все fff=-1 +1=0
                    registr256\reg64_3=0                  
                  Else
                       registr256\reg64_3+1
                  EndIf
               Else
                registr256\reg64_2+1
               EndIf
      Else
        registr256\reg64_1+1
      EndIf
   Else
     registr256\reg64_0+1
   EndIf  
EndProcedure
Procedure DecRegistr256()
  If registr256\reg64_0=0
    registr256\reg64_0=-1
      If registr256\reg64_1=0
        registr256\reg64_1=-1
              If registr256\reg64_2=0
                registr256\reg64_2=-1
                  If registr256\reg64_3=0
                     MessageRequester("End","MAX hex HISLO=все fff");все (0-1)=fff=-1 если считать без минуса конечно от нуля и в + ,иначе -1
                    registr256\reg64_3=-1
                  Else
                       registr256\reg64_3-1
                  EndIf
               Else
                registr256\reg64_2-1
               EndIf
      Else
        registr256\reg64_1-1
      EndIf
   Else
     registr256\reg64_0-1
   EndIf  
EndProcedure
 
;Letregistr64(@registr256\reg64_0,"FFFFFFFFFFFFFFFe");64 бита(dec=-1) проверка на переход в следующию reg64_1.q +1 и инкремента нет и вывод сообщения максимальное число
;Letregistr64(@registr256\reg64_1,"FFFFFFFFFFFFFFFF")
;Letregistr64(@registr256\reg64_2,"FFFFFFFFFFFFFFFF")
;Letregistr64(@registr256\reg64_3,"FFFFFFFFFFFFFFFF");
Letregistr256(@registr256,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFe")
 
For i=0 To 100
Debug BinMemory(@registr256,256)
  Debug  Hexregistr256()
   IncRegistr256()
Next
 
For i=0 To 100
  Debug  Hexregistr2562()
   IncRegistr256()
Next
Letregistr256(@registr256,"")
Debug  Hexregistr256()
DecRegistr256()
Debug  Hexregistr256()
 



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

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


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

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


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

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