همراهان عزیز وب سایت آموزشی پی وی لرن وقتتون بخیر و شادی، با آموزش زبان برنامه نویسی اسمبلی (Assembly) در خدمتتون خواهیم بود. با بازگشت پذيري (recursion) در اسمبلی (Assembly) همراه هستیم.
یک روال یا تابع بازگشتی روالی است که خودش را به طور مستقیم و یا غیر مستقیم فراخوانی می کند.
بازگشت پذيري می تواند در الگوریتم های ریاضی متعددی مشاهده شود. به عنوان مثال ، پرونده محاسبه فاکتوریل یک عدد را در نظر بگیرید. فاکتوریل عدد توسط یک معادله داده شده است.
1 | Fact (n) = n * fact (n-1) for n > 0 |
به عنوان مثال: فاکتوریل ۵ برابر است با ۱*۲*۳*۴*۵ = ۵*فاکتوریل ۴ است و این می تواند نمونه خوبی برای نشان دادن یک روش بازگشتی باشد. هر الگوریتم بازگشتی باید یک شرط خاتمه داشته باشد ، یعنی فراخوانی بازگشتی برنامه هنگام تحقق یک شرط باید متوقف شود. در مورد الگوریتم فاکتوریل ، شرط پایان زمانی حاصل می شود که n باشد ۰٫
برنامه زیر نحوه اجرای فاکتوریل n به زبان اسمبلی را نشان می دهد. برای ساده نگه داشتن برنامه ، فاکتوریل ۳ را محاسبه می کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | section .text global _start ;must be declared for using gcc _start: ;tell linker entry point mov bx, 3 ;for calculating factorial 3 call proc_fact add ax, 30h mov [fact], ax mov edx,len ;message length mov ecx,msg ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov edx,1 ;message length mov ecx,fact ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel proc_fact: cmp bl, 1 jg do_calculation mov ax, 1 ret do_calculation: dec bl call proc_fact inc bl mul bl ;ax = al * bl ret section .data msg db 'Factorial 3 is:',0xa len equ $ - msg section .bss fact resb 1 |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 2 | Factorial 3 is: 6 |
در این بخش از آموزش زبان اسمبلی (Assembly) با بازگشت پذيري (recursion) در اسمبلی (Assembly) آشنا شدیم. در بخش بعد به بررسی ماکروها می پردازیم.