۷

پشته (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          ; به جایی که ازش اومدی برگرد