在这里输入图像描述
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将-0x1 ( %rdi )赋予%edi,而不是从%edi值中减去1,则%rdi减去1的地址将输入%edi。为什么这是必要的,这意味着什么?
问题2.
在一个函数中有两个retqs是没有意义的。测试%edi、%edi之后,跳到jne,然后使用递归函数。那么,我不知道为什么<+9>和<+25>中有两个are。不应该只有一个吗?
问题3.很难理解函数的基本功能是什么,因为我只是在学习组装。这个功能是做什么样的操作?
发布于 2022-10-08 08:59:25
问题1
它确实计算了parameter - 1,对吗?编译器显然更喜欢LEA,可能是因为它很短,可能是因为其他原因。
问题2
我敢打赌C代码中也有两个return语句。第一个存在
if (parameter == 0)
return 1;这是第一部分。第二部分返回一个不同的值,因此是单独完成的。
跳到返回没有为您节省任何东西,因为跳转的代码比返回的代码要大。
问题3
是的,很难解码组装。好像是在计算
x * F2(x-1)不管那意味着什么。
https://stackoverflow.com/questions/73995528
复制相似问题