تعداد آرگومان ورودی

HO3EINBABAIE

New Member
سلام دوستان در سوال زیر ، 2 آرگومان ورودی در زیر روال داریم ؟
2.PNG
ینی گزینه "ب" درسته ؟
 

the_king

مدیرکل انجمن
سلام دوستان در سوال زیر ، 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
 

HO3EINBABAIE

New Member
قاعده کلی اینه، تعداد 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
مرسی از توضیحاتتون
بنابر این میشه اینطور استدلال کرد که منظور تعداد آرگومان هایی بوده که وارد شده و به PUSH کاری نداره ؟
ینی دو آرگومان وارد شده و گزینه الف صحیح ؟
 

the_king

مدیرکل انجمن
مرسی از توضیحاتتون
بنابر این میشه اینطور استدلال کرد که منظور تعداد آرگومان هایی بوده که وارد شده و به PUSH کاری نداره ؟
ینی دو آرگومان وارد شده و گزینه الف صحیح ؟
نه متاسفانه. باید ببینید کجا PUSH میشه و کجا POP. قرار بوده آرگومان قبل از فراخوانی روال در پشته PUSH بشه و در روال POP بشه.
فرضا در این دو تا کد MYPROC اصلا آرگومان ورودی نداره :
کد:
MOV     AX, 5
MOV     BX, 87
PUSH    AX
PUSH    BX
POP     BX
POP     AX
CALL    MYPROC

کد:
MOV     AX, 5
MOV     BX, 87
PUSH    AX
PUSH    BX
CALL    MYPROC
POP     BX
POP     AX
در اولی قبل از فراخوانی MYPROC هر چی در پشته قرار داده بود خارج شده و چیزی در پشته نمونده که MYPROC برش داره.
در دومی هم هر چیزی که در پشته قرار داده بود توسط خودش بعدا خارج شده و MYPROC این وسط قرار نبوده چیزی رو POP کنه.
 

HO3EINBABAIE

New Member
خب الان ینی منظورتون اینه که گزینه ها غلطه ؟
نه متاسفانه. باید ببینید کجا PUSH میشه و کجا POP. قرار بوده آرگومان قبل از فراخوانی روال در پشته PUSH بشه و در روال POP بشه.
فرضا در این دو تا کد MYPROC اصلا آرگومان ورودی نداره :
کد:
MOV     AX, 5
MOV     BX, 87
PUSH    AX
PUSH    BX
POP     BX
POP     AX
CALL    MYPROC

کد:
MOV     AX, 5
MOV     BX, 87
PUSH    AX
PUSH    BX
CALL    MYPROC
POP     BX
POP     AX
در اولی قبل از فراخوانی MYPROC هر چی در پشته قرار داده بود خارج شده و چیزی در پشته نمونده که MYPROC برش داره.
در دومی هم هر چیزی که در پشته قرار داده بود توسط خودش بعدا خارج شده و MYPROC این وسط قرار نبوده چیزی رو POP کنه.
 

the_king

مدیرکل انجمن
خب الان ینی منظورتون اینه که گزینه ها غلطه ؟
میتونه اشتباه نباشه، با این فرض که گزینه ها فقط تعداد آرگومان ورودی رو مشخص کرده اند، و اشاره ای به اینکه روال مقدار بازگشتی در پشته داره یا نه نکرده اند.
اما معمولا از پشته برای ارسال مقدار بازگشتی استفاده نمیشه و اگر قبل از روال اون AX ئه PUSH شده و بعد از روال AX ئه POP شده، معمولا به این معنا است که اون AX برای استفاده توسط روال در پشته قرار داده نشده و ربطی به آرگومان های روال نداشته. اگر این سوال گزینه یک آرگومانی داشته باشه، گزینه بهتری است نسبت به دو آرگومانی.
 

جدیدترین ارسال ها

بالا