mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 20:58:22 +00:00
ustring: more functions
This commit is contained in:
+45
-13
@@ -4,17 +4,49 @@ global arch_u_strlen
|
||||
global arch_u_strlen_cont
|
||||
|
||||
arch_u_strlen:
|
||||
xor rcx, rcx
|
||||
.loop:
|
||||
cmp byte [rdi],0
|
||||
je .done
|
||||
inc rcx
|
||||
inc rdi
|
||||
jmp .loop
|
||||
.done:
|
||||
mov [rsi], rcx
|
||||
xor rax, rax
|
||||
ret
|
||||
xor rcx, rcx
|
||||
.loop:
|
||||
cmp byte [rdi],0
|
||||
je .done
|
||||
inc rcx
|
||||
inc rdi
|
||||
jmp .loop
|
||||
.done:
|
||||
mov [rsi], rcx
|
||||
xor rax, rax
|
||||
ret
|
||||
arch_u_strlen_cont:
|
||||
mov rax, 1
|
||||
ret
|
||||
mov rax, 1
|
||||
ret
|
||||
|
||||
global arch_u_memcpy
|
||||
global arch_u_memcpy_cont
|
||||
|
||||
arch_u_memcpy:
|
||||
mov rcx, rdx
|
||||
rep movsb
|
||||
xor rax, rax
|
||||
ret
|
||||
arch_u_memcpy_cont:
|
||||
mov rax, 1
|
||||
ret
|
||||
|
||||
global arch_u_strcpy
|
||||
global arch_u_strcpy_cont
|
||||
|
||||
arch_u_strcpy:
|
||||
.loop:
|
||||
mov al, [rsi]
|
||||
mov [rdi], al
|
||||
inc rsi
|
||||
inc rdi
|
||||
test al,al
|
||||
jz .done
|
||||
jmp .loop
|
||||
.done:
|
||||
xor rax,rax
|
||||
ret
|
||||
arch_u_strcpy_cont:
|
||||
mov rax, 1
|
||||
ret
|
||||
|
||||
|
||||
@@ -3,7 +3,9 @@
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
int u_strlen(const char* str, size_t* size);
|
||||
int u_strlen(const char*, size_t*);
|
||||
int u_memcpy(void*, const void*, size_t);
|
||||
int u_strcpy(char*, const char*);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -17,3 +17,32 @@ int u_strlen(const char* str, size_t* len){
|
||||
}
|
||||
|
||||
|
||||
extern void arch_u_memcpy_cont();
|
||||
extern int arch_u_memcpy(void* dest, const void* src, size_t len);
|
||||
|
||||
int u_memcpy(void* dest, const void* src, size_t len){
|
||||
|
||||
arch_getcls()->thread->umemopfailaddr = arch_u_memcpy_cont;
|
||||
|
||||
int ret = arch_u_memcpy(dest, src, len);
|
||||
|
||||
arch_getcls()->thread->umemopfailaddr = NULL;
|
||||
|
||||
return ret == 0 ? 0 : arch_getcls()->thread->umemoperror;
|
||||
|
||||
}
|
||||
|
||||
extern void arch_u_strcpy_cont();
|
||||
extern int arch_u_strcpy(void* dest, const void* src);
|
||||
|
||||
int u_strcpy(void* dest, const void* src){
|
||||
|
||||
arch_getcls()->thread->umemopfailaddr = arch_u_strcpy_cont;
|
||||
|
||||
int ret = arch_u_strcpy(dest, src);
|
||||
|
||||
arch_getcls()->thread->umemopfailaddr = NULL;
|
||||
|
||||
return ret == 0 ? 0 : arch_getcls()->thread->umemoperror;
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user