در مطالب قبلی با ارسال پارامتر از طریق ثبات ها آشنا شدیم.در این مطلب با ارسال پارامتراز طریق پشته آشنا خواهیم شد.

پارامترهائی که به زیربرنامه داده می شوند را می توان قبل از فراخوانی زیربرنامه در پشته اضافه کرد. پارامترها در زیربرنامه pop نمی شوند بلکه مستقیما از پشته دسترسی می شوند زیرا قبل از دستور call در پشته اضافه شده اند و آدرس برگشتی بعد از آن اضافه می شود. علاوه براین چون ممکن است در چندین جای زیربرنامه استفاده شوند معمولا درون ثبات نگهداری نمی شوند و بهتر است در حافظه پشته باقی بمانند.

یک برنامه خارجی که یک پارامتر از طریق پشته را ارسال می کند در نظربگیرید. وقتی زیربرنامه درخواست می شود پارامتر می تواند با آدرس دهی غیرمستقیم [SP+4] دسترسی شود. اگر پشته هم در زیربرنامه برای ذخیره داده استفاده شود عدد بیشتری باید به SP اضافه شود. ثبات BP را برای ارجاع به داده های درون پشته می توان به کار برد. ثبات SP با هر push و pop تغییر می کند اما BP ابتدا برابر با SP می شود و سپس ثابت می ماند در انتهای زیربرنامه مقدار اولیه BP باید برگردانده شود. بعد از اینکه زیربرنامه تمام شد پارامترهائی که در پشته اضافه شده اند باید حذف شوند.

مثال. تابع زیر طول رشته را محاسبه و آدرس شروع رشته از طریق پشته به زیربرنامه ارسال می شود.

StrLen PROC
push BP
mov BP,SP
mov SI,[BP+4]
sub CX,0
Whl: cmp byte ptr [SI],’$’
jc Endw
inc CX
inc SI
jmp Whl
EndW: pop BP
ret
StrLen ENDP

مثال. محاسبه مجموع سه عدد که از طریق پشته به زیربرنامه ارسال شده اند.

untitled