Subversion Repositories Kolibri OS

Rev

Rev 4290 | 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
; нулевого байта
4290 heavyiron 45
;-----------------------------------------------------
46
proc _lstrlen lpStr:DWORD
4319 heavyiron 47
        mov     eax, [lpStr]
48
@@:     inc     eax
49
        cmp     byte [eax], 0
50
        jne     @b
51
        sub     eax, [lpStr]
52
        ret
4213 heavyiron 53
endp
54
;-----------------------------------------------------
55
; Функция быстрого слияния двух строк
56
; используются функции _lstrlen, _lstrcpy
57
;-----------------------------------------------------
58
; lpDst - указатель на исходную строку ASCIIZ
59
; lpSrc - указатель на добавляемую строку ASCIIZ
60
;-----------------------------------------------------
61
proc    _lstrcat lpDst:DWORD, lpSrc:DWORD
62
        pusha
63
 
64
        stdcall _lstrlen,[lpDst]
65
        add     eax,[lpDst]
66
 
67
        stdcall _lstrcpy,eax,[lpSrc]
68
 
69
        popa
70
        ret
71
endp
72
 
73
;-----------------------------------------------------
74
; Функция быстрого копирования строки
75
; используются функции _lstrlen, _memcopy
76
;-----------------------------------------------------
77
; lpDst - указатель на приемник
78
; lpSrc - указатель на строку ASCIIZ
79
;-----------------------------------------------------
80
proc    _lstrcpy lpDst:DWORD, lpSrc:DWORD
81
        pusha
82
 
83
        stdcall _lstrlen,[lpSrc]
84
        inc     eax
85
        stdcall _memcopy,[lpDst],[lpSrc],eax
86
 
87
        popa
88
        ret
89
endp
90
 
91
;-----------------------------------------------------
92
; Функция быстрого копирования участка памяти
93
;-----------------------------------------------------
94
; lpDst - указатель на приемник
95
; lpSrc - указатель на источник
96
; dSize - размер копируемого блока
97
;-----------------------------------------------------
98
proc    _memcopy lpDst:DWORD, lpSrc:DWORD, dSize:DWORD
99
        pusha
100
 
101
        ; Установить указатели на источник и приемник
102
        cld
103
        mov     edi,[lpDst]
104
        mov     esi,[lpSrc]
105
 
106
        mov     ecx,[dSize]
107
        push    ecx
108
        ; Разделить на 4 и получить длину в DWORD
109
        shr     ecx,2
110
        ; Скопировать основную часть строки DWORD'ами
111
        rep     movsd
112
        pop     ecx
113
        ; Получить остаток от деления на 4
114
        and     ecx,3
115
        ; Скопировать остаток строки байтами
116
        rep     movsb
117
 
118
        popa
119
        ret
120
endp