purebasic.info

PureBasic forum
Текущее время: Вт мар 31, 2020 1:02 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Процедура конкатенация
СообщениеДобавлено: Вт сен 02, 2014 10:40 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 968
Благодарил (а): 2 раз.
Поблагодарили: 55 раз.
Пункты репутации: 9
Процедура конкатенации,(Юникод)
Код:
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
 
Global f.s="433333"
Global d.s="15.222"
Procedure conkatenaziy(*s,*h)
!mov dword esi,[p.p_h]
!CMP word[esi],0h
!Jz jjn
!mov dword edi,[p.p_s]
!ghf:
!CMP word[edi],0h
!Jz fgv
!add dword edi,4
!CMP word[edi-2],0h
!jnz ghf
!sub dword edi,2
!fgv:
!mov word ax,[esi]
!mov word[edi],ax
!add dword esi,2
!add dword edi,2
!CMP word[esi],0h
!jnz fgv
!mov word[edi],0h
!jjn:
EndProcedure
MessageRequester("", "Начало теста")
   time = GetTickCount_()
   For q=0 To 40000
f+d
 Next
  t.d = (GetTickCount_() - time)/1000
  MessageRequester("", "Количество  циклов=" + q + #CR$ + "Время теста= " + t)
MessageRequester("", "Начало теста")
   time = GetTickCount_()
   For q=0 To 40000
conkatenaziy(@f,@d)
 Next
  t = (GetTickCount_() - time)/1000
  MessageRequester("", "Количество  циклов=" + q + #CR$ + "Время теста= " + t)
Debug f
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура конкатенация
СообщениеДобавлено: Чт сен 25, 2014 10:33 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 968
Благодарил (а): 2 раз.
Поблагодарили: 55 раз.
Пункты репутации: 9
Возник вопрос .
В конце строк после завершающего 0 есть код 0badf00dh.так вот что он значит(он нужен)? :roll:
Причём когда выделяем память через AllocateMemory то получается что можно использовать на 2байта меньше(юникод)иначе затирается завершающий 0!
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
Global f.s=""
*j=AllocateMemory(2)
;PokeS(*j,"5",#PB_Unicode)
 
Debug PeekA(*j)
Debug PeekA(*j+1)
Debug PeekA(*j+2)
Debug PeekA(*j+3)
Debug PeekA(*j+4)
Debug PeekA(*j+5)
Debug PeekA(*j+6)
Debug PeekA(*j+7)
Debug PeekA(*j+8)
Debug PeekA(*j+9)
Debug PeekA(*j+10)
 
Debug PeekA(@f)
Debug PeekA(@f+1)
Debug PeekA(@f+2)
Debug PeekA(@f+3)
Debug PeekA(@f+4)
Debug PeekA(@f+5)
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура конкатенация
СообщениеДобавлено: Чт сен 25, 2014 11:12 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11603
Благодарил (а): 4 раз.
Поблагодарили: 489 раз.
Зачем выходить за пределы выделенной памяти?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура конкатенация
СообщениеДобавлено: Чт сен 25, 2014 11:16 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 71 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Может быть это?
http://ru.wikipedia.org/wiki/Hexspeak

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура конкатенация
СообщениеДобавлено: Чт сен 25, 2014 11:27 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 968
Благодарил (а): 2 раз.
Поблагодарили: 55 раз.
Пункты репутации: 9
Пётр писал(а):
Зачем выходить за пределы выделенной памяти?

Так эта функция и создаёт этот код я вышел чтоб это видно было.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура конкатенация
СообщениеДобавлено: Чт сен 25, 2014 11:40 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11603
Благодарил (а): 4 раз.
Поблагодарили: 489 раз.
Это код за пределами выделенной памяти. Это может быть "мусор" или отладочный код.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура конкатенация
СообщениеДобавлено: Вс сен 28, 2014 10:28 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 968
Благодарил (а): 2 раз.
Поблагодарили: 55 раз.
Пункты репутации: 9
Да мы выйдем за память что не гуд.
а типа вот так можно :?:
Код:
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
 
Procedure$ OCT4(*s,st$)
  !mov dword edi,[p.v_st$]
  !mov dword esi,[p.p_s]
  !mov word ax,31
  ;;;;;;;;;;;;;
  !BT [esi],ax
  !Jc mbb;Переход, если бит равен 1
  !sub word ax,1
  !BT [esi],ax
  !Jc jjk
  !mov word[edi],30h
  !jmp sss
  !jjk:
 !mov word[edi],31h
  !jmp sss
  !mbb:
 !sub word ax,1
  !BT [esi],ax
  !jc ghj
  !mov word[edi],32h
  !jmp sss
  !ghj:
 !mov word[edi],33h
  !sss:
 !add dword edi,2
  !sub word ax,1
  ;
   !mov dword ecx,10
   !cld
   !ddfh1:
  !BT word[esi],ax
   !Jc m14;Переход, если бит равен 1
   ;
   !sub word ax,1
   !BT word[esi],ax
   !Jc m15
   ;
   !sub word ax,1
   !BT word[esi],ax
   !Jc m17
   ;
   !mov word bx,30h
   !jmp wwwd
   ;
   !m14:
  !sub word ax,1
   !BT word[esi],ax
   !Jc m16
   ;
   !sub word ax,1
   !BT word[esi],ax
   !Jc m18
   ;
   !mov word bx,34h
   !jmp wwwd
   !m15:
  !sub word ax,1
   !BT word[esi],ax
   !Jc m19
   !mov word bx,32h
   !jmp wwwd
   ;
   !m16:
  !sub word ax,1
   !BT word[esi],ax
   !Jc m20
   !mov word bx,36h
   !jmp wwwd
   ;
   !m17:
  !mov word bx,31h
   !jmp wwwd
   ;
   !m18:
  !mov word bx,35h
   !jmp wwwd
   ;
   !m19:
  !mov word bx,33h
   !jmp wwwd
   !m20:
  !mov word bx,37h
   !wwwd:
  !mov word[edi],bx
   !sub word ax,1
   !add edi,2
   !LOOP ddfh1
   !mov word[edi],0h
 ProcedureReturn st$
EndProcedure
 
debug OCT4(?ggg,"         11")
 
 DataSection
  ggg:
 Data.b 7,2,7,7,53,54,55,56,57,58,59
EndDataSection
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура конкатенация
СообщениеДобавлено: Вс фев 16, 2020 4:37 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 968
Благодарил (а): 2 раз.
Поблагодарили: 55 раз.
Пункты репутации: 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
 
;Автор (с) Сергейчик
Global s.s=Space(1000);буфер под строку
Procedure concatinaciy_sobrezkoiUTF16(*s,*s1,n)
!mov edi,DWORD PTR esp+4
!mov esi,DWORD PTR esp+8
!CMP word ptr esi,0h
!Jne tt
!je wyiti
!hut1:
!mov dword eax,[esi-4]
!mov dword[edi],eax
!add edi,4
!CMP word ptr esi,0h
!Je rr1
!tt:
!add esi,4
!CMP word ptr esi-2,0h
!Jnz hut1
!mov word ax,[esi-4]
!mov word[edi],ax
!add edi,2
!rr1:
!mov word[edi],0h
;
!mov dword eax,edi
!SUB eax,DWORD PTR esp+4
!Sar eax,1
!cmp eax,DWORD PTR esp+12
!ja cikl
!mov edi,DWORD PTR esp+4
!mov word ptr edi,0h
!retn 12
;
!cikl:
!mov dword eax,ptr esp+12
!imul eax,2
!sub dword edi,eax
!mov word ptr edi,0h
!wyiti:
!retn 12
EndProcedure
 
 
concatinaciy_sobrezkoiUTF16(@s,@"test Purika",1)
Debug s
concatinaciy_sobrezkoiUTF16(@s,@"test Purika",12)
Debug s
d.s="test Purika"
concatinaciy_sobrezkoiUTF16(@s,@d,2)
Debug s
;2 вариант
Global s.s=Space(1000);буфер под строку
Procedure concatinaciy_sobrezkoiUTF16(*s,*s1,n)
!mov esi,DWORD PTR esp+8
!mov edi,DWORD PTR esp+4
!CMP word ptr esi,0h
!Jne tt
!je wyiti
!hut1:
!mov dword eax,[esi-4]
!mov dword[edi],eax
!add edi,4
!CMP word ptr esi,0h
!Je rr1
!tt:
!add esi,4
!CMP word ptr esi-2,0h
!Jnz hut1
!mov word ax,[esi-4]
!mov word[edi],ax
!add edi,2
!rr1:
!sub dword edi,[esp+12]
!sub dword edi,[esp+12]
!cmp edi,[esp+4]
!ja fg
!mov dword edi,[esp+4]
!fg:
!mov word[edi],0h
!wyiti:
!retn 12
EndProcedure
 
 
concatinaciy_sobrezkoiUTF16(@s,@"test Purika",1)
Debug s
concatinaciy_sobrezkoiUTF16(@s,@"test Purika",12)
Debug s
d.s="test Purika"
concatinaciy_sobrezkoiUTF16(@s,@d,2)
Debug s
 


Просто обрезка без конкатенации
Код:
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
 
Procedure.i TrimRight(*s,n)
;Автор (с) Сергейчик
!cmp dword ptr esp+8,0
!jz ess
!mov eax,DWORD PTR esp+4
!hut1:
!CMP word ptr eax,0h
!Je rr1
!add eax,4
!CMP word ptr eax-2,0h
!Jnz hut1
!sub eax,2
!rr1:
!sub dword eax,[esp+8]
!sub dword eax,[esp+8]
!cmp eax,[esp+4]
!ja fg
!mov dword eax,[esp+4]
!fg:
!mov word ptr eax,0h
!ess:
!retn 8
EndProcedure
x.string\s="Теst2"
TrimRight(@x\s,2)
Debug x\s
 


По задуманной логике но на пурике :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
 
;Автор (с) Сергейчик
EnableExplicit
Structure strokautf16
   simvolutf16.u
 EndStructure
 
 Global x.s="Привет ZOLO vs Puric"
 Global bufer.s=Space(1000)
Procedure.s concatenaciy_v_bufer_s_obrezkoi(*adresbufera,*adresstroki,n)
  Protected *adressimvolautf16.strokautf16 = *adresstroki
  If *adressimvolautf16\simvolutf16<>#Null;если строка не пустая то делаем конкатенацию
    Protected *adressimvolautf162.strokautf16 = *adresbufera
  Repeat
    *adressimvolautf162\simvolutf16=*adressimvolautf16\simvolutf16
   If *adressimvolautf16\simvolutf16<>#Null;если не конец строки идём дальше по символам
     *adressimvolautf16+2
     *adressimvolautf162+2
   Else
     ;дошли до конца строки
     Break
   EndIf
   ForEver
   *adressimvolautf162-n
   *adressimvolautf162-n
      If *adressimvolautf162<*adresbufera
       *adressimvolautf162=*adresbufera
      EndIf
   *adressimvolautf162\simvolutf16=#Null
 EndIf
EndProcedure
Procedure.s TrimRight(a, n)
  Protected *adressimvolautf16.strokautf16 = a
  If Not n=0
  Repeat  
   If *adressimvolautf16\simvolutf16<>#Null;если не конец строки идём дальше по символам
     *adressimvolautf16+2
    ;Debug *adressimvolautf16\simvolutf16
   Else
     ;дошли до конца строки
     Break
   EndIf
 ForEver
 
   *adressimvolautf16-n
   *adressimvolautf16-n
   If *adressimvolautf16<a;для невыхода за ночальный адрес строки = полная обрезка
     *adressimvolautf16=a
   EndIf
   *adressimvolautf16\simvolutf16=#Null
 EndIf  
EndProcedure
 
TrimRight(@x, 2)
Debug x
concatenaciy_v_bufer_s_obrezkoi(@bufer,@x,7)
Debug bufer
 
 



Последний раз редактировалось Сергейчик Вс фев 23, 2020 12:24 am, всего редактировалось 5 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура конкатенация
СообщениеДобавлено: Вс фев 16, 2020 5:57 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1824
Откуда: Алматы
Благодарил (а): 19 раз.
Поблагодарили: 51 раз.
Пункты репутации: 5
Сергейчик, а ты в этих асмах разбираешься? их понятно тыщи... мне какой-то там 68k чего-то надо... или что-то там Z80. черт знает что мне надо... это по идее аудио драйвер для приставки. в смысле организация звучания. из этого кода по идее на два звуковых чипа идут команды и они типа играют. но я смотрю на это безобразие и вижу фигу...


Вложения:
Z80_2-8_cleaned.zip [22.59 KiB]
Скачиваний: 23
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура конкатенация
СообщениеДобавлено: Вс фев 16, 2020 6:41 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 968
Благодарил (а): 2 раз.
Поблагодарили: 55 раз.
Пункты репутации: 9
SereZa писал(а):
Сергейчик, а ты в этих асмах разбираешься? их понятно тыщи... мне какой-то там 68k чего-то надо... или что-то там Z80. черт знает что мне надо... это по идее аудио драйвер для приставки. в смысле организация звучания. из этого кода по идее на два звуковых чипа идут команды и они типа играют. но я смотрю на это безобразие и вижу фигу...

Асм,фасм,насм,тасм и т.д. это мнемоника кодовых команд процессору на различные операции,ищи команды нужного проца и разбирайся,в твоём случае вроде бы
операции с регистрами справа а не слева как на x86-64,(а многие команды мнемоника асмов сжожие) :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Процедура конкатенация
СообщениеДобавлено: Пн фев 17, 2020 10:12 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 401
Благодарил (а): 1 раз.
Поблагодарили: 20 раз.
Пункты репутации: 0
SereZa писал(а):
Сергейчик, а ты в этих асмах разбираешься? их понятно тыщи... мне какой-то там 68k чего-то надо... или что-то там Z80. черт знает что мне надо... это по идее аудио драйвер для приставки. в смысле организация звучания. из этого кода по идее на два звуковых чипа идут команды и они типа играют. но я смотрю на это безобразие и вижу фигу...


68k https://ru.wikipedia.org/wiki/Motorola_680x0
z80 https://ru.wikipedia.org/wiki/Zilog_Z80

Это явно из другого форума.

p.s. если конечно не вспомнить историю с PB на Амиге и ПервоМакинтошах


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

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


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

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


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

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