'阅读Assembly'我不明白这个函数是如何工作的

bjg7j2ky  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(165)

[在此输入图像说明][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

问题一
在〈+13〉中,如果你通过莱亚给予%edi -0x1(%rdi),而不是从%edi值中减去1,%edi中会输入%rdi减去1的地址。为什么这是必要的,这意味着什么?
第二个问题。
一个函数里有两个retq是没有道理的,测试完%edi,%edi,跳到jne再用一个递归函数,那我就不知道为什么〈+9〉和〈+25〉里有两个retq,不是应该只有一个吗?
问题3:很难理解一个函数的基本功能,因为我刚刚学习汇编。这个函数是做什么操作的?

pcrecxhr

pcrecxhr1#

问题一
它 * 确实 * 计算parameter - 1,对吗?编译器显然更喜欢莱亚,可能是因为它很短,也可能是因为其他一些原因。
问题二
我敢打赌,在C代码中也有两个return语句。

if (parameter == 0)
   return 1;

因此这是第一部分。第二部分返回不同的值,因此是单独完成的。
跳转到return不会节省任何东西,因为跳转的代码比return大。
问题三
是的,很难解码汇编。看起来它计算

x * F2(x-1)

不管那是什么意思。

相关问题