首页 > 解决方案 > 谁能解释一下这个功能是做什么的?

问题描述

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

标签: assemblyx86-64

解决方案


它是 64 位 SystemV 调用约定中的未优化递归函数,带有一个返回整数值的整数参数。它在内部使用RBX4 字节 (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)


推荐阅读