cpputil/src/asm/linux/x86_64/ustring_asm.asm

102 lines
1.9 KiB
NASM

;
; 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