c语言 - 'Reading Assembly' 我不明白这个函数是如何工作的



[在此处输入图像描述][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)

不管这意味着什么。

最新更新