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 stack
ebx = edi
ebp = esi
if 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)总是爆炸。
你猜我在哪里错了,能帮上忙吗?
qq_慕圣0414050
米琪卡哇伊