PDA

View Full Version : سوال درباره Instruction Pointer



hilablog
پنج شنبه 03 آبان 1386, 21:24 عصر
با سلام...
من تازه دام با اسمبلی آشنا میشم و سوالی دارم که اگر کسی جوابم رو بده ممنون میشم.

چرا وقتی دستوری در حال اجراست، همیشه IP دستور بعد رو نگه میداره؟! دلیلش چیه؟

اگر کسی جواب بده ممنون میشم!

ermia2008
یک شنبه 27 آبان 1386, 15:54 عصر
سلام دوست عزیز.
چون ما همیشه به آدرس دستور بعد نیاز داریم. چون آدرس مکان فعلی رو که داریم و چون در بازگشت از توابع باید از خط بعد از مکانی که تابع صدا زده شده باید دستورات اجرا شوند.

mountainking
سه شنبه 29 آبان 1386, 15:14 عصر
خوب تو پیشنهادت چیه.
به نظر من این یه روش ساده و معقول که IP آدرس دستور بعد رو داشته باشه. به این ترتیب ما موقع نوشتن برنامه، میدونیم ترتیب دستورا چی باشه، و cpu هم میدونه که ما میخوایم دستورا به چه ترتیبی اجرا بشن. البته یه چیزی رو بگم اگه اشتباه نکنم وقتی دستورت jump یا call و یا ret باشه دستوری که قرار اجرا بشه دستوری نیست که تو رم بعد از دستور فعلی قرار میگیره، دستور بعدی بر اساس آدرسی که jump یا call جاری ویا call قبلی(در مورد ret) مشخص میکنن مشخص میشه. البته این رو بگم که میتونی cpu رو طوری تنظیم کنی که backward دستورا رو اجرا کنه.

vorody86
پنج شنبه 11 بهمن 1386, 01:50 صبح
در ابتدای اجرای هر دستوری مابایددستور را ازحافظه برداشته و به cpu بیاوریم تا ان را اجرا کند پس باید ادرس ان دستور را داشته باشیم و وقتی که دستور فعلی در حال اجراست مسلما ما نیازی به ادرس این دستور نداریم زیرا ما با با استفاده از اذرس دستور ان را اورده ایم والان در حال اجراست وبنا بر اینکه دستورات به صورت ترتیبی اجرا می شوندوبعد از این دستور دستور بعدی انجام میشودبهتر است که ادزس دستور بعدی را ذاشته باشیم تابتوانیم پس از اجرای دستور فعلی دستور بعدی را اورده و ان را اجراکنیم البته این کار را سخت افزار انجام میدهدو در هنگام دستورات callوretهم بسیار مهم است و وقتی ما به جایی پرش میکنیم به طور نرم افزاری IP را عوض میکنیم به شما توصیه میکنم فصل 5 کتاب معماری کامپیوتر نویسنده موریس مانو مترجم سپیدنام را بخوانید تا نحوه اجرای دستورات را در cpu مشاهده کنید :اشتباه:

vorody86
پنج شنبه 11 بهمن 1386, 01:51 صبح
در ابتدای اجرای هر دستوری مابایددستور را ازحافظه برداشته و به cpu بیاوریم تا ان را اجرا کند پس باید ادرس ان دستور را داشته باشیم و وقتی که دستور فعلی در حال اجراست مسلما ما نیازی به ادرس این دستور نداریم زیرا ما با با استفاده از اذرس دستور ان را اورده ایم والان در حال اجراست وبنا بر اینکه دستورات به صورت ترتیبی اجرا می شوندوبعد از این دستور دستور بعدی انجام میشودبهتر است که ادزس دستور بعدی را ذاشته باشیم تابتوانیم پس از اجرای دستور فعلی دستور بعدی را اورده و ان را اجراکنیم البته این کار را سخت افزار انجام میدهدو در هنگام دستورات callوretهم بسیار مهم است و وقتی ما به جایی پرش میکنیم به طور نرم افزاری IP را عوض میکنیم به شما توصیه میکنم فصل 5 کتاب معماری کامپیوتر نویسنده موریس مانو مترجم سپیدنام را بخوانید تا نحوه اجرای دستورات را در cpu مشاهده کنید :اشتباه:

Blacklord
جمعه 12 بهمن 1386, 11:04 صبح
خوب تو پیشنهادت چیه.
به نظر من این یه روش ساده و معقول که IP آدرس دستور بعد رو داشته باشه. به این ترتیب ما موقع نوشتن برنامه، میدونیم ترتیب دستورا چی باشه، و cpu هم میدونه که ما میخوایم دستورا به چه ترتیبی اجرا بشن. البته یه چیزی رو بگم اگه اشتباه نکنم وقتی دستورت jump یا call و یا ret باشه دستوری که قرار اجرا بشه دستوری نیست که تو رم بعد از دستور فعلی قرار میگیره، دستور بعدی بر اساس آدرسی که jump یا call جاری ویا call قبلی(در مورد ret) مشخص میکنن مشخص میشه. البته این رو بگم که میتونی cpu رو طوری تنظیم کنی که backward دستورا رو اجرا کنه.
ایشون درست میگن، دقیقترش اینه:
وقتی که یه زیر برنامه (Procedure) از نوع Near رو Call میکنی IP به داخل پشته یا همون Stack ، Push میشه، میره سراغ دستورات زیر برنامه (IP میشه آدرس دستورات زیر برنامه) و وقتی به RET رسید یک بایت از سر پشته میخونه و در IP قرار میده که میشه همون چایی که باید از زیر برنامه برگرده. برای Procedure از نوع FAR غیر از IP ، آدرس سگمنت کد هم در پشته Push میشه و وقتی به RETF میرسه 4 بایت از سر پشته بر میداره. برای JMP هم IP برابر جیی میشه که Lable جلوی JMP گفته.