Subversion Repositories Kolibri OS

Rev

Rev 4290 | Go to most recent revision | Details | 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
;-----------------------------------------------------
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
; используются функции _lstrlen, _lstrcpy
66
;-----------------------------------------------------
67
; lpDst - указатель на исходную строку ASCIIZ
68
; lpSrc - указатель на добавляемую строку ASCIIZ
69
;-----------------------------------------------------
70
proc    _lstrcat lpDst:DWORD, lpSrc:DWORD
71
        pusha
72
 
73
        stdcall _lstrlen,[lpDst]
74
        add     eax,[lpDst]
75
 
76
        stdcall _lstrcpy,eax,[lpSrc]
77
 
78
        popa
79
        ret
80
endp
81
 
82
;-----------------------------------------------------
83
; Функция быстрого копирования строки
84
; используются функции _lstrlen, _memcopy
85
;-----------------------------------------------------
86
; lpDst - указатель на приемник
87
; lpSrc - указатель на строку ASCIIZ
88
;-----------------------------------------------------
89
proc    _lstrcpy lpDst:DWORD, lpSrc:DWORD
90
        pusha
91
 
92
        stdcall _lstrlen,[lpSrc]
93
        inc     eax
94
        stdcall _memcopy,[lpDst],[lpSrc],eax
95
 
96
        popa
97
        ret
98
endp
99
 
100
;-----------------------------------------------------
101
; Функция быстрого копирования участка памяти
102
;-----------------------------------------------------
103
; lpDst - указатель на приемник
104
; lpSrc - указатель на источник
105
; dSize - размер копируемого блока
106
;-----------------------------------------------------
107
proc    _memcopy lpDst:DWORD, lpSrc:DWORD, dSize:DWORD
108
        pusha
109
 
110
        ; Установить указатели на источник и приемник
111
        cld
112
        mov     edi,[lpDst]
113
        mov     esi,[lpSrc]
114
 
115
        mov     ecx,[dSize]
116
        push    ecx
117
        ; Разделить на 4 и получить длину в DWORD
118
        shr     ecx,2
119
        ; Скопировать основную часть строки DWORD'ами
120
        rep     movsd
121
        pop     ecx
122
        ; Получить остаток от деления на 4
123
        and     ecx,3
124
        ; Скопировать остаток строки байтами
125
        rep     movsb
126
 
127
        popa
128
        ret
129
endp