آموزش Assembly-قسمت اول

1396/3/26 آقای قادری 6238

سلام دوستان قادری هستم با آموزش اسمبلی در خدممتون هستم.
خب بریم سراغ درسمون
اولش با هم یه نگاهی به سرفصل ها میندازیم بعد وارد درس میشم.
سرفصل دروس دوره Assembly

1- مقدمه
2- آماده سازی محیط برای اسمبلی
3- اصول نحوی در اسمبلی
4- بخش بندی حافظه - Memory Segment
5- ثبات ها - Registers
6- فراخوان های سیستمی - System Calls
7- حالت های آدرس دهی - Addressing Modes
8- متغیرها - Variables
9- ثابت ها - Constants
10- دستور العمل های محاسباتی - Arithmetic Instructions
11- دستور العمل های منطقی - Logic Instructions
12- دستور العمل های شرطی - Conditions
13- حلقه ها - Loops
14- اعداد در اسمبلی - Numbers
15- رشته ها - Strings
16- آرایه ها - Arrays
17- رویه ها - Procedures
18- بازگشتی - Recursion
19- ماکرو ها - Macros
20- مدیریت فایل - File Management
21- مدیریت حافظه - Memory Management
22- بعد از این دوره چی کار کنم؟
خب هر فصل و مبحث رو سعی میکنیم تو یه جلسه با هم پیش بریم.
این جلسه رو با مقدمه شروع میکنیم .
این جلسه برای دوستانی که زبان های دیگه ای بلدن و یا رشته شون مرتبط با کامپیوتر هس ممکن هس کسل کننده باشه. ولی چون ما عموم رو در نظر میگیریم
لازم هست این مطالب رو بگیم
دوره ی آموزشی زبان اسمبلی:

زبان اسمبلی یک زبان سطح پایین ( Low – level ) برای کامپیوتر ها یا دیگر دستگاه های قابل برنامه ریزی خاص به یک کامپیوتری با معماری خاص هست که در مقابل اکثر زبان های برنامه نویسی سطح بالا قرار میگیره ، که به طور معمول در سیستم ها قابلیت حمل و انتقال رو دارن . زبان اسمبلی به وسیله ابزار هایی که به عنوان اسمبلر از اونها یاد میشه( مثل NASM ، MASM و غیره ) کد قابل اجرای بر روی ماشین را میتونه تولید کنه.
مخاطبان این دوره:

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

نیازی به دانش و اظلاعات تخصصی خاصی برای زبان اسمبلی نیست. ولی اگه دانش پایه ای از برنامه نویسی کامپیوتر و زبان های برنامه نویسی داشته باشین . میتونین مفاهیم رو راحتتر و سریع تر درک کنین و خودتونو برای مراحل پیشرفته تر آماده کنین.
خب حالا که فهمیدیم کجای کاریم بریم سراغ کار و درس اصلی مون یعنی یادگیری اسمبلی.
زبان اسمبلی چیست؟

خب همونطور که میدونیم هر کامپیوتر یک ریزپردازنده ( Microprocessor ) داره که میتونه بخش محاسبات ، منطق رو مدیریت و فعالیت های اون رو کنترل کنه.درسته؟
همونطور که میدونیم یک پردازنده فقط "دستورالعمل های زبان ماشین" رو متوچه میشه که رشته ای از صفر و یک هاست. چون که زبان ماشین خیلی مبهم و پیچیده برای توسعه نرم افزار هست. به همین خاطر زبان سطح پایین اسمبلی برای خانواده ی ریزپردازنده ها طراحی شد که بتونه طیف وسیعی از دستور العمل ها رو در کد های سمبلیک و نمادین و قابل فهم تر برای برنامه نویس به نمایش بزاره.
خب تا اینجا فهمیدیم که اسمبلی چی هست و برای چه کاری طراحی شده . حالا بریم سراغ مزایای اسمبلی ( من معایبش رو نمی گم ولی تو کار کردن با زبان خودتون به مرور متوجه میشین
مزایای زبان اسمبلی :
1. چجوری برنامه ها با OS ، پردازنده و BIOS ارتباط برقرار میکنن.
2. چجوری داده ها در حافظه و دیگر دستگاه های خارجی ( منظور خارج از ریزپردازنده اس) نشان داده می شوند.
3. چگونه پردازنده به برنامه دسترسی پیدا میکنه و اون رو اجرا می کنه
4. چگونه دستور العمل ها به داده دسترسی پیدا میکنن و اون رو پردازش میکنن
5. اینکه چطوری یک برنامه به دستگاه های خارجی دسترسی پیدا میکنه
و مزایا ی دیگری مثل :

1. به حافظه و زمان اجرای کمتری نصبت به بقیه زبان ها نیاز است
2. اجازه میده که کارهای پیچیده ی مخصوص سخت افزار به روش آسان تری انجام شود
3. برای کارهایی با زمان های بحرانی بسیار مناسب است. ( جلوتر متوجه میشین )
4. برای نوشتن روالهای سرویس وقفه ( interrupt ) و دیگر برنامه های مقیم در حافظه بسیار مناسب است.
ویژگی های عمومی سخت افزار کامپیوتر :
همونطور که هممون میدونیم قسمت اصلی داخلی یک سخت افزار کامپیوتر از پردازنده ، حافظه و ثبات ها تشکیل شده. ثبات ها ( Registers ) یکی از اجزای پردازنده هستن که آدرس ها و داده ها رو نگهداری میکنن. برای اجرای یک برنامه ، سیستم اونهارو از یک دستگاه خارجی به حافظه داخلی کپی میکنه و بعد از این کار پردازنده دستور العمل های برنامه رو اجرا میکنه.
واحد پایه ای ذخیره سازی در کامپیوتر بیت ( bit ) هست. که میتونه در اصطلاح روشن (یک) یا خاموش(صفر) باشه. یک گروه 9 تایی از این بیت ها یک بایت رو میسازنن. ( عه چی شد ما که خونده بودیم هر 8 بیت یه بیات هست !!!!!! یه ذره صبر داشته باشین با هم دیگه میبینیم چرا
خب از اون گروه 9 تایی که بایت رو میسازن 8 بیت برای ذخیره سازی داده ها و حداقل یکی از اون بیت ها به parity اختصاص داره. طبق قانون parity تعداد بیت های "یک" عدد برای هر بایت باید همیشه فرد باشه تا parity در اصطلاح set یا on بشه.
خب پس بیت parity ( توازن ) برای استفاده میشه که تعداد بیت های یک بایت رو فرد بکنه. اگر parity زوج باشه اون وقت سیستم فرض میکنه که خطای توازن "though rare" رخ داده که ممکن هست دلیلش خطا در سخت افزار یا اختلال الکتریکی باشه.
پس هیچوقت امکان نداره که با وجود parity یا بیت توازن تعداد یک ها در بیت زوج باشه. اوکی؟☺️
خب . حالا بریم ببینم که پردازنده چه اندازه هایی از داده رو پشتیبانی میکنه و اسماشون چیه:
• Word: 2-Byte (16-bit) data
• Doubleword: 4-Byte (32-bit) data
• Quadword: 8-Byte (64-bit) data
• Paragraph: 16-Byte (128-bit) data
• Kilobyte: 1024 Bytes
• Megabyte: 1,048,576 Byte
سیستم اعداد باینری Binary :
هر سیستم عددی با استفاده از نماد موضعی ، مثلن ، هر رقمی که در آن نوشته میشه دارای یک ارزش متفاوت نسبت به موضع اش هست. هر موقعیت هم توانی از پایه ی اون سیستم هست. مثلن برای سیستم اعداد دودویی پایه 2 هست و توان ها از صفر شروع میشن و یکی یکی افزایش پیدا میکنن.
جدول زیر نمایش موضعی مقادیر رو برای یک عدد 8 بیتی باینری نشون میده که همه ی بیت ها روی 1 set شدن:

کاسمبلی


ارزش یک عدد دودویی بر اساس اعداد یک ای که در عدد هست و مکان و موضعشون بستگی داره. پس مقدار عدد بالا به دسیمال یا همون دهدهی برابر با:
1 + 2 + 4 +8 + 16 + 32 + 64 + 128 = 255
که همون 1 - 8^2 میشه.
سیستم اعداد هگزادسیمال Hexadecimal :
این سیستم از پایه 16 استفاده میکنه. ارقام تو این سیستم از 0 تا 15 هستن. بر طبق قرارداد حروف الفبا از A تا F برای نمایش اعداد از 10 تا 15 تو این سیستم استفاده میشه.
از اعداد هگزا دسیمال برای مختصر سازی و کوتاه سازی طول اعداد دودویی در محاسبات استفاده میشه.
در اصل این سیستم، داده های باینری بوسیله تقسیم هر کدام از بایت ها به نصف بایت(4بیت) نمایش میده. برای درک راحتتر به جدول توجه میکنیم:

اسمبلی

هگزا دسیمال


برای تبدیل عدد باینری به هگزادسیمال ، عدد رو از راست به گروه های 4تایی تقسیم میکنیم و معادل مقدار هر گروه رو قرار میدیم. یه مثال رو با هم نگاه کنیم.
عدد 1000110011010001 رو میخوایم به باینری تبدیل کنیم.
ابتدا اعداد رو به گرو های 4 تایی تقسیم میکنیم :
1000 1100 1101 0001
بعد معادل هر گروه رو میذاریم :
8 C D 1
به همین سادگی
خب حالا برعکس _ یعنی تبدیل هگزادسیمال به باینری :
عدد FAD8 به باینری
خب اول جدا میکنیم :
F A D 8
بعد معادلش رو مینویسیم:
1111 1010 1101 1000
این هم از این.
محاسبات باینری :
جدول زیر چهار قانون ساده جمع دودویی را نشان میدهد.

اسمبلی


قوانین iii و iv نشان دهنده ی یک بیت نقلی ( Carry ) می باشد.
مثال:

اسمبلی


یک مقدار منفی باینری را مکمل دو آن عدد نمایش می دهیم. با توجه به این قانون ، برای تبدیل عددی باینری به مقدار منفی اش یک روش این است که همه ی بیت های عدد رو برعکس کنه ( یعنی اگه صفر بود یک و برعکس ) و با یک جمع کنیم.

اسمبلی


برای تفریق دو عدد ازهم ، عددی که تفریق می شود را با این روش به مکمل دوی آن تبدیل می کنیم و با دیگری جمع میکنیم. ( آیا روش دیگری هم موجود هست ؟ )
مثال :
53 - 42


نکته : سرریز ( Overflow) بیت آخر هم از بین میره میشه . ( چرا ؟)
آدرس دهی داده در حافظه
فرایندی که میگه کدام پردازنده اجرای دستورالعمل ها رو کنترل میکنه به عنوان Fetch – Decode – Execute cycle یا همان Execution Cycle شناخته میشه.
که خود شامل سه مرحله میشه :
• دریافت دستورالعمل از حافظه ( Fetching )
• شناسه دار کردن دستورالعمل ها Decode
• اجرای دستورالعمل ( Execution )
پردازنده ممکن است به یک دو خانه یا بیشتر از خانه های حافظه در آن واحد دسترسی داشته باشه. خب عدد هگزادسیمال 0725H را در نظر میگیریم. این عدد به 2 بایت از خانه های حافظه برای ذخیره شدن نیاز داره.

بایت پر ارزش تر 07 و بایت کم ارزش تر 25 است. یادمان باشد که ما Byte Addressable هستیم.
پردازنده داده رو به صورت معکوس ذخیره میکنه. ( تحقیق کنید چرا ؟ )

اسمبلی


هنگامی که داده های عددی رو از حافظه به ثبات ها میگیره ، دوباره بایت هارو معکوس میکنه. و این روند به همین ترتیب ادامه داره
ما در کل دو نوع آدرس حافظه داریم :
• آدرس مطلق – یک مرجع مستقیم به یک مکان خاص از حافظه ( Absolute Address )
• آدرس سگمنت – که به آدرس شروع سگمنت حافظه با مقدار آفست میگن . ( Segment Address )
خب این جسله تموم شد برای جلسه بعد کاری که باید انجام بدید اینکه 5 تا عدد رو که ترجیحن 3 رقمی به بالا باشه رو از دسیمال به باینری تبدیل کنید و مکمل دو اونها رو بگیرین و محاسبات باینری رو روشون اجرا کنیم.
و یکسری تحقیق هم و سوال هم در متن درس پرسیدم که اونارو حتمن پیدا کنید چون جلوتر بهشون نیاز داریم. و بنده هم برای اینکه خودتون باید برید و اونهاور پیدا کنین جوابشو نمیدم.
دیگه همین.
Keep Calm and Code Assembly

آیکون دانلود دانلود PDF قسمت اول آموزش Assembly

کلمات کلیدی