2009-12-29 00:19:20 +01:00
|
|
|
|
;
|
2019-01-23 23:08:19 +01:00
|
|
|
|
; Строковые функции
|
2009-12-29 00:19:20 +01:00
|
|
|
|
;
|
|
|
|
|
|
2019-01-23 23:08:19 +01:00
|
|
|
|
;output:
|
|
|
|
|
; eax = strlen
|
|
|
|
|
align 4
|
|
|
|
|
proc str_len, str1:dword
|
|
|
|
|
mov eax,[str1]
|
|
|
|
|
@@:
|
|
|
|
|
cmp byte[eax],0
|
|
|
|
|
je @f
|
|
|
|
|
inc eax
|
|
|
|
|
jmp @b
|
|
|
|
|
@@:
|
|
|
|
|
sub eax,[str1]
|
2009-12-29 00:19:20 +01:00
|
|
|
|
ret
|
2019-01-23 23:08:19 +01:00
|
|
|
|
endp
|
2009-12-29 00:19:20 +01:00
|
|
|
|
|
2019-01-23 23:08:19 +01:00
|
|
|
|
align 4
|
|
|
|
|
proc str_cat uses eax ecx edi esi, str1:dword, str2:dword
|
|
|
|
|
mov esi,[str2]
|
|
|
|
|
stdcall str_len,esi
|
|
|
|
|
mov ecx,eax
|
2013-02-14 22:09:13 +01:00
|
|
|
|
inc ecx
|
2019-01-23 23:08:19 +01:00
|
|
|
|
mov edi,[str1]
|
|
|
|
|
stdcall str_len,edi
|
|
|
|
|
add edi,eax
|
|
|
|
|
cld
|
|
|
|
|
repne movsb
|
2009-12-29 00:19:20 +01:00
|
|
|
|
ret
|
2019-01-23 23:08:19 +01:00
|
|
|
|
endp
|
2013-02-14 22:09:13 +01:00
|
|
|
|
|
|
|
|
|
;description:
|
|
|
|
|
; проверяет содержится ли строка str1 в строке str0
|
|
|
|
|
; проверка делается только начиная с первых символов, указанных в str0 и str1
|
|
|
|
|
; пример 1: если str0='aaabbbccc', str1='bbb' совпадения не будет
|
|
|
|
|
; пример 2: если str0='aaabbbccc', str1='aaa' совпадение будет
|
|
|
|
|
;output:
|
|
|
|
|
; al = 0 если строка str1 содержится в str0
|
|
|
|
|
; al != 0 если строка str1 не содержится в str0
|
|
|
|
|
align 4
|
|
|
|
|
proc str_instr uses edi esi, str0:dword, str1:dword
|
|
|
|
|
;xor eax,eax
|
|
|
|
|
mov edi,[str0]
|
|
|
|
|
mov esi,[str1]
|
|
|
|
|
cld
|
|
|
|
|
@@:
|
2019-01-23 23:08:19 +01:00
|
|
|
|
lodsb
|
|
|
|
|
or al,al
|
|
|
|
|
jz .e1
|
2013-02-14 22:09:13 +01:00
|
|
|
|
scasb ;сравниваем символы
|
|
|
|
|
jz @b ;если совпали, то переходим к сравнению следующих
|
|
|
|
|
;сюда попадаем если строки не совпали
|
|
|
|
|
sub al,[edi-1]
|
|
|
|
|
.e1: ;сюда попадаем если строка str1 (esi) закончилась
|
|
|
|
|
ret
|
|
|
|
|
endp
|
2009-12-29 00:19:20 +01:00
|
|
|
|
|
2019-01-23 23:08:19 +01:00
|
|
|
|
;input:
|
|
|
|
|
; eax - число
|
|
|
|
|
; edi - буфер для строки
|
|
|
|
|
; len - длинна буфера
|
|
|
|
|
;output:
|
|
|
|
|
align 4
|
|
|
|
|
proc convert_int_to_str uses eax ecx edx edi esi, len:dword
|
|
|
|
|
mov esi,[len]
|
|
|
|
|
add esi,edi
|
|
|
|
|
dec esi
|
|
|
|
|
call .str
|
|
|
|
|
ret
|
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
|
align 4
|
|
|
|
|
.str:
|
|
|
|
|
mov ecx,10
|
|
|
|
|
cmp eax,ecx
|
|
|
|
|
jb @f
|
|
|
|
|
xor edx,edx
|
|
|
|
|
div ecx
|
|
|
|
|
push edx
|
|
|
|
|
;dec edi ;смещение необходимое для записи с конца строки
|
|
|
|
|
call .str
|
|
|
|
|
pop eax
|
|
|
|
|
@@:
|
|
|
|
|
cmp edi,esi
|
|
|
|
|
jge @f
|
|
|
|
|
or al,0x30
|
|
|
|
|
stosb
|
|
|
|
|
mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор
|
|
|
|
|
@@:
|
2019-01-29 21:02:48 +01:00
|
|
|
|
ret
|
|
|
|
|
|
|
|
|
|
;input:
|
|
|
|
|
; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
|
|
|
|
|
;output:
|
|
|
|
|
; eax - число
|
|
|
|
|
align 4
|
|
|
|
|
proc conv_str_to_int, buf:dword
|
|
|
|
|
xor eax,eax
|
|
|
|
|
push ebx ecx esi
|
|
|
|
|
xor ebx,ebx
|
|
|
|
|
mov esi,[buf]
|
|
|
|
|
;определение отрицательных чисел
|
|
|
|
|
xor ecx,ecx
|
|
|
|
|
inc ecx
|
|
|
|
|
cmp byte[esi],'-'
|
|
|
|
|
jne @f
|
|
|
|
|
dec ecx
|
|
|
|
|
inc esi
|
|
|
|
|
@@:
|
|
|
|
|
|
|
|
|
|
cmp word[esi],'0x'
|
|
|
|
|
je .load_digit_16
|
|
|
|
|
|
|
|
|
|
.load_digit_10: ;считывание 10-тичных цифр
|
|
|
|
|
mov bl,byte[esi]
|
|
|
|
|
cmp bl,'0'
|
|
|
|
|
jl @f
|
|
|
|
|
cmp bl,'9'
|
|
|
|
|
jg @f
|
|
|
|
|
sub bl,'0'
|
|
|
|
|
imul eax,10
|
|
|
|
|
add eax,ebx
|
|
|
|
|
inc esi
|
|
|
|
|
jmp .load_digit_10
|
|
|
|
|
jmp @f
|
|
|
|
|
|
|
|
|
|
.load_digit_16: ;считывание 16-ричных цифр
|
|
|
|
|
add esi,2
|
|
|
|
|
.cycle_16:
|
|
|
|
|
mov bl,byte[esi]
|
|
|
|
|
cmp bl,'0'
|
|
|
|
|
jl @f
|
|
|
|
|
cmp bl,'f'
|
|
|
|
|
jg @f
|
|
|
|
|
cmp bl,'9'
|
|
|
|
|
jle .us1
|
|
|
|
|
cmp bl,'A'
|
|
|
|
|
jl @f ;отсеиваем символы >'9' и <'A'
|
|
|
|
|
.us1: ;составное условие
|
|
|
|
|
cmp bl,'F'
|
|
|
|
|
jle .us2
|
|
|
|
|
cmp bl,'a'
|
|
|
|
|
jl @f ;отсеиваем символы >'F' и <'a'
|
|
|
|
|
sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
|
|
|
|
|
.us2: ;составное условие
|
|
|
|
|
sub bl,'0'
|
|
|
|
|
cmp bl,9
|
|
|
|
|
jle .cor1
|
|
|
|
|
sub bl,7 ;convert 'A' to '10'
|
|
|
|
|
.cor1:
|
|
|
|
|
shl eax,4
|
|
|
|
|
add eax,ebx
|
|
|
|
|
inc esi
|
|
|
|
|
jmp .cycle_16
|
|
|
|
|
@@:
|
|
|
|
|
cmp ecx,0 ;если число отрицательное
|
|
|
|
|
jne @f
|
|
|
|
|
sub ecx,eax
|
|
|
|
|
mov eax,ecx
|
|
|
|
|
@@:
|
|
|
|
|
pop esi ecx ebx
|
|
|
|
|
ret
|
|
|
|
|
endp
|