assembly - 谁能解释一下这个功能是做什么的?
问题描述
do_something(int):
push rbp
mov rbp, rsp
push rbx
sub rsp, 24
mov DWORD PTR [rbp-20], edi
cmp DWORD PTR [rbp-20], 1
jg .L2
mov eax, DWORD PTR [rbp-20]
jmp .L3
.L2:
mov eax, DWORD PTR [rbp-20]
sub eax, 1
mov edi, eax
call do_something(int)
mov ebx, eax
mov eax, DWORD PTR [rbp-20]
sub eax, 2
mov edi, eax
call do_something(int)
add eax, ebx
.L3:
add rsp, 24
pop rbx
pop rbp
ret
解决方案
它是 64 位 SystemV 调用约定中的未优化递归函数,带有一个返回整数值的整数参数。它在内部使用RBX
4 字节 (DWORD) 局部变量[rbp-20]
。
用否定参数调用,比如-1,它返回RAX=0x00000000_FFFFFFFF
。
用零参数调用它返回 0。
逐步通过它给出
do_something(0)=0;
do_something(1)=1;
do_something(2)=1;
do_something(3)=2;
do_something(4)=3;
do_something(5)=5;
do_something(6)=8;
do_something(7)=13;
...
通常,对于正数n ,此函数返回其两个前任的总和:do_somenging(n)=do_something(n-1)+do_something(n-2)
推荐阅读
- javascript - 为什么我只从 HttpContext 获得部分 URL?
- ios - 将数组从 objc 传递给 Swift
- python - 从表 python 中抓取特定的 td
- c# - Unity 类型为“GameObject”的对象已被销毁
- angular - 如何在 Ionic 4 中获取 ActivatedRoute 的值?
- jquery - 对象不支持 Citrix Workspace 中的属性或方法 addEventListener
- ruby - 独立 Ruby 脚本的外部配置
- php - 将复选框添加到表单并仅通过电子邮件发送给未选中的人
- flutter - Flutter:不推荐使用 BitmapDescriptor.fromAsset
- sql - 何时使用 NoLock 和 ReadPast?使用 nolock 和 ReadPast 都面临问题