|
发表于 2020-10-14 09:06:18
|
显示全部楼层
详细注释了一下,能看懂吗
;递归调用的fibo函数,其中eax寄存器用来传递参数所以不用入栈保存
- fibo:
- ;递归返回条件 eax = 1 或 eax = 2 这个返回条件可以写成 eax <= 2
- ;cmp eax, 1
- ;je _get_out
- ;cmp eax, 2
- ;je _get_out
- cmp eax,2
- jle _get_out
- push ebx
- push ecx
- push edx
-
- ;递归函数里用到了ebx,ecx,edx三个寄存器,所以这3个寄存器要入栈保存
- ;用edx来保存eax的值
- mov edx, eax
- ;eax - 1 ,并把eax作为参数递归调用 fibo ,相当于计算 fibo(i - 1)
- sub eax, 1
- call fibo
- ;返回值在eax中,取得返回值保存在ebx中
- mov ebx, eax
-
- ;将之前保存在edx中的参数赋给 eax
- mov eax, edx
- ;eax - 2,并把 eax 作为参数递归调用 fibo ,相当于计算 fibo(i-2)
- sub eax, 2
- ;这里少了一句递归调用
- call fibo
- ;返回值在eax 中,取得返回值并保存进 ecx,当然,这里纯属脱裤子放屁,直接写成 add eax,ebx 即可
- mov ecx, eax
-
- ;取得之前计算的 fibo(i-1)
- mov eax, ebx
- ;计算 fibo(i-1) + fibo(i-2)
- add eax, ecx
- pop edx
- pop ecx
- pop ebx
- ;这里少了一个返回语句,不然返回值 eax 总是1
- ret
- _get_out:
- mov eax, 1
- ret
- main:
- ;eax = 7 ,调用 fibo ,相当于 fibo(7)
- mov eax, 7
- call fibo
- ret
复制代码 |
|