Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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