[在此输入图像说明][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:很难理解一个函数的基本功能,因为我刚刚学习汇编。这个函数是做什么操作的?
1条答案
按热度按时间pcrecxhr1#
问题一
它 * 确实 * 计算
parameter - 1
,对吗?编译器显然更喜欢莱亚,可能是因为它很短,也可能是因为其他一些原因。问题二
我敢打赌,在C代码中也有两个
return
语句。因此这是第一部分。第二部分返回不同的值,因此是单独完成的。
跳转到return不会节省任何东西,因为跳转的代码比return大。
问题三
是的,很难解码汇编。看起来它计算
不管那是什么意思。