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 32 33 34 35 36 37 38 39
| 0000000000401338 <strings_not_equal>: 401338: 41 54 push %r12 ;原始值压入栈中 40133a: 55 push %rbp ;原始值压入栈中 40133b: 53 push %rbx ;原始值压入栈中 40133c: 48 89 fb mov %rdi,%rbx ;%rbx=%rdi 40133f: 48 89 f5 mov %rsi,%rbp ;%rbp=%rsi 401342: e8 d4 ff ff ff callq 40131b <string_length> ;获得字符串长度 401347: 41 89 c4 mov %eax,%r12d ;%r12d=%eax 40134a: 48 89 ef mov %rbp,%rdi ;%rdi=%rbp 40134d: e8 c9 ff ff ff callq 40131b <string_length> ;获得字符串长度 401352: ba 01 00 00 00 mov $0x1,%edx ;%edx=1 401357: 41 39 c4 cmp %eax,%r12d 40135a: 75 3f jne 40139b <strings_not_equal+0x63> ;比较两字符串长度,如果不同则跳转到40139b 40135c: 0f b6 03 movzbl (%rbx),%eax ;往上看,%rbx其实就是%rdi,也就是第一个字符串,因此%eax=(%rbx)即为第一个字符串的第一个字符 40135f: 84 c0 test %al,%al 401361: 74 25 je 401388 <strings_not_equal+0x50> ;如果%eax=0,则跳转到401388 401363: 3a 45 00 cmp 0x0(%rbp),%al ;往上看,%rbp其实就是%rsi,也就是第二个字符串,因此这里是判断s1的第一个字符和s2的第一个字符是否相等,如果相等跳转到401372,否则跳转到40138f 401366: 74 0a je 401372 <strings_not_equal+0x3a> 401368: eb 25 jmp 40138f <strings_not_equal+0x57> 40136a: 3a 45 00 cmp 0x0(%rbp),%al 40136d: 0f 1f 00 nopl (%rax) 401370: 75 24 jne 401396 <strings_not_equal+0x5e> 401372: 48 83 c3 01 add $0x1,%rbx ;%rbx=%rbx+1 401376: 48 83 c5 01 add $0x1,%rbp ;%rbp=%rbp+1 40137a: 0f b6 03 movzbl (%rbx),%eax 40137d: 84 c0 test %al,%al ;如果字符串1的当前字符不为0,则跳转到40136a 40137f: 75 e9 jne 40136a <strings_not_equal+0x32> 401381: ba 00 00 00 00 mov $0x0,%edx 401386: eb 13 jmp 40139b <strings_not_equal+0x63> 401388: ba 00 00 00 00 mov $0x0,%edx 40138d: eb 0c jmp 40139b <strings_not_equal+0x63> 40138f: ba 01 00 00 00 mov $0x1,%edx 401394: eb 05 jmp 40139b <strings_not_equal+0x63> 401396: ba 01 00 00 00 mov $0x1,%edx ;这几行的%edx其实都是标志位,当%edx为1时,两个字符串不相等,当%edx为0时,两个字符串相等 40139b: 89 d0 mov %edx,%eax 40139d: 5b pop %rbx 40139e: 5d pop %rbp 40139f: 41 5c pop %r12 4013a1: c3 retq
|