1 #include "string.h"
2
strlen(const char * s)3 size_t strlen(const char *s)
4 {
5 register int __res = 0;
6 while (s[__res] != '\0')
7 {
8 ++__res;
9 }
10 return __res;
11 }
12
strcmp(const char * FirstPart,const char * SecondPart)13 int strcmp(const char *FirstPart, const char *SecondPart)
14 {
15 register int __res;
16 __asm__ __volatile__("cld \n\t"
17 "1: \n\t"
18 "lodsb \n\t"
19 "scasb \n\t"
20 "jne 2f \n\t"
21 "testb %%al, %%al \n\t"
22 "jne 1b \n\t"
23 "xorl %%eax, %%eax \n\t"
24 "jmp 3f \n\t"
25 "2: \n\t"
26 "movl $1, %%eax \n\t"
27 "jl 3f \n\t"
28 "negl %%eax \n\t"
29 "3: \n\t"
30 : "=a"(__res)
31 : "D"(FirstPart), "S"(SecondPart)
32 :);
33 return __res;
34 }
35
memset(void * dst,unsigned char C,uint64_t size)36 void *memset(void *dst, unsigned char C, uint64_t size)
37 {
38
39 int d0, d1;
40 unsigned long tmp = C * 0x0101010101010101UL;
41 __asm__ __volatile__("cld \n\t"
42 "rep \n\t"
43 "stosq \n\t"
44 "testb $4, %b3 \n\t"
45 "je 1f \n\t"
46 "stosl \n\t"
47 "1:\ttestb $2, %b3 \n\t"
48 "je 2f\n\t"
49 "stosw \n\t"
50 "2:\ttestb $1, %b3 \n\t"
51 "je 3f \n\t"
52 "stosb \n\t"
53 "3: \n\t"
54 : "=&c"(d0), "=&D"(d1)
55 : "a"(tmp), "q"(size), "0"(size / 8), "1"(dst)
56 : "memory");
57 return dst;
58 }
59
60 /**
61 * @brief 拷贝指定字节数的字符串
62 *
63 * @param dst 目标地址
64 * @param src 源字符串
65 * @param Count 字节数
66 * @return char*
67 */
strncpy(char * dst,const char * src,size_t Count)68 char *strncpy(char *dst, const char *src, size_t Count)
69 {
70 __asm__ __volatile__("cld \n\t"
71 "1: \n\t"
72 "decq %2 \n\t"
73 "js 2f \n\t"
74 "lodsb \n\t"
75 "stosb \n\t"
76 "testb %%al, %%al \n\t"
77 "jne 1b \n\t"
78 "rep \n\t"
79 "stosb \n\t"
80 "2: \n\t"
81 :
82 : "S"(src), "D"(dst), "c"(Count)
83 : "ax", "memory");
84 return dst;
85 }
86
87 /**
88 * @brief 拼接两个字符串(将src接到dest末尾)
89 *
90 * @param dest 目标串
91 * @param src 源串
92 * @return char*
93 */
strcat(char * dest,const char * src)94 char *strcat(char *dest, const char *src)
95 {
96 strcpy(dest + strlen(dest), src);
97 return dest;
98 }
99
100 /**
101 * @brief 拷贝整个字符串
102 *
103 * @param dst 目标地址
104 * @param src 源地址
105 * @return char* 目标字符串
106 */
strcpy(char * dst,const char * src)107 char *strcpy(char *dst, const char *src)
108 {
109 while (*src)
110 {
111 *(dst++) = *(src++);
112 }
113 *dst = 0;
114
115 return dst;
116 }