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
我想,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) 总是会爆炸炸弹。
你能猜出我错在哪里并帮忙吗?