به نام خدای بخشنده و مهربان

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

توی پست های قبلیم از جمله پست "طراحی و ساخت سیستم عامل" گفتم که یکی از زبان های مورد نیاز برای برنامه نویسی سیستم عامل ، زبان سطح پائین اسمبلی است. این زبان قابلیت درگیر شدن با سخت افزار رو داره و شما میتونید با این زبان با سخت افزار صحبت کنید!

راستش هر سخت افزاری زبان اسمبلی مخصوص خودش رو داره و توی همه دیوایس ها این زبان برنامه نویسی برابر نیست! چون زبان برنامه نویسی کامپیوتر محیط مناسبی برای توسعه زبان اسمبلی رو نداره و ما رو درگیر میکنه ، تصمیم گرفتم برای شروع برنامه نویسی CPU Intel 8086 رو انجام بدیم. چون برنامه نویسی این سخت افزار یک نرم افزار ساده برای برنامه نویسی و دیباگ داره که میتونه خیلی برای درک مفاهیم اسمبلی کمکمون کنه. ولی بعدا انشالله میریم سراغ برنامه نویسی کامپیوتر های امروزه (به درد سیستم عامل میخوره)

 

» کمی بیشتر در مورد 8086

همانطور که میدانید هر پردازنده ای دارای تعدادی رجیستر می باشد. این پردازنده نیز دارای هشت ثبات (رجیستر - Register) شانزده بیتی به نام های DI ,SI ,BP ,SP ,DX ,CX ,BX,AX می باشد. چهار رجیستر AX,BX,CX,DX را می توان به عنوان ثباتهای شانزده بیتی در نظر گرفت یا هر کدام را به عنوان دو رجسیتر هشت بیتی در نظر گرفت و استفاده کرد!

جدول زیر این موضوع را به خوبی نمایش میدهد.

اسمبلی

AX  Accumulator
BX      Base
CX    Count
DX      Data

و همچنین چهار ثبات دیگر به شکل زیر

اسمبلیSP Stack pointer
BP Base pointer
SI Source index

DI Destination index

معمولا از ثباتهای SP و BP در مورد عملیات روی پشته ها و از ثباتهای SI و DI به عنوان شاخص در ساختار های پیچیده تر استفاده می شود!

این پردازنده همچنین دارای چهار رجیستر شانزده بیتی دیگر ، معروف به ثبات های شگمنت می باشد که برای آدرس دهی از آنها استفاده می شود. این ثبات ها به نام های CS,DS,SS,ES می باشند.

CS       Code Segment
DS      Data Segment
SS      Stack Segment
ES       Extra Segment

 

سگمنت ها ناحیه پیوسته در حافظه می باشند. اندازه هر سگمنت می تواند تا 64 کیلو بایت باشد!

ذکر این نکته نیز مهم است که

ثبات CS آدرس شروه ناحیه از حافظه که کد های دستورالعمل در آن قرار دارد گذاشته می شود.

در ثبات DS آدرس شروع ناحیه ای از حافظه که داده ها در آن قرار دارد گذاشته می شود.

در ثبات SS آدرس شروع ناحیه ای از حافظه که پشته در آن ایجاد می شود قرار داده می شود.

در ثبات ES در صورتی که پردازش رشته وجود داشته باشد، آدرس ابتدای ناحیه شروع رشته قرار داده می شود! (اختیاری - در هنگام استفاده از رشته ها)

 

حالا به جای بسیار بسیار مهم رسیدیم! ینو با دقت بخونید و هر طور که شده یاد بگیرید!

 

/// ثبات های فلگ (Flag register)

پردازنده 8086 دارای یک رجیستر شانزده بیتی به نام ثبات فلگ می باشد. دوازده بیت از این 16 بیت می توانند مورد استفاده برنامه نویس قرار بگیرند! هر کدام از این 12 بیت اسم خاص خود را داردو مشخص کننده وضعیت خاصی است!

تصویر زیر این ثبات را نشان میدهد

فلگ در اسمبلی

CF       Carry Flag
PF        Parity Flag
AF       Auxiliary Flag
ZF       Zero Flag
SF       Sign Flag
OF       Overflow Flag
TF        Trap Flag
IF        Interrupt Enable Flag
IOPL       Input / output privilege Level Flag
NT      Nested Task Flag

CF: زمانی که در عملیات جمع یا تفریق یک carry یا borrow بوجود می آید این بیت 1 می شود

ZF: در عملیات جمع یا تفریق اگر مقدار نتیجه برابر با صفر شود این بیت 1 می شود.

OF: زمانی که OF ست (1) می شود یعنی نتیجه محاسبه در محل تعیین شده در حافظه جا نمیگیرئ . باعث می شود تعدادی از بیت ها پاک شود

 

/// ثبات IP

این ثبات یک ثبات شانزده بیتی است که آدرس دستور العمل بعدی که باید اجرا بشه رو توی خودش نگه داری میکنه و پردازنده آدرسی که توی این ثبات هست رو میخونه و دستورالعمل رو اجرا میکنه! برنامه نویس به مقدار این ثبات دسترسی نداره و نمیتونه تغییرش بده.

 

» نرم افزار برنامه نویسی اسمبلی

خوب باید بگم متاسفانه زبان اسمبلی از یک IDE یا همون نرم افزار یکپارچه ای که همه کار های برنامه نویسی ، دیباگ و کامپایل توی یک نرم افزار انجام میشه بی بهره هست. ولی خوب emu8086 هم میتونه کار های ما رو انجام بده! البته این نرم افزار فقط یک شبیه ساز هست و ما برای اینکه ببینیم اسمبلی چه کار هایی انجام میده ازش استفاده میکنیم! لینک دانلود رو در زیر قرار دادم تا زحمت سرچ هم نکشید!

دانلود برنامه emu8086

خوب برنامه بالا رو دانلود کنید و نصب کنید. کار برنامه ما فعلا تموم شد حالا باید بریم سراغ برنامه نویسی!

 

» برنــامه نویـسی اسمبلی

خوب کد هایی رو که از همه مهم تر هست رو اول میگم و کم کم با همه کد ها آشناتون میکنم...!

دستور MOV : این دستور برای انتقال مکان حافظه به رجیستر و بالعکس استفاد میشه! (اگه نمیدونید رجیستر چی هست به پست "ثبات چیست" مراجعه کنید)

شکل کلی این دستور به صورت زیر است!

MOV dst , src

که SRC مبدا و dst مقصد است! یعنی مقدار src توی dst قرار میگیره!

مثال: تکه کد زیر مقدار 100 دهدهی یا 64 هگزادسیمال رو در ثبات AX قرار میدهد

MOV AX,64h ; AX=100

 

کامنت: هر زبان برنامه نویسی یه کد هم برای کامنت داره ، کامنت یعنی یه متنی که کامپایل نمیشه و هیچ تاثیری در برنامه نویسی نداره، فقط برای خوانایی برنامه استفاده میشه! در زبان اسمبلی با کاراکتر ';' یک متن کامنت میشه!

دستور MUL: این دستور برای ضرب دو مقدار استفاده میشه! و شکل آن به صورت زیر است

MUL Opr

تعجب نکنید مقدار opr در مقدار ثبات ax ضرب میشه و مقدارش در ax قرار میگیره!

مثال: تکه کد زیر عدد 5 را در 3 ضرب میکند و نتیجه را در ax قرار میدهد!

MOV AL,3
MOV BL,5
MUL BL

 

شاید تعجب کنید که دیگه AL و BL چیه؟ خوب باید بگم گیج نشید L به معنی  LOW یا پائین و H به معنی High یا بالا هست! 

باید بگم که رجیستر های این پردازنده 16 بیتی هستند و از دو قسمت 8 بیتی تشکیل میشن! قسمت اول اون 8 بیت رو LOW یا پایین مینامند و قسمت دوم رو High یا بالا مینامند!

مثال: تکه کد زیر عدد 0 رو در قسمت پایین رجیستر AX و مقدار 255 رو در قسمت بالا رجیستر AX قرار میده!

MOV AL,0
MOV AH,255
; AX=0B 1111111100000000

همانطور که میبینید اون هشت تا 0 ها برای قسمت پایین رجیستر AX هستند و ان هشت تا 1 ها برای قسمت بالای رجیستر AX هستند.!

 

» شبیه سازی کد های اسمبلی در emu8086

خوب میریم سراغ عمل، نرم افزاری رو که دانلود کرده بودید رو اجرا کنید! با شکل زیر مواجه میشید! تکه کد بالا رو که عمل ضرب رو انجام میداد رو در صفحه برنامه بنویسید!

emu8086

خوب حالا گزینه emulate رو بزنید (اون گزینه سبز که مثل play هست) حالا وارد پنجره ی جدید باز یشه که برنامه ای رو که نویشتید براتون شبیه سازی میکنه!

ستون سمت چپ رجیستر ها رو نشون میده! اگه کد بالا رو شبیه سازی کنید و به ستون سمت چپ نگاه کنید مقادیری رو که توی برنامه نوشتید توی رجیستر ها نوشته میشه! و در آخر ضرب میشه!

البته دقت کنید که این مقادیر همگی به صورت هگزادسیمال هستن و دهدهی نیستند! در نهایت عدد 3 در 5 ضرب میشود و عدد 15 یا همون 0F هگزادسمیال رو در ax قرار میده!

برای شروع شبیه سازی میتونید گزینه single step رو بزنید تا مرحله به مرحله شبیه سازی رو مشاهده کنید!

emu 8086

خوب رجیستر هایی که در بالا میبینید همگی در پردازنده 8086 اینتل هستند که 16 بیتی هست!

همونطور که میدونید رجیستر IP شمارنده برنامه در 8086 هست که الان داره به CPU میگه کجا رو باید بخونه و اجرا کنه!

 

به نظرم برای این پست فعلا کافیه! اگه خوشتون اومده من ادامه میدم تا به نتجیه ای برسیم!

امیدوارم به دردتون خورده باشه!

فعلا یا علی مدد...!