سلام دوستان در سوال زیر ، 2 آرگومان ورودی در زیر روال داریم ؟
مشاهده پیوست 114703
ینی گزینه "ب" درسته ؟
قاعده کلی اینه، تعداد PUSH ها همیشه با تعداد POP ها برابر ئه. اگر جایی سه تا PUSH بود، باید حتما سه POP باشه، نه دو تا و نه چهار تا.
فرض کنید که میخواهید به یک روال MYPROC تعدادی آرگومان ورودی ارسال کنید، قاعده ای که بکار می برید هم این باشه که شما آرگومان ها رو قبل از فراخوانی MYPROC در پشته PUSH کنید و اون MYPROC آرگومان ها رو با POP برداره و وقتی از MYPROC خارج شد دیگه اثری از اون آرگومان ها در پشته نباشه. حالا کد رو ببینید، دو تا PUSH می بینید و یک POP. در MYPROC باید به تعدادی PUSH و POP باشه تا تعداد ایندو برابر بشه.
AX رو پیش از فراخوانی MYPROC در پشته PUSH کرده، اما همون AX رو خودش (نه در MYPROC) بعد از خاتمه MYPROC با POP از پشته برداشته.
اگر MYPROC میومد و اون AX رو از پشته POP میکرد که دیگه مقدارش در پشته باقی نمی ماند که حالا بعد از خاتمه MYPROC بخواهیم با POP از پشته برش داریم. این برای ما یک نشانه است که MYPROC میتونسته دو تا کار کرده باشه :
حالت اول - MYPROC فقط مقدار BX رو از پشته POP کرده و تمام. که کد میشه دو تا PUSH و دو تا POP. که معنی اش اینه که MYPROC صرفا یک آرگومان ورودی BX داشته و در صورت سوال هم همچین گزینه ای نیست.
حالت دوم - MYPROC مقدار AX و BX رو از پشته POP کرده و بعدش خودش یک مقدار بازگشتی جدید رو در پشته PUSH کرده که بعد از خاتمه MYPROC در AX ئه POP شده. یعنی کد سه تا PUSH و سه تا POP داشته. که معنی اش اینه که MYPROC دو آرگومان ورودی داشته و یک مقدار بازگشتی که اونم در پشته قرار داشته (که البته مرسوم نیست که مقدار بازگشتی در پشته باشه).
اگر من طراح این سوال بودم گزینه یک آرگومان ورودی رو قرار میدادم، اما در حالت اول، چرا اومده AX رو PUSH و POP کرده؟ برای اینکه اون مقدار 5 که در AX بود برایش اهمیت داره و نگرانه که MYPROC این مقدار رو تغییر بده. اینکار رو کرده که اگر در MYPROC مقدار AX تغییر کرد، مقدار قبلی AX که 5 بود رو از قبل در پشته نگهداشته باشه تا بعد خاتمه MYPROC مقدار قبلی رو بازیابی کنه و مقدار 5 رو برگردونه در AX