ورود

View Full Version : تشخیص ناحیه کد با ناحیه داده



k1.technology
سه شنبه 03 بهمن 1391, 07:33 صبح
با سلام
سی پی یو
از کجا تشخیص میده که این کد مربوط به ناحیه داده ست یا ناحیه برنامه ؟

the king
سه شنبه 03 بهمن 1391, 16:26 عصر
با سلام
سی پی یو
از کجا تشخیص میده که این کد مربوط به ناحیه داده ست یا ناحیه برنامه ؟

CPU نه، در این مورد دخالتی نداره، دقیقا هر کد ماشینی که بهش داده بشه اجرا می کنه.
این تشخیص در اسمبلر انجام شده، از روی مشخصاتی که موقع تعریف سگمنت یا در ASSUME می نویسید.

k1.technology
چهارشنبه 04 بهمن 1391, 09:46 صبح
اینو میتونین بیشتر توضیح بدین
چه جوری تعریف کردن!
منظور از ناحیه داده یا ناحیه کد یعنی اطلاعات در حافظه رم هستند یا نه ؟!

the king
یک شنبه 08 بهمن 1391, 01:17 صبح
اینو میتونین بیشتر توضیح بدین
چه جوری تعریف کردن!
منظور از ناحیه داده یا ناحیه کد یعنی اطلاعات در حافظه رم هستند یا نه ؟!
کلا همه شون در حافظه RAM هستند، حافظه RAM هم از نظر فیزیکی طبقه بندی ای به عنوان سگمنت داده یا کد یا پشته نداره.
این طبقه بندی ها برای راهنمایی اسمبلر ئه، وقتی شما فرضا می نویسید DATA. و بعد اش یک داده رو تعریف می کنید، اسمبلر
متوجه میشه که شما یک سگمنت داده دارید و داده ای که در ادامه می نویسید در اون سگمنت قرار داره.


.DATA
mem16 DW 12345

یا :


DATA SEGMENT
mem16 DW 12345
DATA ENDS


این سگمنت عملا چیزی جز یک آدرس از حافظه نیست، فرقی با نوع آدرسی که برای سگمنت کد بکار رفته نداره،
اما مشخص کردن نوع سگمنت برای اسمبلر مهمه. کد های زبان ماشین که با آدرس Offset در ارتباط اند باید در سگمنت مشخصی
اجرا شوند، فرضا [MOV AX, [1234h وقتی به کد ماشین قابل ترجمه است که بدانیم این Offset ئه [1234h] در کدوم سگمنت قرار داره،
فرق می کنه که در سگمنت کد باشه یا سگمنت داده. اگر سگمنت اشتباهی انتخاب بشه آدرس متفاوتی بوجود میاد :



MOV AX, CS:[1234h]
MOV AX, DS:[1234h]
MOV AX, ES:[1234h]


فرضا وقتی شما می خواهید محتویات آدرسی رو بخونید که داخل سگمنت کد است، اسمبلر می دونه که باید از CS (سگمنت کد)
استفاده کنه.

k1.technology
یک شنبه 08 بهمن 1391, 07:38 صبح
متشکرم
من کتاب زبان ماشینو خوندم اما متوجه نمیشم این سگمنت به طور فیزیکی چطوریه ؟! و کجا هست ؟ کجا قرار میگیره!
یه شکلی کشیده بود که به صورت جدول
اگه ممکنه یه توضیح کوچولو در این خصوص بدین
ممنونم

k1.technology
یک شنبه 08 بهمن 1391, 07:40 صبح
منظورم offset بود
نوشتم سگمنت

the king
یک شنبه 08 بهمن 1391, 15:39 عصر
متشکرم
من کتاب زبان ماشینو خوندم اما متوجه نمیشم این سگمنت به طور فیزیکی چطوریه ؟! و کجا هست ؟ کجا قرار میگیره!
یه شکلی کشیده بود که به صورت جدول
اگه ممکنه یه توضیح کوچولو در این خصوص بدین
ممنونم

در یک پردازنده 16 بیتی مثل 8086 رجیستر هایی که برای دسترسی به حافظه بکار می روند 16 بیتی اند، مثلا SI و DI و BX و ...
اگر آدرس دهی حافظه بر مبنای همین رجیستر های 16 بیتی بود ظرفیت کل حافظه حداکثر می شد 2 به توان 16 بایت باشه،
یعنی 65536 بایت و معادل 64 کیلوبایت.

اما حافظه ای که پردازنده 8086 آدرس دهی می کنه 16 بیتی نیست، 20 بیتی ئه، یعنی ظرفیت حافظه اش 2 به توان 20 بایته، یعنی
1048576 بایت و معادل 1 مگابایت. پردازنده 16 بیتی چطور اینکار رو با رجیستر های 16 بیتی اش می کنه؟ آدرس حافظه 20 بیتی
(از بیت 0 الی بیت 19) رو به دو قسمت تقسیم می کنه که هر دو شان 16 بیتی اند و 12 بیت بین این دو قسمت مشترکه.
به یکی شون Offset می گویند که بیت هایش از 0 الی 15 رو پوشش میده و به اون یکی Segment می گویند که از بیت 4 الی 19
رو پوشش میده و بیت های 4 الی 15 هم در Segement و هم در Offset مشترک اند. در هنگام ترکیب Segement و Offset مقدار
دو جزء با هم جمع می شود و یک آدرس 20 بیتی ایجاد می گردد.

برای آدرس دهی بخش سگمنت مقدار رو در رجیستر های مخصوص اینکار مثل CS و DS و ES و ... قرار می دهند و آفست رو در
رجیستر هایی مثل BX و SI و DI و ...
آدرس حافظه عملا چیزی جز اون 20 بیت نیست و از نظر فیزیکی Segment و Offset ای نداریم. اون سگمنت و آفست رو کنار
هم قرار می دهند (با هم جمع می کنند) تا آدرس 20 بیتی ایجاد بشه. مقدار Offset و Segment هر عددی که باشه یک آدرسی
در اون حافظه 20 بیتی است.

k1.technology
دوشنبه 09 بهمن 1391, 00:19 صبح
مرسی از توضیحاتتون
اما من اینقدر simulation amخوب نیست
اگه ممکنه این مطلبو من با شکل یا یه جای بشه که درکش کنم ، ببینم متوجه میشم
این چیزا مبهمه خیلی

xman_1365_x
پنج شنبه 12 بهمن 1391, 08:06 صبح
سی پی یو
از کجا تشخیص میده که این کد مربوط به ناحیه داده ست یا ناحیه برنامه ؟
در زمان اجرا با کمک ثبات های سگمنت(fs,cs,ds,ss,...) متوجه این موضوع میشه
اما بسته به نوع سیستم عامل این ثبات ها باید قبل یا زمان اجرا مقدار دهی بشه
توی داس خودمون تنظیم میکنیم اول برنامه،در ویندوز ساختار PE مشخص میکنه هر سکشن چه نوعی باشه و هنگام لود شدن لودر با توجه به اطلاعات PE Header و حافظه ای که در اختیار سیستم هست ،ثبات هارو مقدار دهی میکنه،توی ویندوز خیلی چیزا روی آدرس ها تاثیر گذاره مثل ASLR (http://en.wikipedia.org/wiki/Address_space_layout_randomization)
موفق باشی