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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| 00000000004010f4 <phase_6>: 4010f4: 41 56 pushq %r14 4010f6: 41 55 pushq %r13 4010f8: 41 54 pushq %r12 4010fa: 55 pushq %rbp 4010fb: 53 pushq %rbx 4010fc: 48 83 ec 50 subq $80, %rsp // 开栈,分配
401100: 49 89 e5 movq %rsp, %r13 401103: 48 89 e6 movq %rsp, %rsi // %rsp -> %r13 -> %rsi 401106: e8 51 03 00 00 callq 0x40145c <read_six_numbers> // input = 6*, %rsi = 0 40110b: 49 89 e6 movq %rsp, %r14 40110e: 41 bc 00 00 00 00 movl $0, %r12d // %r12d = 0
// loop_2 401114: 4c 89 ed movq %r13, %rbp 401117: 41 8b 45 00 movl (%r13), %eax 40111b: 83 e8 01 subl $1, %eax // %eax - 1 40111e: 83 f8 05 cmpl $5, %eax 401121: 76 05 jbe 0x401128 <phase_6+0x34> // %eax <= 5 401123: e8 12 03 00 00 callq 0x40143a <explode_bomb> 401128: 41 83 c4 01 addl $1, %r12d // %r12d += 1 40112c: 41 83 fc 06 cmpl $6, %r12d 401130: 74 21 je 0x401153 <phase_6+0x5f> // 遍历完 6 个数后跳出 loop_2 401132: 44 89 e3 movl %r12d, %ebx // loop_1(%ebx -> i = 0; i++; i >= 5) 401135: 48 63 c3 movslq %ebx, %rax // slq -> sign extension long to quad 401138: 8b 04 84 movl (%rsp,%rax,4), %eax 40113b: 39 45 00 cmpl %eax, (%rbp) 40113e: 75 05 jne 0x401145 <phase_6+0x51> 401140: e8 f5 02 00 00 callq 0x40143a <explode_bomb> 401145: 83 c3 01 addl $1, %ebx 401148: 83 fb 05 cmpl $5, %ebx 40114b: 7e e8 jle 0x401135 <phase_6+0x41> // loop_1 end 不能等于 %rbp 指向的一个数 40114d: 49 83 c5 04 addq $4, %r13 // 指向下一个数 401151: eb c1 jmp 0x401114 <phase_6+0x20> // loop_2 end // 总之上面就是就是让这六个数各不相同
401153: 48 8d 74 24 18 leaq 24(%rsp), %rsi // %rsi 指向最后一个数的末尾 401158: 4c 89 f0 movq %r14, %rax // 指向第一个数 40115b: b9 07 00 00 00 movl $7, %ecx // %ecx = $7 // loop 401160: 89 ca movl %ecx, %edx // %edx = $7 401162: 2b 10 subl (%rax), %edx // %edx -= (%rax) 401164: 89 10 movl %edx, (%rax) // (%rax) = 7 - %rax 401166: 48 83 c0 04 addq $4, %rax // 指向下一个数 40116a: 48 39 f0 cmpq %rsi, %rax // 查看是否到末尾 40116d: 75 f1 jne 0x401160 <phase_6+0x6c> // loop end %rax 指到最后一个数末尾停下 40116f: be 00 00 00 00 movl $0, %esi // %esi = 0 401174: eb 21 jmp 0x401197 <phase_6+0xa3> // 跳入下面的循环 // 这里数字变为 7 - a_x
// LOOP 401176: 48 8b 52 08 movq 8(%rdx), %rdx // %rdx += 8 40117a: 83 c0 01 addl $1, %eax // %eax += 1 40117d: 39 c8 cmpl %ecx, %eax // 7, %eax 40117f: 75 f5 jne 0x401176 <phase_6+0x82> // 401181: eb 05 jmp 0x401188 <phase_6+0x94> // loop 401183: ba d0 32 60 00 movl $6304464, %edx # imm = 0x6032D0 // "332, 168, 924, 691, 477, 443" -> "3, 4, 5, 6, 1, 2" -> "4, 3, 2, 1, 6, 5" 401188: 48 89 54 74 20 movq %rdx, 32(%rsp,%rsi,2) // %rdx -> %rsp + 2*%rsi + 32 40118d: 48 83 c6 04 addq $4, %rsi // %rsi += 4 401191: 48 83 fe 18 cmpq $24, %rsi // 6 次后 401195: 74 14 je 0x4011ab <phase_6+0xb7> // 跳出 LOOP 401197: 8b 0c 34 movl (%rsp,%rsi), %ecx // %ecx = %rsp + %rsi; %ecx 指向下一个数 40119a: 83 f9 01 cmpl $1, %ecx 40119d: 7e e4 jle 0x401183 <phase_6+0x8f> // 到 a_x <= 1 // loop end 40119f: b8 01 00 00 00 movl $1, %eax // 初始化 %eax 4011a4: ba d0 32 60 00 movl $6304464, %edx # imm = 0x6032D0 4011a9: eb cb jmp 0x401176 <phase_6+0x82> // LOOP END // 存在一个链表, 读取到栈中 4011ab: 48 8b 5c 24 20 movq 32(%rsp), %rbx // (%rsp + 32) -> %rbx 4011b0: 48 8d 44 24 28 leaq 40(%rsp), %rax // %rax 指到下一个特殊值添加处 4011b5: 48 8d 74 24 50 leaq 80(%rsp), %rsi // %rsi 指向开栈栈底 4011ba: 48 89 d9 movq %rbx, %rcx // %rbx -> %rcx
// loop 4011bd: 48 8b 10 movq (%rax), %rdx 4011c0: 48 89 51 08 movq %rdx, 8(%rcx) 4011c4: 48 83 c0 08 addq $8, %rax 4011c8: 48 39 f0 cmpq %rsi, %rax // 到顶则停下跳出 loop 4011cb: 74 05 je 0x4011d2 <phase_6+0xde> 4011cd: 48 89 d1 movq %rdx, %rcx 4011d0: eb eb jmp 0x4011bd <phase_6+0xc9> // loop end 4011d2: 48 c7 42 08 00 00 00 00 movq $0, 8(%rdx) // %rdx + 8 = 0 4011da: bd 05 00 00 00 movl $5, %ebp // %ebp = 5
// loop 4011df: 48 8b 43 08 movq 8(%rbx), %rax 4011e3: 8b 00 movl (%rax), %eax 4011e5: 39 03 cmpl %eax, (%rbx) // %eax >= (%rbx) 4011e7: 7d 05 jge 0x4011ee <phase_6+0xfa> // %rbx+8 >= %rbx 4011e9: e8 4c 02 00 00 callq 0x40143a <explode_bomb> 4011ee: 48 8b 5b 08 movq 8(%rbx), %rbx // %rbx += 8 4011f2: 83 ed 01 subl $1, %ebp // %ebp -= 1; 计数 4011f5: 75 e8 jne 0x4011df <phase_6+0xeb> // %ebp = 0 -> 5 - 1 * 5 // loop end 循环 5 次, 进行次序检测, 值为链表上的为准
4011f7: 48 83 c4 50 addq $80, %rsp // 归还栈 4011fb: 5b popq %rbx 4011fc: 5d popq %rbp 4011fd: 41 5c popq %r12 4011ff: 41 5d popq %r13 401201: 41 5e popq %r14 401203: c3 retq
|