ورود

نسخه کامل مشاهده نسخه کامل : آموزش Assembly



Blacklord
02-02-2008, 15:32
کاری که میخوام شروع کنم آمورش اسمبلی به صورت کاربردیه. تا جایی که بلد باشم و بتونم از اطلاعات خودم استفاده میکنم. اگر اساتید بزرگوارم کمک کنند و اگر اشتباهی جایی بود به من اطلاع بدند کار خوبی از آب در میاد.
دوستاتی که میخواند کمک کنند خواهشا اگر از منبعی استفاده میکنند اونو ذکر کنند که مشکلی پیش نیاد.
تلاش میکنم هر دو سه روز یه مبحث جدید ارائه کنم، چون خودم مینویسم یه کم وقت گیره.
این مطالب هیچ اجازه ای برای کپی برداری نمیخواد، خوشحالم میشم اگه به درد کسی جای دیگه بخوره، اگرم اسمی از ما ببرند هم که دیگه خیلی حال دادند!!
نکته این که این آموزشو توی فروم ------ هم خودم دارم کار میکنم، ادعایی نباشه بعدا.
در آخر جا داره از استاد خودم آقای "جواد راستی" تشکر کنم که ما هر چی داریم، از ایشون داریم.

Blacklord
02-02-2008, 15:38
نمای کلی:
زبان های برنامه نوبیسی به طور کلی چند دسته اند:
1- زبان ماشین (Machine Language):
این زبان، زبانیه که کامپیوتر مستقیما اونو میفهمه، چیزی نیست به جز یه سری 0 و 1 که پشت سر هم ردیف شدند! هر کامپیوتری بستگی به طراحی cpuی خودش یه زبان ماشین مخصوص خودشو داره. اصطلاحا زبان ماشین وابسته به ماشین (Machine Dependent) هست. مثلا در زبان یک ماشین ممکنه دستور 01011011 به معنی دریافت یک عدد باشه، دستور 10111011 به معنیه جمع دو عدد و دستور 11101000 به معنیه چاپ. پس:

01011011
01011011
10111011
11101000
این برنامه در این ماشین دو عدد میگیره، اونارو با هم جمع میکنه و نتیجه رو چاپ میکنه.
کار با ای زبان خیلی سخته چون وارد کردنش وقت گیره، امکان اشتباه بالاست، ناخواناست یعنی کسی این 0 و 1 ها رو ببینه چیزی نمیفهمه!، و به یاد سپردن دستوراتش تقریبا غیر ممکنه.
2- زبان اسمبلی (Assembly) یا زبان سطح پایین:
برای هر دستور زبان ماشین اگه یه اسم در نظر بگیرید میشه زبان ماشین! مثلا در مثال قبل فرض کنیم توی اسمبلی اون ماشین برای دستور دریافت یک عدد کلمه ی IN در نظر گرفته بشه، کلمه ی ADD برای جمع، و کلمه ی PRINT برای چاپ نتیجه. برنامه ی قبل به صورت زیر در خواهد آمد:


IN
IN
ADD
PRINT
این برنامه خوانا تره، راحت تر میشه واردش کرد یا به خاطر سپرد. ولی همچنان Machine Dependent هست، سخته و البته هنوز ناخواناست.
3-زبان های سطح بالا (High Level Language (HLL:
این زبان ها به زبان انگلیسی نزدیکترند، قابل فهم ترند، ممکنه یه زبان سطح بالا داشته باشیم که مثال قبل در اون به صورت زیر در بیاد:

Get a,b
Print a+b
کسی که برنامه نویسی هم ندونه میتونه بفهمه این برنامه چه کار میکنه!
کار با این برنامه خیلی آسون تره ولی برای برنامه نویس، کامپیوتر برای اینکه این برنامه رو بفهمه احتیاج به یه مترجم داره که این کد رو تبدیل کنه به همون کد ماشین. به این برنامه کامپایلر میگویند.
مهمترین خاصیت HLLها Machine Independent بودن اونها هست. یعنی به ماشین وابسته نیستند، این برنامه روی هر کامپیوتری میتونه اجرا بشه، فقط کامپایلر متناسب با اون ماشینو میخواد، در حالی که کد ماشینی که اول بحث داشتیم فقط روی ماشین فرضی ما جواب میده!

Blacklord
02-02-2008, 15:42
پس ما چرا میخوایم اسمبلی یاد بدیم؟؟ در بحث شرکت کنید. نظرتونو راجع به این سوال بنویسید.

Blacklord
02-02-2008, 15:49
سوتی های املایی یا دستوریو بگید تا ویرایش کنم!
اگر جایی نامفهوم بود بگید تا بیشتر توضیح بدم.

Blacklord
12-02-2008, 14:37
کاربرد اسمبلی:

سوال کرده بودم که چرا اسمبلی ناغافل؟؟
مسلما امروزه اسمبلی کاربردای خاص داره، مثلا کسی نمیاد برنامه ای که با 10 خط میشه در یک HLL نوشت در اسمبلی بنویسه. چون ممکنه مجبور بشه 10 صفحه برنامه بنویسه!
بعضیا شاید بگند برای کرک کردن، یکی از کاربردای خاصش امروزه همینه. بعضی برنامه ها قفل دارند، مثلا Registration میخواند تا به نسخه ی کامل تبدیل بشند. این مرحله ی Registration مسلما یه قطعه برنامه هست. کرکرها در سخت ترین حالت کد ماشین این برنامه رو DisAssemble میکنند، یعنی توسط یک برنامه به نام DisAssembler کدای ماشینو تبدیل به اسمبلی میکنند، بین کدای اسمبلی که به دست میارند اون قطعه ی Regisrtation را پیدا میکنند و اونو حذف میکنند. البته گفتنش خیلی آسونه ولی در عمل کار وحشتناک سختیه. به این روند مهندسی معکوس (Reverse Engineering) میگویند.
کاربرد اساسی اسمبلی امروزه موثرترین پیاده سازی هستش، چرا؟ برنامه ای که در مبحث اول گفتم رو نگاه کنید، کد ماشینش اگه با اسمبلی پیاده سازی بشه همون چهار خط 0 و 1 هستش، یعنی 4 بایت. ولی اون 2 خط آخر که با یه HLL نوشته شده ممکنه 6 تا 8 خط کد ماشین تولید کنه، خط های اضافه بعد از کامپیل برای این تولید میشند که کامپایلر به هر حال نابغه که نیست! برای برنامه ای که شما مینویسید یا کس دیگه ای، کامپایلر جوری طراحی شده که در حالت کلی بازده مناسبی داشته باشه، برای همین بعضی کدای اضافی تولید میکنه که باعث میشه موثرترین پیاده سازی رو نداشته باشیم. در حالت متوسط کد ماشینی که توسط HLL و کامپایلر تولید میشه 1.5 تا 2 برابر کدیه که از اسمبلی تولید میکنه.
اسمبلی به هیچ وجه منسوخ نشده و هنوز در زبان های سطح بالا(HLL) روند سویچ به اسمبلی در نظر گرفته میشود. یعنی برنامه بره جلو، برسه یه جایی ، بپره به اسمبلی، یک سری کار تو اسمبلی انجام بده و دوباره بپره به بدنه ی اصلی برنامه.
کاربرد خیلی مهم دیگه ی او موثرترین استفاده از سخت افزار هستش. شما با 4 خط کد اسمبلی میتونید یه پیکسل مشخص در صفحه رو به رنگی که میخواید در بیارید، در واقع شما میتونید مستقیما با سخت افزارتون حرف بزنید! شما به تک تک اجزای سخت افزارتون دسترسی دارید. مثلا: MOV Cx,2 ، این دستور واقعا مقدار 2 را در یکی از حافظه های CPU قرار میده! همچین کاری رو نمیتونید با یه HLL بکنید.
یاد گرفتن اسمبلی دید واقعی نسبت به کامپیوتر بهتون میده و میتونید کامپیوتر رو درک کنید!
خیلی میکرو کنترلر ها هم اسمبلی مخصوص خودشونو دارند (هر cpu اسمبلی مخصوص خودشو داره.) پس یاد گرفتن اسمبلی کامپیوترای خودتون میتونه کمک کنه که بعدا اسمبلی cpu های دیگه مثلا میکروکنترلر ها رو بهتر بفهمید. البته جالبه که برای بعضی میکروکنترلر ها زبان سطح بالا مثلا C در نظر گرفته شده! خیلی جالبه.

Blacklord
13-02-2008, 00:13
پیشنیازها:
تو این بخش میخوام خیلی سریع چیزایی که برای یاد گرفتن اسمبلی نیاز دارید رو براتون بگم.
اول خیلی سریع مروری بر این میکنیم که کامپیوتر چطوری با داده ها برخورد میکنه؟
کامپیوتر یک سیستم مداری هست. توی این سیستم قطعات زیادی به کار رفته، ولی به طور خلاصه کل سیستم بر مبنای یک سری سویچ کار میکنه. حافظه ها یک سری ترانزیستور مجتمع هستند و ترانزیستورا سویچ الکترونیکی هستن، یا برق رو عبور میدند یا نمیدند. به دلیل همین محدودیت و البته یک سری محاسن دیگه سیستم دودویی (Binary) اساس کار کامپیوتر در نظر گرفته شد. ما با این سیستم تو اسمبلی خیلی کار داریم، پس مجبوریم یه کم توضیحش بدیم.
سیستم اعداد:
سیستمی که ما انسان ها در فعالیت های روزانه ازش استفاده میکنیم، سیستم دهدهی (Decimal) هست. داستان از انگشتان دستتون شروع میشه!! اونایی که در ابتدا شرو به شمارش کردند با کمک دستاشون برای شمردن تا عدد 10 مشکلی نداشتند، ولی برای شمردن 43 ، چهار بار همه ی انگشتها رو میشمردند و به ازای هر دفعه که انگشتاشون تموم میشد یک علامت یه جا میزدند و دوباره از انگشت اول شروع میکردند. این شد پایه سیستمی که تا همین امروز ما ازش استفاده میکنیم. به این سیستم ، سیستم پایه ده (Base 10) هم میگویند.
حالا سیستم یایه دو، فکر کنید کلا دو تا انگشت داشتید!! برای شمردن 3 چه کار میکردید؟
2 تاشو میشمردید، یه علامت میزدید، و یکی دیگه براتون میموند. یکی باقیمانده رو با عدد 1 نشون میدادید، و به جای علامتی که زدید یک دانه 1 میذاشتید بغلش. عددتون نهایتا میشد 11
تبدیل از مبنای 10 به 2:
راه حل کلی برای تبدیلات از مبنای 10 به مبناهای دیگر تقسیمات متوالی هست. با یک مثال یاد بگیرید تا زود ازش رد بشیم!
49 رو میخوام تبدیل کنم به مبنای 2:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
همونطور که میبینید این تقسیمات متوالی بر 2 رو باید تا جایی ادامه بدید که خارج قسمت صفر بشه، عدد نهایی باقیمانده ها از آخر به اول خواهد بود. عدد نهایی اینجا شد 110001
تعریف بیت:
به هر رقم در کل عدد، یک بیت میگویند. یک بیت میتونه صفر یا یک باشه. هر بیت دارای ارزشی هست که این ارزش از راست به چپ زیاد میشه. کم ارزشترین بیت، بیت سمت راست و پر ارزشترین بیت، بیت سمت چپ هست. ارزش اولین بیت از سمت راست 0^2 یعنی 1 هست، دومین بیت 1^2 یعنی 2، سومین بیت 2^2 یعنی 4، همینطور تا انتهای عدد.
در کامپیوتر هر 8 بیت را در یک دسته قرار میدهند و به این عدد 8 بیتی یک بایت میگویند.
تبدیل از مبنای 2 به 10:
روش کلی برای تبدیل به مبنای 10ضربهای متوالی هست، برای این کار مقدار هر بیت رو در ارزشش ضرب میکنیم و نتیجه ها را با هم جمع میکنیم:
مثلا 110001 رو میخوایم به مبنای 10 تبدیل کنیم:
49 = 32 + 16 + 1 = 5^2*1 + 4^2*1 + 3^2*0 + 2^2*0 + 1^2*0 + 0^2*1

مبناهای کمکی:
مبناهای 8 و 16 به دلیل دارا بودن خاصیتی به عنوان مبناهای کمکی استفاده میشوند.
اعداد 0 تا 15 سیستم Decimal , HexaDecimal , Binary رو به خاطر بسپارید، خیلی کارشون داریم:

Decimal , HexaDecimal , Binary
========================
0 , 0 , 0000
1 , 1 , 0001
2 , 2 , 0010
3 , 3 , 0011
4 , 4 , 0100
5 , 5 , 0101
6 , 6 , 0110
7 , 7 , 0111
8 , 8 , 1000
9 , 9 , 1001
10 , A , 1010
11 , B , 1011
12 , C , 1100
13 , D , 1101
14 , E , 1110
15 , F , 1111
خاصیت باحال مبنای 16 یا همون HexaDecimal اینه که هر 4 بیت یک عدد Binary معادل 1 بیت عدد معادل Hex اون هست. 10110101 یه عدد باینری هست. با استفاده از روشهای بالا برای تمرین ابتدا با ضربهای متوالی این عدد رو به مبنای 10 تبدیل کنید ، بعد با استفاده از تقسیمات متوالی به مبنای 16 یا همون Hex (راهنمایی: اگر باقیمانده در تقسیم مثلا 13 شد، رقم D را باید بنویسید.)
ولی بدون این کار من بهتون میگم جواب میشه B5 چون چهاربیت سمت راست معادل 5hex هست و چهاربیت سمت چپ معادل Bhex هست.

Blacklord
13-02-2008, 00:15
باریکلا بچه ها ماشالا چقدر فعالند!!

mohsen_sir
13-02-2008, 00:22
باریکلا بچه ها ماشالا چقدر فعالند!!
دستت درد نكنه
خواهش ميكنم خوب داريم ميخونيم ديگه!!:31:

MAXXX
13-02-2008, 01:59
ممنون منم دارم میخونم
ترم قبل اسمبلی رو پاس کردم
درس بسیار ثقیل ولی شیرینی بود آخر هم 19 گرفتم (راستش سوالا رو از استاد گرفته بودیم:31: )

Blacklord
14-02-2008, 02:07
پردازنده ها:
تو این بخش یه توضیح اجمالی درباره ی کلیت پردازنده(CPU,CentralProcessUnit) ها میدم و بعد پردازنده هایی که باهاشون کار داریم رو معرفی میکنم. این که تموم شد میریم سراغ خود اسمبلی!!

سیستم های مبتنی بر پردازنده ها به طور کلی به این صورت کار میکنند:
داده ها رو از بخش ورودی میگیرند، طبق برنامه ای که به پردازنده داده شده روی داده پردازش رو انجام میدند، اطلاعات که همون داده ی پردازش شده هست رو در خروجی که داخل برنامه مشخص شده قرار میدند.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

پیاده سازی این عمل در واقعیت احتیاج به یک سری ابزار داره که پردازنده ها به اونا تجهیز شدند:
اجزای پردازنده:
1- برای دریافت ورودی یا ارسال خروجی در پردازنده ها بخشی در نظر گرفته شده به نام گذرگاه داده (Data Bus) . پیاده سازیش در واقعیت یک سری پین هست. این پین ها در واقع هر کدوم سر یک سیم هستند که با صفر یا یک بودن این سیم ها اطلاعات با پردازنده رد و بدل میشه. اهمیت این گذرگاه در تاثیرش روی سرعت پردازنده هست. اگه پردازنده ای 8 تا از این پین ها
داشته باشه، در هر سیکل زمان 8بیت اطلاعات رو میتونه پردازش کنه، اصطلاحا میگند پردازنده 8بیتی هستش. این گذرگاه تنها راه ورود و خروج اطلاعات به پردازنده هست. پس CPU یا همون پردازنده از کجا بفهمه که در این لحظه ی خاص داده هارو از کجا بخونه یا کجا بنویسه؟؟
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


2- در جواب این سوال در cpu بخشی در نظر گرفته شده به نام گذرگاه آدرس(Address Bus) که این گذرگاه هم یک سری پین هست که عددی که تولید میکنه آدرس پورتی هست که اطلاعات با اون رد و بدل میشه. مثلا پردازنده ای که 20 پین آدرس داره میتونه 20^2 آدرس تولید کنه.
3- در عکس دو پین دیگه هم هست با نام های RD و WR. میتونید رابطشونو با گذرگاه آدرس پیدا کنید؟؟ اگه نتونید جواب این سوالو پیدا کنید دیگه تاپیک رو ادامه نمیدم!!! یه کم فکر کنید، هر چی به ذهنتون رسید بگید.
راهنمایی این که باس داده دوطرفه هست، یعنی هم میتونه داده بگیره و هم اینکه بده.
4- واحد محاسبه و منطق(ALU,ArithmeticLogicUnit) : انجام عملیات ریاضی مثل جمع، تفریق و .. و عملیات منطقی مثل AND,OR,... توسط این واحد انجام میشه.
5- واحد کنترل (CU,ControlUnit) : کار این بخش کنترل بقیه اجزا است، یکی از مهمترین کارهاش رمزگشایی دستور هست. تو این بخش مراحلی که برای اجرای هر دستور باید انجام بشه ذخیره شده. مثلا در کامپیوتر عمل تفریق توسط عمل جمع انجام میشه. یعنی وقتی برنامه در cpu به دستور SUB میرسه در این واحد یک سری مراحل که عمل جمع هم جزوش هست پیگیری میشه. کی میتونه این مراحلو توضیح بده؟ یکی بده چون من قصد ندارم بدم!!
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

6- ثبات(Register) ها که در واقع حافظه های داخلی cpu هستند و برای کارهای مختلف تو برنامه استفاده میشند.
7- پرچم(Flag) ها که هر کدوم یک بیت هستند که بر اساس صفر یا یک بودن اونا خود cpu یا روند برنامه تصمیم گیری میکند. مثلا پرچمی به نام Zero Flag وجود دارد که نشان میدهد که نتیجه ی آخرین عملیات صفر بوده.

این بخش ها رو تو مبحث بعدی به صورت تخصصی تر روی cpu که میخوام اسمبلی شو بهتون یاد بدم بیشتر توضیح میدم.

خوب، اینم پیشنیازها، تو مبحث بعدی میرسیم به 8086 و بعد از اون میتونیم شروع کنیم به برنامه نویسی!

2 تا سوال کردم، اگه میخواید تاپیک ادامه پیدا کنه جواب بدید، نترسید که جوابتون اشتباه باشه، مهم اینه که فعال باشید وگرنه بعد 2 تا مبحث دیگه ناخودآگاه اوت میشید!!!

Blacklord
14-02-2008, 02:31
سومین عکس براتون لود میشه؟ بعد از واحد کنترل؟

mohsen_sir
15-02-2008, 01:16
آره ضمناً بازم ممنون

mohsen_sir
15-02-2008, 01:24
سوالت خيلي سخته مخصوصا بره ما تازه كارا
ولي فكنم rd يه چيزي بره خوندن , wr يه چيزي بره نوشتن باشه

Blacklord
17-02-2008, 15:09
درسته، rd پردازنده رو در حالت خواندن قرار میده و wr در حالت نوشتن. و سوال دوم، عمل تفریق در پردازنده چطور انجام میشه؟؟

Blacklord
21-02-2008, 23:43
یه تلاشی بکنید! پست نمیدمها!!!!

martin_superhuman
23-02-2008, 19:27
درسته، rd پردازنده رو در حالت خواندن قرار میده و wr در حالت نوشتن. و سوال دوم، عمل تفریق در پردازنده چطور انجام میشه؟؟

از عدد منفی مکمل دو گرفته میشه و با عدد بالایی جمع میشه.این هم به این دلیله که اگه بخوایم از تفریق عادی استفاده کنیم نیاز به یک مدار جداگانه است.این عمل تفریق با استفاده از مکمل با توجه به این که عدد بزرگ بالا باشه یا پایین هم قواعدی داره که زحمت توضیحش هم با شما.:27:

mst_ab
25-02-2008, 16:34
آقا چی شد بقیش!!
خواب موندی عزیز!!

SJDVampire
26-02-2008, 23:12
سلام
راستش من چند وقتیه دنبال اسمبلی هستم ولی چیز خوبی پیدا نکردم ولی با دیدن این تاپیک خیلی خوشحال شدم و خیلی هم دوست دارم یاد بگیرم خیلی خیلی ممنون.:11:
دوست من شما زیاد ناراحت نشو شاید بعضی از دوستان به دلیل بی حوصلگی پست نمیدن ولی مطمئن باش کارات برای خیلی ها ارزشمند و قابل تقدیره:10:
از قدیم گفتن کاری که شروع کردی رو هیچ وقت نیمه کاره نذار.:20:
راستی من یه سوال دارم اگه میشه لطف کنین جواب بدین : راستش من خیلی دوست دارم رو سیستم های موبایل کار کنم ،میشه بگید چجوری باید بفهمم که cpu موایل مورد نظرم چیه و چه نوع اسمبلی لازم دارم؟
یه چیز دیگه :اگه میشه یکم راجع به disassembler هم توضیح بدین.
خیلی ممنونم.:11:

Blacklord
02-03-2008, 19:57
سلام
راستش من چند وقتیه دنبال اسمبلی هستم ولی چیز خوبی پیدا نکردم ولی با دیدن این تاپیک خیلی خوشحال شدم و خیلی هم دوست دارم یاد بگیرم خیلی خیلی ممنون.:11:
...
دوست من شما زیاد ناراحت نشو شاید بعضی از دوستان به دلیل بی حوصلگی پست نمیدن ولی مطمئن باش کارات برای خیلی ها ارزشمند و قابل تقدیره:10:
...
یه چیز دیگه :اگه میشه یکم راجع به disassembler هم توضیح بدین.
خیلی ممنونم.:11:

خواهش میکنم قربان، من کار خاصی نکردم، خوشحال میشم اگه کارم به درد کسی بخوره.
در مورد disassemblers تو صفحه ی اول : کاربرد اسمبلی یه کم توضیح دادم، اگه به دردتون بخوره..
میتونید برید
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید سرچ کنید ببینید چی هست...


آقا چی شد بقیش!!
خواب موندی عزیز!!

نه قربان، بنده بیدارم، منتظر بودم ببینم شما کی بیدار میشید!!!
شرمنده من 24 واحد گرفتم این ترم نمیتونم زود به زود آپدیت کنم.

Blacklord
02-03-2008, 20:13
پردازنده های اینتل:
قبلا گفتم هر cpu اسمبلی مخصوص خودش رو داره. دلیلش هم اینه که وقتی شما اسمبلی مینویسید دارید مستقیما با یک سری امکانات cpu کار میکنید. مثلا در cpu حافظه هایی هست به نام ثبات (Register) ، پس لازمه اطلاعاتی راجع به اون cpu داشته باشید.
کامپیوترای شخصی که ما داریم حتی AMD ، از معماری Intel استفاده میکنند. هر چی جلوتر رفت ، فقط همون چیزی که بود رو گسترش دادند. پردازنده ای که من اسمبلیشو میگم 8086 هستش، تفاوتش با کامپیوتر شما اینه که معماری کامپیوتر شما 32بیتی یا 64بیتی هستش، ولی معماری 8086 ، 16بیتیه. اسمبلی 8086 روی کامپیوتر شما هم جواب میده ، برای استفاده از امکانات جدید پردازندتون اول برنامه باید تعریف کنید که برنامه رو مثلا برای 80386(Pentium) مینویسید تا دستورات مربوطه فعال بشند.

معماری داخلی 8086:


ثبات های 8086:

الف) ثباتهاي همه منظوره:
ثباتهاي همه منظوره DX و CX ، BX و AX ثباتهاي همه منظوره هستند كه براي مقاصد مختلف قابل استفاده هستند . ويژگي منحصر به فرد اين ثبات ها قابليت استفاده از آنها به صورت 8 بيتي و 16 بيتي است . مثلاً ثبات 16 بيتي AX شامل يك بخش AH ( هشت بيت بالایی ) و يك بخش AL ( هشت بيت پایینی ) است كه مي توان به هر بخش با نام آن مراجعه كرد.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

در زير با اين ثباتها به صورت مختصر آشنا مي شويم:

ثبات AX یا Accumulator :
ثبات انباره اصلي است و در دستورالعملهاي ورودي /خروجي و محاسباتي مورد استفاده قرار مي گيرد.

ثبات BX یا Base :
اين ثبات به عنوان يك انديس براي توسعه آدرس دهي و مراجعات جدولي به حافظه به كار مي رود. كاربرد ديگر آن در انجام محاسبات است.

ثبات CX یا Counter :
از اين ثبات معمولاً براي شمارش دفعات تكرار يك حلقه و نيز در محاسبات استفاده مي شود.

ثبات DX یا Data :
از اين ثبات در عمليات ورودي /خروجي به عنوان آدرس پورت و نيز در عملياتهاي ضرب و تقسيم با اعداد بزرگ استفاده مي شود.

ب) ثبات پرچم:
در هر پردازنده يك ثبات به نام پرچم وجود دارد كه بيتهاي آن ، وضعيت پردازنده بعد از انجام يك عمل را نشان مي دهند. بيتهاي ثبات پرچم 16 بیتی 8086 را در زیر میبینید:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
بيتهاي خالي در 8086 تعريف نشده اند. در زير شرح مختصر بيتهاي تعريف شده را مي بينيد.

بیت C یا Carry:
بيت رقم نقلي است . چنانچه يك عمل محاسباتي ، توليد رقم نقلي كند (مثلاً جمع دو عدد بدون علامت كه توليد سرريز كند ) اين بيت يك مي شود . به علاوه اين بيت حاوي رقم نقلي در عمليات منطقي شيفت نيز مي باشد.

بیت D یا Direction :
بيت جهت است و توسط برنامه نويس براي كنترل جهت اعمال رشته اي مانند مقايسه يا انتقال رشته مقداردهي مي شود.

بیت P یا Parity :
بيت توازن است و براي كنترل صحت اطلاعات 8 بيت پاييني نتيجه يك عمل از طريق توازن فرد به كار مي رود.

بیت A یا Auxiliary Carry :
بيت رقم نقلي كمكي است و چنانچه در محاسبات 8 بيتي رقم نقلي در بيت سوم ايجاد شود، برابر يك مي شود. از اين بيت در اعمال رياضي BCD استفاده مي شود.

بیت Z یا Zero :
بيت نشانگر نتيجه صفر است . چنانچه نتيجه يك عمل محاسباتي يا منطقي صفر باشد، اين بيت برابر يك مي شود.

بیت S یا Sign :
بيت علامت و منعكس كننده بيت علامت نتيجه آخرين عمل پردازنده است و از آن معمولاً براي تعيين علامت نتيجه استفاده مي شود.

بیت T یا Trap :
بيت اجراي قدم به قدم است . چنانچه اين بيت توسط برنامه نويس يك شده باشد، پردازنده بعد از اجراي هر دستور دچار وقفه خاصي مي شود كه نتيجه آ ن اجراي قطعه برنامه خاصي است كه توسط برنامه نويس در مكان خاصي از حافظه نوشته شده و شامل دستوراتي براي نمايش محتويات ثباتهاي داخلي و حافظه است.پس از استفاده كاربر از نتيج ه اي ن كار، با صدور فرماني اجراي برنامه ادامه مي يابد. از اين بيت براي اشكال زدايي برنامه ها به كار مي رود.
بیت I یا Interrupt :
بيت وقفه است و چنانچه توسط برنامه نويس صفر شده باشد، پردازنده به وقفه ها پاسخ نمي دهد.

بیت O یا Overflow :
بيت سرريز است و در صورت ايجاد سرريز در اعمال محاسباتي علامتدار، يك مي شود.

ج) ثباتهاي آدرس دهي:
مجموع ثباتهاي سگمنت (SS, DS, CS و ES ) و ثباتهاي اشاره گر (IP, SP, BP) و ثباتهاي انديس (SI و DI) كه همگي 16 بيتي هستند، براي آدرس دهي حافظه به كار مي روند.



پيش از مرور عملكرد آنها، نحوه مراجعه به حافظه در پردازنده 8086 را بررسي مي كنيم.

سگمنتهاي حافظه:
هر برنامه چند بخش داره که در حافظه ذخیره میشه. براي مر اجعه به حافظه در 8086 (و پردازنده هاي بعدي اينتل)، حافظه به صورت قطعه هايي در نظر گر فته مي شود كه سگمنت ناميده مي شوند . اندازه يك سگمنت حافظه حداكثر 64 كيلوبايت است.

چهار نوع سگمنت حافظه وجود دارد كه آنها را در ذيل بررسي مي كنيم:

سگمنت كد (Code Segment):
دستورالعملهاي زبان ماشين كه بايد توسط پردازنده اجرا شوند در ناحيه اي از حافظه به نام سگمنت كد ذخيره مي شوند؛ يعني اولين دستور اجرايي در ابتداي اين سگمنت قرار مي گيرد . اگر كد برنامه بيش از 64 كيلوبايت باشد، بايد چند سگمنت كد در حافظه تعريف شود.

سگمنت داده (Data Segment):
داده هاي مورد نياز برنامه در اين سگمنت قرار مي گيرند. يك برنامه مي تواند چند سگمنت داده داشته باشد.

سگمنت پشته (Stack Segment):
اطلاعاتي كه بايد پيش از فراخواني زيربرنام ه ه ا در حافظه ذخيره شود تا بعد از بازگشت به برنامه اصلي بازيابي شود، در اين سگمنت ذخيره مي شود.

سگمنت اضافي (Extra Segment):
اين سگمنت در اعمال رشته اي مورد استفاده قرار مي گيرد.

ثباتهاي سگمنت:
براي مراجعه به محتويات يك سگمنت بايد آدرس آغاز آن سگمنت را بدانيم . ثباتهاي 16 بيتي سگمنت براي همين منظور به كار مي روند:
ثبات CS آدرس ابتداي سگمنت كد، ثبات DS آدرس ابتداي سگمنت داده، ثبات SS آدرس ابتداي سگمنت پشته و ثبات ES آدرس ابتداي سگمنت اضافي را در خود نگه مي دارند.
توجه به يك نكته ضروري است:
چون گذرگاه آدرس 8086، 20 بيتي است، قاعدتاً بايد آدرس آغاز سگمنت ها كه مكانهايي در حافظه هستند نيز 20 بيتي باشد؛ پس چگونه آدرس آغاز يك سگمنت كه 20 بيتي است در ثبات 16 بيتي سگمنت ذخيره مي شود ؟!
آدرس آغاز يك سگمنت در حافظه كه آدرسي 20 بيتي است، بايد هميشه آدرسي بخشپذير بر 16 باشد؛ مثل ، 2A320H ، F23E0H ، 00000H یا ... به همين دليل هميشه 4 بيت پاييني آدرس آغاز سگمنت صفر است و نيازي به ذخيره ندارد . مثلاً وقتي گفته مي شود آدرس آغاز سگمنت كد كه در CS ذخيره مي شود، 2B3FH است، در واقع منظور آدرس 20 بيتي 2B3F0H است. بنابراين براي دستيابي به آدرس واقعي سگمنت، بايد آن را 4 بيت به سمت چپ شيفت دهیم.

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

ثباتهاي اشاره گر و انديس:

ثباتهاي 16 بيتي اشاره گر و انديس حاوي فاصله دستورات و داد ه ها از مبدأ سگمنت هستند كه اصطلاحاً آفست ناميده مي شود. منظور از آفست، فاصله آدرس داده يا دستورالعمل از ابتداي سگمنت آن است.

پرسش) با توجه به 16 بيتي بودن ثباتهاي آفست، نشان دهيد كه حداكثر اندازه يك سگمنت 64 كيلوبايت است.

Blacklord
04-03-2008, 19:39
سلام
راستش من چند وقتیه دنبال اسمبلی هستم ولی چیز خوبی پیدا نکردم ولی با دیدن این تاپیک خیلی خوشحال شدم و خیلی هم دوست دارم یاد بگیرم خیلی خیلی ممنون.:11:
دوست من شما زیاد ناراحت نشو شاید بعضی از دوستان به دلیل بی حوصلگی پست نمیدن ولی مطمئن باش کارات برای خیلی ها ارزشمند و قابل تقدیره:10:
از قدیم گفتن کاری که شروع کردی رو هیچ وقت نیمه کاره نذار.:20:
راستی من یه سوال دارم اگه میشه لطف کنین جواب بدین : راستش من خیلی دوست دارم رو سیستم های موبایل کار کنم ،میشه بگید چجوری باید بفهمم که cpu موایل مورد نظرم چیه و چه نوع اسمبلی لازم دارم؟
یه چیز دیگه :اگه میشه یکم راجع به disassembler هم توضیح بدین.
خیلی ممنونم.:11:

راستی سوالتون راجع به cpu موبایل، میتونی مدل گوشیهای مورد نظرتو همراه با کلمه ی embedded processors روی گوگل سرچ بکنی، ولی اصولا برنامه نویسی موبایل برای سیمبین با ++C هستش و برای بقیه جاوا، مد اسمبلی ندیدم من...

elyass
08-03-2008, 01:40
اين بخشو تا حالا نديده بودم. دروغ چرا يه مدت نبودم . ادامه بديد. منم اگه كاري ازم برومد انجام ميدم.
ممنون
:10:

Blacklord
27-03-2008, 02:51
ساختار یک برنامه ی اسمبلی:
در این بخش اول واحدهای حافظه رو بررسی میکنیم، بعدش بخش های یه برنامه ی اسمبلی رو.

واحد های حافظه:
انواع متغیر در برنامه نویسی اسمبلی؟ یعنی اسمبلی مثل زبان های سطح بالا انواعی مثل integer, boolean ,float و امثال اینا رو داره؟ نه!!!!!! این سوسول بازیا مال همون زبانای سطح بالاست!! تو اسمبلی شما یه سری حافظه داری که میتونی ازشون استفاده کنی. دو حالت داره، یا از حافظه های خود cpu استفاده میکنی که بهشون ثبات یا Register گفته میشه، یا از RAM استفاده میکنی.

استفاده از ثبات ها:
استفاده از ثبات ها خیلی آسونه، هر ثبات یه اسمی داره مثلا Ax و در 8086 ثبات ها 16 بیتی هستند، یعنی هر ثبات 16 تا خونه داره (زشته که بگیم خونه، از این به بعد میگم بیت!!) که توی اونا صفر یا یک ذخیره شده، شما حتی میتونید از هر نصفه ی یک ثبات جداگانه استفاده کنید، به این صورت که برای هر نصفه از یک ثبات اسم جدایی در نظر گرفته شده. مثلا ثبات Ax دو قسمت داره، 8 بیت سمت راست یا کم ارزش که با اسم Al مشخص میشه و 8 بیت سمت چپ یا پر ارزش که Ah نام داره. در مبحث قبل عکسش هست. شما به عنوان برنامه نویس میتونید با هر کدوم از اینا کار کنید. مثلا بنویسید MOV Ax,240 این دستور عدد 240 رو میذاره توی Ax یعنی محتوای Ax به این شکل میشه:

0000000011110000
پس 16 بیت به این صورت با صفر و یک پر میشه. میتونید بنویسید MOV Ah,12 در این صورت 8 بیت پرارزش تر 00001100 خواهد شد و 8 بیت کم ارزش مقداری که قبلا توش بوده رو حفظ میکنه.

استفاده از RAM:
برای استفاده از RAM باید برای یک قسمت از اون اسم انتخاب کنی و با اون اسم اون قسمت رو فراخوانی کنی. پس شما یه متغیر مثلا x رو تعریف میکنی و بعد ظرفیتش رو مشخص میکنی.
انواع ظرفیت ها:
بایت ( Byte ): داده ای به طول 8 بیت
کلمه ( Word ): داده ای به طول 16 بیت
کلمه ی مضاعف ( Double Word ): داده ای به طول 32 بیت
کلمه ی چهارگانه ( Quad Word ): داده ای به طول 64 بیت
پاراگراف ( Paragraph ): داده ای به طول 128 بیت

به عنوان مثال با نوشتن دستور زیر متغیر x به طول 8 بیت با مقدار اولیه 12 تعریف میشه:

x DB 12
قسمت اول اسم متغیر هستش که نوشته شده x ، قسمت دوم ظرفیت رو مشخص میکنه، DB مخفف Defined Byte هستش یعنی متغیر ما 8 بیت ظرفیتش هست. قسمت آخر هم یک مقدار اولیه به متغیر انتساب میده، در اینجا ما 12 رو انتساب دادیم. میتونستیم بنویسم:

? x DB
این دقبقا همون قبلیه ولی مقدار اولیه انتساب نمیده. ? یعنی مقدار اولیه نامشخص.

بخش های یک برنامه ی اسمبلی:
هر برنامه ی اسمبلی اقلا 3 تا بخش یا Segment داره،

بخش اول: بخش پشته ( Stack Segment ) :
در این بخش برنامه نویس مشخص میکنه که ظرفیت پشته چقدر باشه.

مهم: یه نفر راجع به این که پشته چی هست توضیح بده.

بخش دوم: بخش داده ( Data Segment ):
در این بخش متغیر ها تعریف میشوند. مثلا دستور x DB 12 رو باید تو این بخش بنویسید.

بخش سوم: بخش کد ( Code Segment ):
کدها یا همون دستورات برنامتون رو باید تو ای بخش بنویسید.

با یک مثال برنامه نویسی به زبان اسمبلی رو شروع میکنیم!


STKSG SEGMENT PARA STACK 'STACK'
DW 100 DUP(?)
STKSG ENDS

DATASG SEGMENT PARA PRIVATE 'DATA'
X DW 15
Y DW 25
Z DW ?
DATASG ENDS

CODESG SEGMENT PARA PRIVATE 'CODE'

MAIN PROC FAR
ASSUME DS:DATASG, CS:CODESG, SS:STKSG

MOV AX, DATASG ;Move the start address
MOV DS, AX ;of data segment to DS

MOV AX, X
ADD AX, Y
MOV Z, AX

MOV AX, 4C00H ;Terminate program
INT 21H
MAIN ENDP

CODESG ENDS

END MAIN

یه کم روی این برنامه فکر کنید، بگید این برنامه چه کار میکنه. اولین کسی که گفت جایزه داره! تو مبحث بعد خط به خط این برنامه رو توضیح خواهم داد.

Blacklord
27-03-2008, 02:58
هر جا ابهامی هست بگید تا توضیح بدم.

Blacklord
27-03-2008, 03:01
در ضمن آقایون من یه مدت نبودم، شرمنده. اگر چند نفر پیدا بشن کمک کنند منو در ادامه ی تاپیک خیلی عالی میشه!! من به شدت سرم شلوغ شده نمیرسم زود به زود آپدیت کنم.

symk
29-03-2008, 12:58
آقا جان دستت درد نکنه . همین طوری ادامه بده .

Ar@m
29-03-2008, 23:42
منم اسمبلی رو تازه شروع کردم بعدشم ولش کردم چون اصلا نمی تونستم با asm یا tasm برنامه ها رو اجرا کنم الان یادم نمی یاد چرا
ولی این برنامه هه توی پست 23 به x مقدار 15 می ده به y مقدار 25 بعد هم جمعشون رو می ریزه توی z
مثل اینکه خیلی یادم رفته چون نمی فهمم شما چرا توی SS صد تا علامت سوال گذاشتی یا آخرش با این 100 تا ؟ چیکار کردی
مرسی برای آموزش منم این تاپیک رو تازه دیدم

Blacklord
31-03-2008, 11:56
جوابتون درسته، اگه یه نفر بتونه بگه اصولا پشته چیه معلوم میشه که 100 تا ؟ برای چیه، 2 روز وقت میدم!!!

Ar@m
01-04-2008, 17:43
پشته فضاییه برای ذخیره موقت داده ها برای افزایش سرعت دسترسی برنامه به اونا
Ss هم آدرس شروع پشته است
پس با این حساب با Dw 100 Dup(?) شما فضایی به اندازه 100 کلمه یعنی 1600 بیت تعریف کردین
اون علامت سواله معنیش این نیست که 100 تا ؟ گذاشتیم یعنی فضا تعریف نشده است و خالیه
اگه زیاد غلط گفتم برای این بودش که هیچ جا پیدا نکردم این خط یعنی چی!!!

من درباره Para توی کتاب خوندم اما نفهمیدم یعنی چی می شه شما توضیح بدی؟

Blacklord
13-05-2008, 12:48
به علت وحشتناک شدن وضعیت تحصیلی تا آخر این ترم آپدیت نمیکنم!!!

saeed410
13-05-2008, 17:37
سلام دوست عزيز منم اومدم توي بحثتون شركت كنم ، يك سوال دارم ، اگه بخاي توي اسمبلي بدون استفاده از وقفه هاي داس و فقط با استفاده از وقفه هاي بايوس ،‌اطلااعات سيستم رو چاپ كني بايد از چه تابعي استفاده كني؟، منظورم از اطلاعات سيستم همون تابع Post توي CMOS كه وقتي سيستم بالا مياد اطلاعات سيستم رو توي يك جدول چاپ مي كنه!!!؟

Blacklord
16-05-2008, 21:15
دقیقا معماری های بالاتر از 8086 رو نمیدونم، ولی اگه تونستی توابع و شماره سرویساشو پیدا کنی حتما باید نوع پردازنده رو اول برنامه ذکر کنی، مثلا با 386.