unistd: add execvp()
[neatlibc.git] / string.s
blob219ff1b84059a1c71bd8dc65db08b89fe893c8ac
1 format ELF
3 public memcpy
4 memcpy:
5 push esi
6 push edi
7 mov edi, [esp+12]
8 mov esi, [esp+16]
9 mov ecx, [esp+20]
10 mov eax, edi
11 cld
12 rep movsb
13 pop edi
14 pop esi
15 ret
17 public memmove
18 memmove:
19 push esi
20 push edi
21 mov edi, [esp+12]
22 mov esi, [esp+16]
23 mov ecx, [esp+20]
24 cmp edi, esi
25 jng .usual
26 mov eax, esi
27 add eax, ecx
28 cmp edi, eax
29 jg .usual
31 mov eax, edi
32 std
33 add esi, ecx
34 add edi, ecx
35 dec esi
36 dec edi
37 rep movsb
38 jmp .ret
39 .usual:
40 mov eax, edi
41 cld
42 rep movsb
43 .ret:
44 pop edi
45 pop esi
46 ret
48 public memset
49 memset:
50 push edi
51 mov edi, [esp+8]
52 mov eax, [esp+12]
53 mov ecx, [esp+16]
54 mov edx, edi
55 cld
56 rep stosb
57 pop edi
58 mov eax, edx
59 ret
61 public memchr
62 memchr:
63 mov eax, [esp+8]
64 mov ecx, [esp+12]
65 push edi
66 mov edi, [esp+8]
67 cld
68 repnz scasb
69 jne .failed
70 mov eax, edi
71 dec eax
72 jmp .ret
73 .failed:
74 xor eax, eax
75 .ret:
76 pop edi
77 ret
79 public memcmp
80 memcmp:
81 push esi
82 push edi
83 xor eax, eax
84 mov esi, [esp+12]
85 mov edi, [esp+16]
86 mov ecx, [esp+20]
87 jecxz .ret
89 cld
90 rep cmpsb
91 jz .ret
92 sbb eax, eax
93 or eax, 1
94 .ret:
95 pop edi
96 pop esi
97 ret
99 public strlen
100 strlen:
101 push edi
102 mov edi, [esp+8]
103 xor eax, eax
104 mov ecx, -1
106 repnz scasb
107 mov eax, ecx
108 not eax
109 dec eax
110 pop edi
113 public memrchr
114 memrchr:
115 mov eax, [esp+8]
116 mov ecx, [esp+12]
117 push edi
118 mov edi, [esp+8]
119 add edi, ecx
120 dec edi
122 repnz scasb
123 jne .failed
124 mov eax, edi
125 inc eax
126 jmp .ret
127 .failed:
128 xor eax, eax
129 .ret:
130 pop edi
133 public strchr
134 strchr:
135 mov ecx, [esp+4]
136 mov edx, [esp+8]
137 .loop:
138 mov al, [ecx]
139 cmp al, dl
140 jz .done
141 inc ecx
142 test al, al
143 jnz .loop
144 xor ecx, ecx
145 .done:
146 mov eax, ecx
149 public strcmp
150 strcmp:
151 mov ecx, [esp+4]
152 mov edx, [esp+8]
153 xor eax, eax
154 .loop:
155 mov al, [ecx]
156 cmp al, [edx]
157 jnz .ret
158 inc edx
159 inc ecx
160 test al, al
161 jnz .loop
163 .ret:
164 movzx ecx, byte [edx]
165 sub eax, ecx
168 public strcpy
169 strcpy:
170 push edi
171 push esi
172 mov edx, [esp+12]
173 mov esi, [esp+16]
174 mov edi, edx
176 .loop:
177 lodsb
178 stosb
179 or al, al
180 jnz .loop
181 pop esi
182 pop edi
183 mov eax, edx
186 public strrchr
187 strrchr:
188 push edi
189 mov edi, [esp+8]
190 mov ecx, [esp+12]
191 xor edx, edx
192 dec edi
193 .loop:
194 inc edi
195 test al, al
196 jz .done
197 mov al, [edi]
198 cmp al, cl
199 jnz .loop
200 mov edx, edi
201 jz .loop
202 .done:
203 mov eax, edx
204 pop edi