对于phase_2还是首先看phase_2的反汇编代码
首先将两个寄存器压入栈
然后栈顶减去40个字节,把栈指针,应该是一个地址放入第二参数并调用read_six_numbers,使得该地址访问的内存赋值
对于该函数的输入形式暂不做讨论,继续看反汇编代码
然后将1和%rsp中地址指向内存中的值比较大小,可以看出数据类型应该为int,因为后缀为cmpl的l,如果该值等于1就跳转到400f30,否则结束,所以可以看出该值就为1
从400f30继续看,分别将%rsp+4和%rsp+24的地址放入了%rbx和%rbp,可以看出,加上前面的1的地址为%rsp,地址一共占了24个字节,再加上数据类型为int,4个字节,就知道为6个连续的数字存储在栈中
然后是一次无条件的跳转到400f17,将(%rbx-4)放入%eax,再将%eax乘2,比较%eax和%rbx地址指向内存中的值,如果相等就跳转,不相等就爆炸,一直下去,目标都是将%eax×2
再回到read_six_number
通过读取0x4025c3中的值
得到输入形式为
所以答案为从1开始乘2五次
1 2 4 8 16 32