Subversion Repositories Kolibri OS

Rev

Rev 4213 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4213 heavyiron 1
; by ManHunter / PCL
2
; http://www.manhunter.ru
3
;-----------------------------------------------------
4
; Функция получения длины строки (Fast)
5
;-----------------------------------------------------
6
; lpStr - указатель на строку ASCIIZ
7
; На выходе: EAX - длина строки без учета завершающего
8
; нулевого байта
9
;-----------------------------------------------------
10
;proc    _lstrlen lpStr:DWORD
11
;        mov     eax, [lpStr]
12
;        sub     eax, 4
13
;@@:
14
;        add     eax, 4
15
;        cmp     byte [eax], 0
16
;        je      .szlen_lb1
17
;        cmp     byte [eax+1], 0
18
;        je      .szlen_lb2
19
;        cmp     byte [eax+2], 0
20
;        je      .szlen_lb3
21
;        cmp     byte [eax+3], 0
22
;        jne     @b
23
;        sub     eax, [lpStr]
24
;        add     eax, 3
25
;        ret
26
;.szlen_lb3:
27
;        sub     eax, [lpStr]
28
;        add     eax, 2
29
;        ret
30
;.szlen_lb2:
31
;        sub     eax, [lpStr]
32
;        add     eax, 1
33
;        ret
34
;.szlen_lb1:
35
;        sub     eax, [lpStr]
36
;        ret
37
;endp
38
 
39
;-----------------------------------------------------
40
; Функция получения длины строки
41
;-----------------------------------------------------
42
; lpStr - указатель на строку ASCIIZ
43
; На выходе: EAX - длина строки без учета завершающего
44
; нулевого байта
45
;-----------------------------------------------------
4290 heavyiron 46
;proc    _lstrlen lpStr:DWORD
47
;        push    edi ecx
48
;
49
;        cld
50
;        mov     edi,[lpStr]
51
;        xor     ecx,ecx
52
;        dec     ecx
53
;        xor     eax,eax
54
;        repne   scasb
55
;        not     ecx
56
;        dec     ecx
57
;        mov     eax,ecx
58
;
59
;        pop     ecx edi
60
;        ret
61
;endp
62
 
63
;-----------------------------------------------------
64
; Функция получения длины строки
65
;-----------------------------------------------------
66
; lpStr - указатель на строку ASCIIZ
67
; На выходе: EAX - длина строки без учета завершающего
68
; нулевого байта
69
;-----------------------------------------------------
70
proc _lstrlen lpStr:DWORD
71
	push	ebx
72
	mov	ebx,[lpStr]
73
	xor	eax,eax
74
    @@: cmp	byte[ebx+eax],0
75
	je	@f
76
	inc	eax
77
	jmp	@b
78
    @@: pop	ebx
79
	ret
4213 heavyiron 80
endp
81
 
82
;-----------------------------------------------------
83
; Функция быстрого слияния двух строк
84
; используются функции _lstrlen, _lstrcpy
85
;-----------------------------------------------------
86
; lpDst - указатель на исходную строку ASCIIZ
87
; lpSrc - указатель на добавляемую строку ASCIIZ
88
;-----------------------------------------------------
89
proc    _lstrcat lpDst:DWORD, lpSrc:DWORD
90
        pusha
91
 
92
        stdcall _lstrlen,[lpDst]
93
        add     eax,[lpDst]
94
 
95
        stdcall _lstrcpy,eax,[lpSrc]
96
 
97
        popa
98
        ret
99
endp
100
 
101
;-----------------------------------------------------
102
; Функция быстрого копирования строки
103
; используются функции _lstrlen, _memcopy
104
;-----------------------------------------------------
105
; lpDst - указатель на приемник
106
; lpSrc - указатель на строку ASCIIZ
107
;-----------------------------------------------------
108
proc    _lstrcpy lpDst:DWORD, lpSrc:DWORD
109
        pusha
110
 
111
        stdcall _lstrlen,[lpSrc]
112
        inc     eax
113
        stdcall _memcopy,[lpDst],[lpSrc],eax
114
 
115
        popa
116
        ret
117
endp
118
 
119
;-----------------------------------------------------
120
; Функция быстрого копирования участка памяти
121
;-----------------------------------------------------
122
; lpDst - указатель на приемник
123
; lpSrc - указатель на источник
124
; dSize - размер копируемого блока
125
;-----------------------------------------------------
126
proc    _memcopy lpDst:DWORD, lpSrc:DWORD, dSize:DWORD
127
        pusha
128
 
129
        ; Установить указатели на источник и приемник
130
        cld
131
        mov     edi,[lpDst]
132
        mov     esi,[lpSrc]
133
 
134
        mov     ecx,[dSize]
135
        push    ecx
136
        ; Разделить на 4 и получить длину в DWORD
137
        shr     ecx,2
138
        ; Скопировать основную часть строки DWORD'ами
139
        rep     movsd
140
        pop     ecx
141
        ; Получить остаток от деления на 4
142
        and     ecx,3
143
        ; Скопировать остаток строки байтами
144
        rep     movsb
145
 
146
        popa
147
        ret
148
endp