mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 06: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
|
global arch_u_strlen_cont
|
||||||
|
|
||||||
arch_u_strlen:
|
arch_u_strlen:
|
||||||
xor rcx, rcx
|
xor rcx, rcx
|
||||||
.loop:
|
.loop:
|
||||||
cmp byte [rdi],0
|
cmp byte [rdi],0
|
||||||
je .done
|
je .done
|
||||||
inc rcx
|
inc rcx
|
||||||
inc rdi
|
inc rdi
|
||||||
jmp .loop
|
jmp .loop
|
||||||
.done:
|
.done:
|
||||||
mov [rsi], rcx
|
mov [rsi], rcx
|
||||||
xor rax, rax
|
xor rax, rax
|
||||||
ret
|
ret
|
||||||
arch_u_strlen_cont:
|
arch_u_strlen_cont:
|
||||||
mov rax, 1
|
mov rax, 1
|
||||||
ret
|
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>
|
#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
|
#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