首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“阅读程序集”我不明白这个函数是如何工作的

“阅读程序集”我不明白这个函数是如何工作的
EN

Stack Overflow用户
提问于 2022-10-08 08:34:56
回答 1查看 41关注 0票数 -3

在这里输入图像描述

代码语言:javascript
运行
复制
   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.很难理解函数的基本功能是什么,因为我只是在学习组装。这个功能是做什么样的操作?

EN

回答 1

Stack Overflow用户

发布于 2022-10-08 08:59:25

问题1

它确实计算了parameter - 1,对吗?编译器显然更喜欢LEA,可能是因为它很短,可能是因为其他原因。

问题2

我敢打赌C代码中也有两个return语句。第一个存在

代码语言:javascript
运行
复制
if (parameter == 0)
   return 1;

这是第一部分。第二部分返回一个不同的值,因此是单独完成的。

跳到返回没有为您节省任何东西,因为跳转的代码比返回的代码要大。

问题3

是的,很难解码组装。好像是在计算

代码语言:javascript
运行
复制
x * F2(x-1)

不管那意味着什么。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73995528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档