1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
.text
.global strcmp
.type strcmp,@function
.weak strcoll
.type strcoll,@function
#ifdef HIGH_PERFORMANCE
.align 16
#endif
.Ldiff:
movzbl (%edx), %ecx
subl %ecx, %eax # (unsigned char)*p - (unsigned char)*q, so wie die Original libc
ret # und ohne Überlaufprobleme:
# (int) ((signed char)c - (signed char)d) != (int)(signed char) ((unsigned char)c - (unsigned char)d)
# c = 'ä', d = 'e': left expression: -129, right expression: 127
strcoll:
strcmp:
movl 4(%esp), %ecx
movl 8(%esp), %edx
xorl %eax, %eax
.Lloop: # Schleifenanfang liegt genau auf Modulanfang + 0x10, damit alignbar
movb (%ecx), %al
cmpb (%edx), %al
jnz .Ldiff
incl %edx
incl %ecx
testb %al, %al
jnz .Lloop
ret
|