104 lines
1.9 KiB
ArmAsm
104 lines
1.9 KiB
ArmAsm
format ELF64
|
|
|
|
;
|
|
; public exported functions
|
|
;
|
|
|
|
public _asm_ucs4_strstr
|
|
public _asm_ucs4_strchr
|
|
|
|
;
|
|
; code section
|
|
;
|
|
|
|
section '.text' executable
|
|
|
|
; constants
|
|
|
|
npos = -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
|