首先还是栈指针减24,应该也是为了存储多个值
然后和phase_3一样,把输入的值放在了%rcx和%rdx
输入格式也和phase_3一样,如图
然后将返回值与2作比较,如果不等于2就爆炸,所以只能输入两个数字
然后将第一个输入值d1与14作比较,如果d1<=14就跳转,否则就爆炸
跳转之后把14放入%edx,0放入%esi,d1放入%edi,并调用函数func4
现在跳到func4继续看反汇编代码
首先栈指针减8,把14放入%eax,并自减0,然后%ecx被放入14,%ecx继续逻辑右移31位,接着%eax+=%ecx再另%eax>>=1,最后ecx = rsi + rax = esi + ( ( edx -esi ) >> 31 + ( edx - esi ) ) / 2, 将%ecx与%rdi比较,如果%rdi<%ecx,就让%edx = %rcx-1,然后回到函数开头形成递归,否则另%eax返回值为0,但还会继续判断%edi和%ecx的大小,如果%ecx>=%edi才能真正返回0,否则还是要回到开头递归,结合上面%ecx<=%rdi,说明%ecx要等于%rdi才能退出返回0完成关卡
随后回到phase_4,比较0和返回值,不等于0的话就爆炸,说明返回值为0,所以回到func4,经过第一次计算,%ecx的值可以得到是7,然后是否要继续递归还要取决于d1的值,如果%rdi=7,func4就返回0,成功过关,但如果继续递归,如果%rdi小于7,%edx就等于6,%rcx就等于3,如果%rdi等于3一样可以过关,推理下去,%rdi还可以等于1和0
所以答案就为
7 0
或
3 0
或
1 0
或
0 0