Files
klibc/string.asm

131 lines
2.3 KiB
NASM

section .text
global strlen
global strcpy
global strlcpy
global strcat
global strcmp
global strclr
global strlclr
;----- strlen(char* str) -----;
; return value: amount of characters before EOS was found
strlen:
xor rax, rax
.findEOS:
cmp byte [rdi+rax], 0x0
je .quit
inc rax
jmp .findEOS
.quit:
ret
;----- strcpy(char* dest, char* src) -----;
; return value: pointer to dest or NULL if nothing was copied (note that EOS is always copied to dest)
strcpy:
mov r11, rdi
xor rax, rax
xor rcx, rcx
.loop:
cmp byte [rsi], 0x0
je .0f
mov r10b, byte [rsi]
mov byte [r11], r10b
inc rsi
inc r11
inc rcx
jmp .loop
.0f:
mov byte [r11], 0x0
test rcx, rcx
jz .quit
mov rax, rdi
.quit:
ret
;----- strlcpy(char* dest, char* src, int size) -----;
; return value: Length of src
strlcpy:
mov r9, rsi
test rdx, rdx
jz .quit
js .quit
dec rdx
.loop:
cmp byte [rsi], 0x0
je .0f
mov r10b, byte [rsi]
mov byte [rdi], r10b
inc rsi
inc rdi
dec rdx
cmp rdx, 0x0
ja .loop
.0f:
mov byte [rdi], 0x0
.quit:
mov rdi, r9
call strlen
ret
;----- strcat(char* dest, char* src) -----;
; return value: pointer to dest
strcat:
mov r8, rdi
call strlen
add rdi, rax
call strcpy
mov rax, r8
ret
;----- strcmp(char* str1, char* str2) -----;
; return value: 0 if both strings are the same, otherwise index in array str1 where strings mismatch
; returns -1 if str2 is longer than str1 and no difference was found before that happens
strcmp:
call strlen
xor r10, r10
.compareLoop:
cmp byte [rdi], 0x0
je .0f
mov r11b, byte [rsi]
cmp byte [rdi], r11b
jne .mismatch
inc rdi
inc rsi
inc r10
jmp .compareLoop
.0f:
mov rax, -1
cmp byte [rsi], 0x0
jne .quit
xor rax, rax
jmp .quit
.mismatch:
mov rax, r10
.quit:
ret
;----- strclr(char* str) -----;
; Replaces all characters of a string with \0 untill EOS is found
; returns amount of changed characters
strclr:
call strlen
mov rcx, rax
mov rdx, rax
xor rax, rax
cld
rep stosb
mov rax, rdx
ret
;----- strlclr(char* str, int size) -----;
; Replaces characters of a string with \0, using arg size
; <!> DANGEROUS FUNCTION, it might exceed string boundaries if used incorrectly. Use strclr() instead!
; Function has no return value, rax will be 0 (0x0 stored in rax for opcode stosb)
strlclr:
mov rcx, rsi
xor rax, rax
cld
rep stosb
ret