Rev 7577 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7577 | Rev 7579 | ||
---|---|---|---|
1 | ; |
1 | ; |
2 | ; Строковые функции |
2 | ; Строковые функции |
3 | ; |
3 | ; |
4 | 4 | ||
5 | ;output: |
5 | ;output: |
6 | ; eax = strlen |
6 | ; eax = strlen |
7 | align 4 |
7 | align 4 |
8 | proc str_len, str1:dword |
8 | proc str_len, str1:dword |
9 | mov eax,[str1] |
9 | mov eax,[str1] |
10 | @@: |
10 | @@: |
11 | cmp byte[eax],0 |
11 | cmp byte[eax],0 |
12 | je @f |
12 | je @f |
13 | inc eax |
13 | inc eax |
14 | jmp @b |
14 | jmp @b |
15 | @@: |
15 | @@: |
16 | sub eax,[str1] |
16 | sub eax,[str1] |
17 | ret |
17 | ret |
18 | endp |
18 | endp |
19 | 19 | ||
20 | align 4 |
20 | align 4 |
21 | proc str_cat uses eax ecx edi esi, str1:dword, str2:dword |
21 | proc str_cat uses eax ecx edi esi, str1:dword, str2:dword |
22 | mov esi,[str2] |
22 | mov esi,[str2] |
23 | stdcall str_len,esi |
23 | stdcall str_len,esi |
24 | mov ecx,eax |
24 | mov ecx,eax |
25 | inc ecx |
25 | inc ecx |
26 | mov edi,[str1] |
26 | mov edi,[str1] |
27 | stdcall str_len,edi |
27 | stdcall str_len,edi |
28 | add edi,eax |
28 | add edi,eax |
29 | cld |
29 | cld |
30 | repne movsb |
30 | repne movsb |
31 | ret |
31 | ret |
32 | endp |
32 | endp |
33 | 33 | ||
34 | ;description: |
34 | ;description: |
35 | ; проверяет содержится ли строка str1 в строке str0 |
35 | ; проверяет содержится ли строка str1 в строке str0 |
36 | ; проверка делается только начиная с первых символов, указанных в str0 и str1 |
36 | ; проверка делается только начиная с первых символов, указанных в str0 и str1 |
37 | ; пример 1: если str0='aaabbbccc', str1='bbb' совпадения не будет |
37 | ; пример 1: если str0='aaabbbccc', str1='bbb' совпадения не будет |
38 | ; пример 2: если str0='aaabbbccc', str1='aaa' совпадение будет |
38 | ; пример 2: если str0='aaabbbccc', str1='aaa' совпадение будет |
39 | ;output: |
39 | ;output: |
40 | ; al = 0 если строка str1 содержится в str0 |
40 | ; al = 0 если строка str1 содержится в str0 |
41 | ; al != 0 если строка str1 не содержится в str0 |
41 | ; al != 0 если строка str1 не содержится в str0 |
42 | align 4 |
42 | align 4 |
43 | proc str_instr uses edi esi, str0:dword, str1:dword |
43 | proc str_instr uses edi esi, str0:dword, str1:dword |
44 | ;xor eax,eax |
44 | ;xor eax,eax |
45 | mov edi,[str0] |
45 | mov edi,[str0] |
46 | mov esi,[str1] |
46 | mov esi,[str1] |
47 | cld |
47 | cld |
48 | @@: |
48 | @@: |
49 | lodsb |
49 | lodsb |
50 | or al,al |
50 | or al,al |
51 | jz .e1 |
51 | jz .e1 |
52 | scasb ;сравниваем символы |
52 | scasb ;сравниваем символы |
53 | jz @b ;если совпали, то переходим к сравнению следующих |
53 | jz @b ;если совпали, то переходим к сравнению следующих |
54 | ;сюда попадаем если строки не совпали |
54 | ;сюда попадаем если строки не совпали |
55 | sub al,[edi-1] |
55 | sub al,[edi-1] |
56 | .e1: ;сюда попадаем если строка str1 (esi) закончилась |
56 | .e1: ;сюда попадаем если строка str1 (esi) закончилась |
57 | ret |
57 | ret |
58 | endp |
58 | endp |
59 | 59 | ||
60 | ;input: |
60 | ;input: |
61 | ; eax - число |
61 | ; eax - число |
62 | ; edi - буфер для строки |
62 | ; edi - буфер для строки |
63 | ; len - длинна буфера |
63 | ; len - длинна буфера |
64 | ;output: |
64 | ;output: |
65 | align 4 |
65 | align 4 |
66 | proc convert_int_to_str uses eax ecx edx edi esi, len:dword |
66 | proc convert_int_to_str uses eax ecx edx edi esi, len:dword |
67 | mov esi,[len] |
67 | mov esi,[len] |
68 | add esi,edi |
68 | add esi,edi |
69 | dec esi |
69 | dec esi |
70 | call .str |
70 | call .str |
71 | ret |
71 | ret |
72 | endp |
72 | endp |
73 | 73 | ||
74 | align 4 |
74 | align 4 |
75 | .str: |
75 | .str: |
76 | mov ecx,10 |
76 | mov ecx,10 |
77 | cmp eax,ecx |
77 | cmp eax,ecx |
78 | jb @f |
78 | jb @f |
79 | xor edx,edx |
79 | xor edx,edx |
80 | div ecx |
80 | div ecx |
81 | push edx |
81 | push edx |
82 | ;dec edi ;смещение необходимое для записи с конца строки |
82 | ;dec edi ;смещение необходимое для записи с конца строки |
83 | call .str |
83 | call .str |
84 | pop eax |
84 | pop eax |
85 | @@: |
85 | @@: |
86 | cmp edi,esi |
86 | cmp edi,esi |
87 | jge @f |
87 | jge @f |
88 | or al,0x30 |
88 | or al,0x30 |
89 | stosb |
89 | stosb |
90 | mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор |
90 | mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор |
91 | @@: |
91 | @@: |
92 | ret |
92 | ret |
93 | 93 | ||
- | 94 | ;input: |
|
- | 95 | ; buf - указатель на строку, число должно быть в 10 или 16 ричном виде |
|
- | 96 | ;output: |
|
- | 97 | ; eax - число |
|
- | 98 | align 4 |
|
- | 99 | proc conv_str_to_int, buf:dword |
|
- | 100 | xor eax,eax |
|
- | 101 | push ebx ecx esi |
|
- | 102 | xor ebx,ebx |
|
- | 103 | mov esi,[buf] |
|
- | 104 | ;определение отрицательных чисел |
|
- | 105 | xor ecx,ecx |
|
- | 106 | inc ecx |
|
- | 107 | cmp byte[esi],'-' |
|
- | 108 | jne @f |
|
- | 109 | dec ecx |
|
- | 110 | inc esi |
|
- | 111 | @@: |
|
- | 112 | ||
- | 113 | cmp word[esi],'0x' |
|
- | 114 | je .load_digit_16 |
|
- | 115 | ||
- | 116 | .load_digit_10: ;считывание 10-тичных цифр |
|
- | 117 | mov bl,byte[esi] |
|
- | 118 | cmp bl,'0' |
|
- | 119 | jl @f |
|
- | 120 | cmp bl,'9' |
|
- | 121 | jg @f |
|
- | 122 | sub bl,'0' |
|
- | 123 | imul eax,10 |
|
- | 124 | add eax,ebx |
|
- | 125 | inc esi |
|
- | 126 | jmp .load_digit_10 |
|
- | 127 | jmp @f |
|
- | 128 | ||
- | 129 | .load_digit_16: ;считывание 16-ричных цифр |
|
- | 130 | add esi,2 |
|
- | 131 | .cycle_16: |
|
- | 132 | mov bl,byte[esi] |
|
- | 133 | cmp bl,'0' |
|
- | 134 | jl @f |
|
- | 135 | cmp bl,'f' |
|
- | 136 | jg @f |
|
- | 137 | cmp bl,'9' |
|
- | 138 | jle .us1 |
|
- | 139 | cmp bl,'A' |
|
- | 140 | jl @f ;отсеиваем символы >'9' и <'A' |
|
- | 141 | .us1: ;составное условие |
|
- | 142 | cmp bl,'F' |
|
- | 143 | jle .us2 |
|
- | 144 | cmp bl,'a' |
|
- | 145 | jl @f ;отсеиваем символы >'F' и <'a' |
|
- | 146 | sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки |
|
- | 147 | .us2: ;составное условие |
|
- | 148 | sub bl,'0' |
|
- | 149 | cmp bl,9 |
|
- | 150 | jle .cor1 |
|
- | 151 | sub bl,7 ;convert 'A' to '10' |
|
- | 152 | .cor1: |
|
- | 153 | shl eax,4 |
|
- | 154 | add eax,ebx |
|
- | 155 | inc esi |
|
- | 156 | jmp .cycle_16 |
|
- | 157 | @@: |
|
- | 158 | cmp ecx,0 ;если число отрицательное |
|
- | 159 | jne @f |
|
- | 160 | sub ecx,eax |
|
- | 161 | mov eax,ecx |
|
- | 162 | @@: |
|
- | 163 | pop esi ecx ebx |
|
- | 164 | ret |
|
- | 165 | endp'a' |
|
- | 166 | >'A' |
|
94 | 167 | > |