|
|
1.1 ! root 1: ////////// ! 2: / libc/string/i386/strcmp.s ! 3: / i386 C string library. ! 4: / ANSI 4.11.4.2, 4.11.4.4. ! 5: ////////// ! 6: ! 7: ////////// ! 8: / int strcmp(char *String1, char *String2) ! 9: / Compare String1 and String2 until mismatch or NUL seen. ! 10: / Return -1 if <, 0 if ==, 1 if >. ! 11: / ! 12: / int strncmp(char *String1, char *String2, size_t Count) ! 13: / Compare up to Count bytes of String1 and String2. ! 14: ////////// ! 15: ! 16: String1 .equ 12 ! 17: String2 .equ String1+4 ! 18: Count .equ String2+4 ! 19: ! 20: .globl strcmp ! 21: .globl strncmp ! 22: ! 23: strncmp: ! 24: movl %ecx, Count-8(%esp) / Count to ECX ! 25: orl %ecx, %ecx ! 26: jnz strcmp0 / fall in to common code... ! 27: subl %eax, %eax / Count 0, return NULL ! 28: ret ! 29: ! 30: strcmp: ! 31: movl %ecx, $-1 / Max count to ECX ! 32: ! 33: strcmp0: ! 34: push %esi ! 35: push %edi ! 36: ! 37: movl %esi, String2(%esp) / String2 address to ESI ! 38: movl %edi, String1(%esp) / String1 address to EDI ! 39: subl %edx, %edx / Result 0 to EDX ! 40: cld ! 41: ! 42: ?loop: ! 43: lodsb / String2 character to AL ! 44: scasb / Compare to String1 character ! 45: jne ?noteq / Mismatch ! 46: orb %al, %al ! 47: loopne ?loop / Continue if ECX!=0 && AL!=0 ! 48: jmp ?done / String1 == String2, return 0 ! 49: ! 50: ?noteq: ! 51: ja ?less ! 52: incl %edx / String1 > String2, return 1 ! 53: jmp ?done ! 54: ! 55: ?less: ! 56: decl %edx / String1 < String2, return -1 ! 57: ! 58: ?done: ! 59: movl %eax, %edx / Result to EAX ! 60: ! 61: pop %edi ! 62: pop %esi ! 63: ret ! 64: ! 65: / end of libc/string/i386/strcmp.s
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.