Составление рекурсивных функций на ассемблере
Функция называется рекурсивной, если она обращается к самой себе. Рассмотрим составление рекурсивной функции на примере вычисления факториала.
Пример. Составить функцию вычисления Y = N!,
если
Y = 1, если N = 0,
Y = 1 * 2 ... * N, если N > 1
Если N < 0 функция должна возвращать -1, что говорит о неправильном аргументе.
Соответствующая функция на языке С имеет вид:
unsigned fact(int n){
if(n < 0) return -1;
if(n == 0)return 1
return (n * fact(n - 1));
}
;Использование рекурсий в ассемблер программах
ideal
p586
model flat
extrn ExitProcess:proc
dataseg
n dd 4
x dd ?
codeseg
proc fact
push ebp
mov ebp,esp; [ebp+8]-n
push ebx ecx edx
mov ebx, [ebp+8]
test ebx,ebx
js m1; <0
jz m2; ==0
mov ecx, ebx
dec ebx
push ebx
call fact
mul ecx
jmp short m3
m1: mov eax,0
jmp short m3
m2: mov eax,1
m3: pop edx ecx ebx
pop ebp
ret 4
endp fact
begin:
push [n]
call fact
call ExitProcess
end begin
"Прокрутите" программу, чтобы увидеть, как изменяется состояние стека. Вы увидите, что рекурсивные функции требуют, чтобы размер стека был не меньше K * N, где K-число байт стека, используемых при каждом вызове, а N - число вызовов рекурсивной функции