Subversion Repositories Kolibri OS

Rev

Rev 7577 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1338 IgorA 1
;
7577 IgorA 2
; Строковые функции
1338 IgorA 3
;
4
 
7577 IgorA 5
;output:
6
; eax = strlen
7
align 4
8
proc str_len, str1:dword
9
	mov eax,[str1]
10
	@@:
11
		cmp byte[eax],0
12
		je @f
13
		inc eax
14
		jmp @b
15
	@@:
16
	sub eax,[str1]
1338 IgorA 17
	ret
7577 IgorA 18
endp
1338 IgorA 19
 
7577 IgorA 20
align 4
21
proc str_cat uses eax ecx edi esi, str1:dword, str2:dword
22
	mov esi,[str2]
23
	stdcall str_len,esi
24
	mov ecx,eax
25
	inc ecx
26
	mov edi,[str1]
27
	stdcall str_len,edi
28
	add edi,eax
3244 IgorA 29
	cld
7577 IgorA 30
	repne movsb
1338 IgorA 31
	ret
7577 IgorA 32
endp
1338 IgorA 33
 
3244 IgorA 34
;description:
35
; проверяет содержится ли строка str1 в строке str0
36
; проверка делается только начиная с первых символов, указанных в str0 и str1
37
; пример 1: если str0='aaabbbccc', str1='bbb' совпадения не будет
38
; пример 2: если str0='aaabbbccc', str1='aaa' совпадение будет
39
;output:
40
; al = 0 если строка str1 содержится в str0
41
; al != 0 если строка str1 не содержится в str0
42
align 4
43
proc str_instr uses edi esi, str0:dword, str1:dword
44
	;xor eax,eax
45
	mov edi,[str0]
46
	mov esi,[str1]
47
	cld
48
	@@:
7577 IgorA 49
		lodsb
50
		or al,al
51
		jz .e1
3244 IgorA 52
		scasb ;сравниваем символы
53
	jz @b ;если совпали, то переходим к сравнению следующих
54
	;сюда попадаем если строки не совпали
55
	sub al,[edi-1]
56
	.e1: ;сюда попадаем если строка str1 (esi) закончилась
57
	ret
58
endp
59
 
7577 IgorA 60
;input:
61
; eax - число
62
; edi - буфер для строки
63
; len - длинна буфера
64
;output:
65
align 4
66
proc convert_int_to_str uses eax ecx edx edi esi, len:dword
67
	mov esi,[len]
68
	add esi,edi
69
	dec esi
70
	call .str
71
	ret
72
endp
73
 
74
align 4
75
.str:
76
	mov ecx,10
77
	cmp eax,ecx
78
	jb @f
79
		xor edx,edx
80
		div ecx
81
		push edx
82
		;dec edi  ;смещение необходимое для записи с конца строки
83
		call .str
84
		pop eax
85
	@@:
86
	cmp edi,esi
87
	jge @f
88
		or al,0x30
89
		stosb
90
		mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор
91
	@@:
7579 IgorA 92
	ret
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