ورود

View Full Version : مشکل در فهم استک



pooriasnipe
سه شنبه 31 تیر 1393, 12:00 عصر
سلام.دستور زیر چرا محتوای دو متغیر رو عوض میکنه.اصلا مگه میشه تو استک اول پایینتررو pop کرد.ممنون میشم توضیح بدید
push Value
push Count
pop Value
pop Count

m.j_banitaba
سه شنبه 31 تیر 1393, 12:09 عصر
محتوای دو متغیر رو عوض میکنه

Count->Value:2->3
Value->Count:1->4

pooriasnipe
سه شنبه 31 تیر 1393, 12:11 عصر
میشه بیشتر توضیح بدید.من خیلی برنامه نویسیم خوب نیست

Delphi Coder
سه شنبه 31 تیر 1393, 14:56 عصر
یک ظرف استوانه ای شکل رو در نظر بگیرید که یک سمتش بسته هست. شما استوانه رو روی زمین قرار میدین و شروع میکنید اشیایی رو به داخل اون میریزید حالا اگر بخواید اشیا رو یکی یکی از اون خارج کنید آخرین شی که گذاشته بودید در استوانه اولین شی هست که خارج میشه.

jeson_park
سه شنبه 31 تیر 1393, 15:20 عصر
سلام.دستور زیر چرا محتوای دو متغیر رو عوض میکنه.اصلا مگه میشه تو استک اول پایینتررو pop کرد.ممنون میشم توضیح بدید
push Value
push Count
pop Value
pop Count

این اشتباهه
از کجا آوردین؟؟؟ :گیج:
قانوناً باید اینجوری باشه
push Value
push Count
pop Count
pop Value
نع؟!؟؟!؟ :اشتباه:

Delphi Coder
سه شنبه 31 تیر 1393, 17:24 عصر
این اشتباهه
از کجا آوردین؟؟؟ :گیج:
قانوناً باید اینجوری باشه
push Value
push Count
pop Count
pop Value
نع؟!؟؟!؟ :اشتباه:

اشتباه نیست. برای عوض کردن محتوای دو متغییر کاملا درسته. ببینید قانون نداریم اینجا. اینها دستورات اسمبلی هستند PUSH مقدار پارامترشو توی استک میزاره و دستور POP یک مقدار از استک رو برمیداره و مقدارش رو در پارامترش قرار میده. برای همین هست که در اسمبلی 8086 دستوراتی از قبیل
PUSH CS
POP DSزیاد میبینید برای اینکه محتوای رجیستر دیگه ای دستکاری نشه یا نیاز به تعریف متغییر کمکی نباشه اینکار رو میکنند (البته میدونید که MOV DS,CS نداریم تو اسمبلی)

masoud.8086
جمعه 03 مرداد 1393, 15:46 عصر
اشتباه نیست. برای عوض کردن محتوای دو متغییر کاملا درسته. ببینید قانون نداریم اینجا. اینها دستورات اسمبلی هستند PUSH مقدار پارامترشو توی استک میزاره و دستور POP یک مقدار از استک رو برمیداره و مقدارش رو در پارامترش قرار میده. برای همین هست که در اسمبلی 8086 دستوراتی از قبیل
PUSH CS
POP DSزیاد میبینید برای اینکه محتوای رجیستر دیگه ای دستکاری نشه یا نیاز به تعریف متغییر کمکی نباشه اینکار رو میکنند (البته میدونید که MOV DS,CS نداریم تو اسمبلی)

بله برنامه كاملا درسته جا دو مقدار رو عوض ميكنه فقط استفاده از اين نوع دستورات كه با استك كار ميكنند باعث كندي برنامه ميشود با 3 دستور mov هم ميتوان اين كارو انجام داد كه به مراتب سرعت كار بالا تر است همچنين در مورد دستور mov ds,cs بله همچنين دستوري نداريم و بايد از يك ثبات كمكي استفاده كرد كه فقط و فقط ميتوان از ax استفاده نمود.

Delphi Coder
پنج شنبه 09 مرداد 1393, 15:21 عصر
استفاده از اين نوع دستورات كه با استك كار ميكنند باعث كندي برنامه ميشود با 3 دستور mov هم ميتوان اين كارو انجام داد كه به مراتب سرعت كار بالا تر استاز نظر سادگی که push و pop بهتره چون رجیستر اضافه ای درگیر نمیشه. از نظر حجم کد باز هم push و pop بهتره چون فقط 2 بایت رو اشغال میکنه در صورتی mov از 4 بایت استفاده میکنه. سرعت اجرای دستورات هم وابستگی خیلی زیادی به نوع پردازنده و نحوه اجرای دستور در اون پردازنده داره. این مورد خاص در اغلب سخت افزارها استفاده از دستور mov سریعتر هست (البته نه همیشه، مثلا در پردازنده Pentium 4 تفاوتی نمیکنه و هر دو حالت حدود 20 Clock Cycle زمان میبره) اما از آنجایی که این دو دستور چیزی نیستند که مثلا در یک حلقه استفاده بشند و صرفا استفاده Initialize دارند به اون صورت تفاوتی نمیکنه.


بايد از يك ثبات كمكي استفاده كرد كه فقط و فقط ميتوان از ax استفاده نمود.نه اینطور نیست از هر ثباتی (غیر از ثباتهای سگمنت) میشه استفاده کرد.

ciavosh
یک شنبه 02 شهریور 1393, 17:49 عصر
دستورات پشته حافظه را می خوانند به همین دلیل به مراتب کندتر از mov از رجیستر هستند. درضمن مگه ما swap نداریم؟