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, что-бы не вылазил мусор
|
|
|
|
|
@@:
|
|
|
|
|
ret
|