Subversion Repositories Kolibri OS

Rev

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
-
 
166
>
94
167
>