Dump of assembler code for function func4 <+0>: mov %rbx,-0x18(%rsp) <+5>: mov %rbp, -0x10(%rsp) <+10>: mov %r12,-0x8(%rsp) <+15>: sub $0x18,%rsp <+19>: mov %edi,%ebx <+21>: mov %esi,%ebp <+23>: test %edi, %edi <+25>: jg 0x400fb2<func4+34> <+27>: mov $0x0,%ebp <+32>: jmp 0x400fd2<func4+66> <+34> cmp $0x1, %edi <+37>: je 0x400fd2<func4+66> <+39>: lea -0x1(%rbx),%edi <+42>: callq 0x400f90 <func4> <+47>: mov %eax,%r12d <+50>: lea -0x2(%rbx),%edi <+53>: mov %ebp,%esi <+55>: callq 0x400f90 <func4> <+60>: lea (%r12,%rax,1),%eax <+64>: add %eax,ebp <+66>: mov %ebp, %eax <+68>: mov (%rsp),%rbx <+72>: mov 0x8(%rsp), %rbp <+77>: mov 0x10(%rsp),%r12 <+82>: add $0x18,%rsp <+86>: retq这是func4的反汇编代码。而且我不确定我是否正确理解此功能。我没有在这里编写phase_4的反汇编代码,但是它需要“%d%d”输入,并且第一个整数应该在1 <= x <4的范围内。因此它应该是1,2或3。寄存器%edi首先具有值7。调用func4之后,代码将0x10(%rsp)和%eax的值进行比较,因此我应该知道调用func4之后的%eax值。我以为,反汇编的func4代码意味着put the stackebx = ediebp = esiif edi is not zero if edi is one: then eax=ebp. rearrange the stack return. else: edi = -0x1(rbx) func4 r12d = eax edi = -0x2(rbx) esi = ebp func4 eax = rax+r12+ebp rearrange the stack and return.else ebp=0 eax=ebp return但是据我了解,我无法解决。例如,如果%rsp的原始地址为0x7fffffffd5a8,则该地址将变小,直到edi的值变为0。我发现0x7fffffffd56f的值为0-并且第一个func4调用结束-但之后的值为0x7fffffffd56e为也为0-因此第二个func4调用结束-并且所有寄存器都变为0,包括eax。所以我认为第二个数字的答案是零,但是(1,0),(2,0),(3,0)总是爆炸。你猜我在哪里错了,能帮上忙吗?
3 回答
米琪卡哇伊
TA贡献1998条经验 获得超6个赞
在phase_4的反汇编代码中,esi设置为0x14(%rsp),这是phase_4的第二个输入,而edi设置为7。根据您的解释,func4(edi,esi)返回func4(edi-1,esi) )+ func4(edi-2,esi)+ esi。因此func4(7,esi)返回33 * esi。和phase_4比较0x10(%rsp)和eax。因此,phase_4的第一输入应为33 *(phase_4的第二输入)。我理解正确吗?
- 3 回答
- 0 关注
- 838 浏览
添加回答
举报
0/150
提交
取消