; ; public exported functions ; global _asm_ucs4_strstr global _asm_ucs4_strchr ; ; code section ; section '.text' ; constants npos db -1 ;================================================================================ ; ; Поиск подстроки в строке UCS-4 (алгоритм "в лоб", подойдет для коротких строк) ; ; rdi: указатель на исходную строку ; rsi: длина исходной строки символах ; rdx: указатель на искомую подстроку ; rcx: длина подстроки в символах ; ;================================================================================ _asm_ucs4_strstr: push r12 mov r9d, dword [rdx] mov rax, rdx lea r8, [rdi + rsi*4] lea r10, [rdx + rcx*4] strstr_try_next_symbol: cmp r9d, dword [rdi] je strstr_init_counter add rdi, 4 cmp rdi, r8 jne strstr_try_next_symbol pop r12 mov rax, 0 ret strstr_init_counter: mov rdx, rax mov r12, rdi strstr_symbol_found: add rdx, 4 cmp rdx, r10 je strstr_the_end add r12, 4 mov r11d, dword [r12] cmp r11d, dword [rdx] je strstr_symbol_found add rdi, 4 jmp strstr_try_next_symbol strstr_the_end: pop r12 mov rax, rdi ret ;================================================================================ ; ; Поиск символа в строке UCS-4 ; ; rdi: указатель на исходную строку ; rsi: длина исходной строки символах ; rdx: искомый символ ; ;================================================================================ _asm_ucs4_strchr: xor r8, r8 try_next_symbol: cmp rdx, [rdi] je symbol_found add rdi, 4 inc r8 cmp rsi, r8 jne try_next_symbol mov rax, 0 ret symbol_found: mov rax, rdi ret