ورود

View Full Version : سوال: چرا ثبات SP دوتا دوتا جلو می رود ؟



alireza378
شنبه 17 مرداد 1394, 17:15 عصر
سلام.

من دارم با emu8086 روی اسمبلی کار میکنم. این کد رو نوشته ام از روی کتاب آقای سیدرضی:



MOV AX,04E7H
MOV BX,351AH
PUSH AX
PUSH BX
POP BX
POP AX


این کد مقادیر 04E7 رو وارد AX میکنه و مقدار 351A رو وارد BX میکنه. بعد هم که وارد پشته میکنه.

خب من میخوام توی emu8086 این رو قشنگ ببینم که بفهمم.
روند کار فکر میکنم اینطوری باشه:
فرض کنیم SP در ابتدا برابر FFFE باشه:
اول مقدار 04 یعنی بایت باارزش وارد آدرس بالاتر میشه ، یعنی SP برابر میشه با FFFD
بعد مقدار E7 یعنی بایت کم ارزش وارد آدرس پایین تر میشه ، یعنی SP برابر میشه با FFFC

حالا این عکس رو ببینید:
134031

دور اون 2 قسمت که خط قرمز کشیدم رو ببینید. آدرس اولی یعنی پایین پشته FFFE هست و آدرس بعدیش ، FFFC یعنی آدرس FFFD وچود نداره! و تازه توی Stack به صورت 2 کلمه ای یعنی 4 بایتی ذخیره شده!!

میشه بگید چرا اینطوریه!؟ و چچوری باید درستش کنم که به صورت 2 بایتی بهم نمایش بده !؟ ممنون

reza_noei
شنبه 17 مرداد 1394, 18:37 عصر
سلام
الان اشکالی نداره. شما مقدار 0x04E7 را وارد پشته میکنید که 2 بایت فضا اشغال میکنه یعنی اگه الان SP به 0xFFFE اشاره کنه برای ذخیره این عدد باید 2 بایت رشد معکوس داشته باشه پس 0xFFFE - 2 برابر با 0xFFFC خواهد بود. دقت کنید که هر رقم در مبنای 16 برابر با 4 بیت است پس هر دو عدد در این مبنا 8 بیت یا یک بایت خواهد شد. همانطور که میدانید نحوه ذخیره سازی مقدار عددی در 8086 به صورت Little Endian میباشد یعنی بایت کوچکتر در آدرس جاری و بایت بزرگتر در آدرس بعدی ذخیره میشود پس 0xE7 در آدرس 0xFFFD ذخیره خواهد شد و 0x04 در آدرس بعدی که در پشته (بدلیل رشد به سمت پائین) آدرس 0xFFFC خواهد بود ذخیره میشود.

alireza378
شنبه 17 مرداد 1394, 23:49 عصر
سلام
الان اشکالی نداره. شما مقدار 0x04E7 را وارد پشته میکنید که 2 بایت فضا اشغال میکنه یعنی اگه الان SP به 0xFFFE اشاره کنه برای ذخیره این عدد باید 2 بایت رشد معکوس داشته باشه پس 0xFFFE - 2 برابر با 0xFFFC خواهد بود. دقت کنید که هر رقم در مبنای 16 برابر با 4 بیت است پس هر دو عدد در این مبنا 8 بیت یا یک بایت خواهد شد. همانطور که میدانید نحوه ذخیره سازی مقدار عددی در 8086 به صورت Little Endian میباشد یعنی بایت کوچکتر در آدرس جاری و بایت بزرگتر در آدرس بعدی ذخیره میشود پس 0xE7 در آدرس 0xFFFD ذخیره خواهد شد و 0x04 در آدرس بعدی که در پشته (بدلیل رشد به سمت پائین) آدرس 0xFFFC خواهد بود ذخیره میشود.

نه بحث این نیست!

این عکس کتاب سیدرضی هست (http://barnamenevis.org/attachment.php?attachmentid=134044&d=1439063165)

به این صورت اطلاعات رو ذخیره کرده. یعنی هر 2 رقم HEX داخل یک خونه. اما توی emu8086 اومده 4 رقم رو داخل 2 خونه ی پشت سر هم ذخیره کرده و نمایش داده!

من میخوام emu8086 رو یک کاری کنم که مثل کتاب سیدرضی بهم نشون بده stack رو. میشه آیا !؟

reza_noei
یک شنبه 18 مرداد 1394, 02:38 صبح
تصویر کتاب را بارگزاری نمیشود.

فکر میکنم منظور شما این است که چرا پشته را به صورت خانه خانه نمایش نمیدهد و دو بایت دو بایت نمایش میدهد. اگر اینطور باشد در کتاب هم آمده است که واحد کار پشته کلمه (دو بایت) است یعنی اگر شما push 0x20 را هم انجام دهید SP دو خانه به عقب میرود و به 0xFFFC اشاره میکند پس عدد به شکل 0x0020 ذخیره میشود.

از نظر مفهوم هر دو یک کار را انجام میدهند ولی در تفاوت در ظاهر طبیعیه.

اگه علاقه دارید به شکل دیگری نحوه ذخیره را ببینید از منو view گزینه memory را انتخاب کنید آدرس حافظه به صورت 0000:0000 نشان داده میشود عدد سمت چپ را برابر با مقدار SS تنظیم کنید فکر میکنم 0700 پیشفرض emulator باشه و بعد آفست (عدد سمت راست) را FFF0 قرار دهید تا خانه هایی را که از آفست FFF0 تا FFFF ادامه دارند را به صورت بایت بایت نمایش دهند.