详细注释了一下,能看懂吗
;递归调用的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
|