第四关
0000000000400fc1 <phase_4>:
400fc1: 4883 ec 18 sub $0x18, %rsp
400fc5: 488d 54 24 0c lea 0xc(%rsp), %rdx
400fca: bec1 1e 40 00 mov $0x401ec1, %esi
400fcf: b800 00 00 00 mov $0x0, %eax
400fd4: e8d7 fa ff ff callq 400ab0 <__isoc99_sscanf@plt>
400fd9: 83f8 01 cmp $0x1, %eax
400fdc: 7507 jne 400fe5<phase_4+0x24>
400fde: 837c 24 0c 00 cmpl $0x0, 0xc(%rsp) //输入的数字
400fe3: 7f05 jg 400fea <phase_4+0x29> //大于0
400fe5: e853 06 00 00 callq 40163d <explode_bomb>
400fea: 8b7c 24 0c mov 0xc(%rsp), %edi //传参进函数
400fee: e891 ff ff ff callq 400f84 <func4>
400ff3: 83f8 37 cmp $0x37, %eax
400ff6: 7405 je 400ffd<phase_4+0x3c>
400ff8: e840 06 00 00 callq 40163d<explode_bomb>
400ffd: 4883 c4 18 add $0x18, %rsp
401001: c3 retq
这一关有用到函数:
0000000000400f84 <func4>:
400f84: 4889 5c 24 f0 mov %rbx, -0x10(%rsp)
400f89: 4889 6c 24 f8 mov %rbp, -0x8(%rsp)
400f8e: 4883 ec 18 sub $0x18, %rsp
400f92: 89fb mov %edi, %ebx
400f94: b801 00 00 00 mov $0x1, %eax
400f99: 83ff 01 cmp $0x1, %edi //与1进行比较
400f9c: 7e14 jle 400fb2 <func4+0x2e> //小于等于
400f9e: 8d7b ff lea -0x1(%rbx), %edi //n-1
400fa1: e8de ff ff ff callq 400f84 <func4> //递归调用fun4
400fa6: 89c5 mov %eax, %ebp
400fa8: 8d7b fe lea -0x2(%rbx), %edi //n-2
400fab: e8d4 ff ff ff callq 400f84 <func4> //递归调用fun4
400fb0: 01e8 add %ebp, %eax
400fb2: 488b 5c 24 08 mov 0x8(%rsp), %rbx
400fb7: 488b 6c 24 10 mov 0x10(%rsp), %rbp
400fbc: 4883 c4 18 add $0x18, %rsp
400fc0: c3 retq
要求是输入一个数,要求这个数比0大,而且将这个数作为 func4 的参数。然后要求func4函数的返回值为55(0x37)。
而func4这个函数是个递归函数,所以这题的关键是func4函数。我们只要写出该函数的 C 形式,就容易多了。
int func4(int n) {
if (n <= 1)
return 1;
return func4(n-1) + func4(n-2);
}
int main() {
int i;
for (i = 2; 1; i++) {
if (func4(i) == 55)
break;
}
printf("%d\n", i);
}