۷
پشته (Stack) و توابع
نحوه کار با پشته حافظه و تعریف و فراخوانی توابع.
پشته (Stack): یک انباری موقت
پشته یه قسمت از حافظه RAM هست که مثل یه стопка بشقاب عمل میکنه (LIFO: Last-In, First-Out). یعنی آخرین چیزی که توش میذاری، اولین چیزیه که برمیداری. ما از پشته برای ذخیره موقت مقادیر رجیسترها، پاس دادن پارامتر به توابع و ذخیره آدرس بازگشت استفاده میکنیم.
mov eax, 111
mov ebx, 222
push eax ; مقدار EAX رو روی پشته بذار
push ebx ; مقدار EBX رو روی پشته بذار
pop eax ; آخرین مقدار (۲۲۲) رو از پشته بردار و در EAX بریز
pop ebx ; مقدار بعدی (۱۱۱) رو از پشته بردار و در EBX بریز
; حالا مقدار EAX و EBX با هم جابجا شده!
; EAX = 222, EBX = 111
توابع: سازماندهی کد
برای تعریف و فراخوانی توابع از دستورات `CALL` و `RET` استفاده میکنیم. `CALL` آدرس دستور بعدی رو روی پشته `push` میکنه و بعد به آدرس تابع میپره. `RET` هم اون آدرس رو از پشته `pop` میکنه و به اجرای برنامه از همونجا ادامه میده.
section .text
global _start
_start:
mov eax, 5
mov ebx, 10
call sum_function ; تابع رو صدا بزن
; نتیجه الان در EAX قرار داره
; ... کد خروج از برنامه
sum_function:
add eax, ebx ; eax = eax + ebx
ret ; به جایی که ازش اومدی برگرد