[在此处输入图像描述][1]
0x000000000000117c <+0>: test %edi,%edi
0x000000000000117e <+2>: jne 0x1186 <F2+10>
0x0000000000001180 <+4>: mov $0x1,%eax
0x0000000000001185 <+9>: retq
0x0000000000001186 <+10>: push %rbx
0x0000000000001187 <+11>: mov %edi,%ebx
0x0000000000001189 <+13>: lea -0x1(%rdi),%edi
0x000000000000118c <+16>: callq 0x117c <F2>
0x0000000000001191 <+21>: imul %ebx,%eax
0x0000000000001194 <+24>: pop %rbx
0x0000000000001195 <+25>: retq
问题1
在<13>,如果通过lea给%edi 0x1(%rdi(,而不是从%edi值中减去1,则在%edi中输入%rdi减去1的地址。为什么这是必要的,这意味着什么?
问题2。
在一个函数中包含两个retq是没有意义的。在测试%edi、%edi之后,跳转到jne,然后使用递归函数。那么我不知道为什么<9>并且<25>。难道不应该只有一个吗?
问题3。很难理解函数的基本功能,因为我只是在学习汇编。该函数的作用是什么?
问题1
它计算parameter - 1
,对吗?编译器显然更喜欢LEA,可能是因为它很短,也可能是因为其他原因。
问题2
我打赌在C代码中还有两个return
语句。第一个是
if (parameter == 0)
return 1;
这就是第一部分。第二部分返回不同的值,因此是单独完成的。
跳转到返回值不会为您节省任何费用,因为跳转的代码比返回值大。
问题3
是的,很难解码程序集。似乎它计算
x * F2(x-1)
不管这意味着什么。