# برنامه نویسی سطح پایین > برنامه نویسی اسمبلی خانواده x86 > آموزش: آموزش برنامه نویسی به زبان اسمبلی به صورت گام به گام

## JaVa

توجه:

فعلا تاپیک در حال ایجاد است لطفا تا تکمیل مراحل اولیه ایجاد تاپیک از *ارسال هرگونه پستی خودداری نمایید.*


Busy.png
اگر از بین دوستان و اساتید کسانی علاقمند به شرکت و پیشبرد موضوع تاپیک بودند می توانند با *پیام خصوصی* با بنده در ارتباط باشند.


*هر گونه اشتباه یا غیر علمی بودن مطالب رو در صورت مشاهده به من گزارش بدید.*

----------


## JaVa

مقدمه:

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

*سپس به قالب کلی دستورات اسمبلی و به معرفی عملوند های حافظه ، دستور MOV ، وقفه ها ،ساختارات دستوری و ماکروها* هم می پردازیم همراه با مثال...
و همچنین تمام برنامه نوشته شده برای پردازنده اینتل 8086 نوشته می شوند.
*همچنین این رو هم بگم که شاید بعضی از موضوعات رو از سایر تایپیک ها همرا با لینک آن تایپیک هم مورد استفاده قرار بگیره.*

هدف اصلی من هم آموزش است.

----------


## JaVa

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

----------


## JaVa

*کاربرانی که به همکاری من در ساختن این تایپیک به من کمک کردن:*

تشکر می کنم از *xman_1365_x  *  برای توضیحاتی که به من فرمودند.

----------


## JaVa

*پرسش و پاسخ:*
*(پرسش هایی که از طریق پیغام خصوصی دریافت می شوند در صورت نیاز در این قسمت مطرح و پاسخ داده خواهند شد.)*

*اگه دوستان بخوان که اطلاعات کاملی در مورد پروسسور 8086 بدست بیارند می تونند به این سایت یه نگاهی بندازند.*

----------


## JaVa

*درباره زبان برنامه نویسی اسمبلی :*
زبان همگذاری یا اَسمبلی (به انگلیسی: *Assembly*) به مجموعه زبان‌های برنامه‌نویسی سطح پایینی اطلاق می‌شود که در آن مستقیماً دستورالعمل‌های پردازندهٔ اصلی (CPU) نوشته می‌شود ( یعنی دستوراتی که *ALU* توانایی انجام آنها را دارد.)

به دلیل سطح پایین بودن این زبان‌ها، نوشتن، اشکال‌زدایی و نگهداری برنامه سخت‌تر است. برای هر خانوادۀ *CPU* یک زبان اسمبلی وجود دارد.

این زبان به زبان مادر کامپیوتر بسیار نزدیک می‌باشد به‌طوری که تمامی برنامه‌های اولیه همچون *++C* توسط* زبان اسمبلی* ساخته شده است و همچنین اکثر کارها در زمینۀ هک و مانند آن با این زبان انجام می‌شود. در زبان اسمبلی هر دستور زبان متناظر یک دستور باینری است. این زبان را با استفاده از اسمبلر‌ها می‌توان به زبان ماشین یعنی صفر و یک تبدیل کرد. نرم‌افزارهای اسمبلر بر روی سیستم نصب شده و با وارد کردن کدهای اسمبلی و اشکال‌زدایی کردن آن می‌توان آن‌ها را به زبان ماشین تبدیل کرد.

*اسمبلر* 
اسمبلر یا همگذار نرم افزاری است که برنامه نوشته شده به زبان اسمبلی را به کد ماشین تبدیل می کند و یک فایل با پسوند *obj* تولید می کند. توجه شود که این فایل قابل اجرا نیست و بوسیله نرم افزار *Linker* این فایل به یک فایل با پسوند *exe* تبدیل می شود که این فایل جدید قابل اجرا است.

*اسمبلر های معروف:
*
مایکروسافت اسمبلر
توربو اسمبلر
اَسِمبلی 64 بیتی 32 بیتی و 16 بیتی

کامپیوتر های امروزی دارای ثبات 32 بیتی که می توان بصورت 8 بیتی مانند AL,AHو... و یا بصورت 16 بیتی مانند AX,BXو...و یا بصورت 32 بیتی مانند EAX,EBX,ECX,EDXو... استفاده نمودهمچنین ثبات های BP,SP,DI,SI نیز به شکل 32 بیتی EBP,ESP,EDI,ESI قابل استفاده اند.ثبات های ES,SS,DS,CS 
16 بیتی هستند.

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

*از مزایا مهم زبان اسمبلی:*
    1- استفاده کامل از امکانات سخت افزاری
    2- کاهش حجم برنامه ها
    3- سرعت بالای اجرای برنامه ها
*از معایب مهم زبا اسمبلی:*
    1-برنامه نویس باید ازاطلاعات کاملی در مورد *معماری کامپیوتر و پروسسورها* داشته باشد.

----------


## JaVa

با عرض سلام و خسته نباشید و ....
*موضوع این پست:* ریجیسترها،انواع ریجیسترها،ثبات های سگمنت، ثبات های اشاره گر، ثبات های ایندکس.

*ریجسترها:* ریجیسترها حافظه ی کوچک و محدود در CPUمی باشدکه مستقیما با واحدهای ALU و CU در ارتباط است. خاصیت ویژه ریجیسترها سرعت بالا همچنین قابلیت آدرس دهی با نام است بدلیل آنکه دستیابی به ریجیسترها برای CPU  سریعتر از انواع حافظه دیگر می باشد دستوراتی که فقط از ریجیسترها استفاده میکنند بسیار سریعتر از دستوراتی اجرا می شوند که عملوندهای آن قرار است از حافظه منتقل شوند.

ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ــــــــــــــــــــــــ
*ریجیسترهای عمومی*AX,BX,CX,DX
ر*یجسترهای سگمنت* CS,DS,SS,ES
*ریجسترهای ایندکس*	SP,BP,SI,DI
*ریجیسترهای وضعیت کنترلی*FR,IP
ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ــــــــــــــــــ

*رجیسترهای عمومی عبارتند از:*

*AX,BX,CX,DX* که همگی 16 بیتی هستند و برای اعمال محاسباتی و اعمال همه منظوره استفاده می شود.هر یک از این ریجیسترها قابلیت دسترسی به 8 بیت را دارند. یعنی میتوان داده ها را روی 8 بیت کم ارزش مانند *AL,BL,CL,DL* 8 بیت پر ارزش مانند* AH,BH,CH,DH* نوشت.
ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ــــــــــــــــــ

*AX*: این ثبات برای اعمال ورودی خروجی زیاد استفاده می شود.
*BX:* از این ثبات بعنوان اندیس جهت توسعه آدرس استفاده می شود. ضمن اینکه در محاسبات کاربرد دارد.
*CX:* از این ثبات علاوه بر کاربرد در محاسبات می توان جهت تعداد دفعات تکرار حلقه استفاده کرد.
*DX:* این ثبات برای اعمال ورودی خروجی زیاد همجنین ضرب و تقسیم بزرگ استفاده می شود.
ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ــــــــــــــــــ

*ثبات های سگمنت عبارتند از CS,DS,SS,ES :* که هر کدام 16 بیتی بوده و آدرس شروع هر سگمنت متناظر را نگهداری می کند.

*ریجسترهای ایندکس SP,BP,SI,DI :* که حاوی آفست داده و دستور عملها هستند.

*ریجیسترهای وضعیت کنترلی: FR,IP* 

*FR:* یا ثبات پرچم این ثبات جهت نمایش وضعیت پردازنده مرکزی در اثر اجرای دستور عمل محسباتی انجام می شود. و فقط  9 بیت از 16 بیت ستفاده می شود.
ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ــــــــــــــــــ

*CF* محتوی رقم نقلی بوجود آمده از باارزش ترين بيت در عمليات محاسباتی يا چرخش
*PF	*برای کنترل صحت انتقال داده. اگر صفر باشد تعداد بيتهای انتقالی فرد است و اگر يک باشد زوج است
AF	محتوی رقم نقلی از بيت سوم به چهارم در يک بايت است. در عمليات BCD کاربرد دارد
*ZF	*اگر نتيجه عمليات محاسباتی صفر باشد اين بيت 1 است در غير اينصورت صفر است
*SF	*در صورت منفی بودن نتيجه عمليات اين بيت 1 است در غير اينصورت صفز است
*TF	*برای اجرای دستورالعمل به صورت دستور به دستور اين بيت بايد 1 باشد
*IF	*اگر 1 باشد وقفه فعال است و اگر صفر باشد وقفه غير فعال است يعنی سيستم وقوع وقفه را ناديده می گيرد
*DF	*اگر 1 باشد عمل مقايسه يا انتقال داده از سمت راست به چپ صورت می گيرد در غير اينصورت از چپ به راست
*OF	*اگر در باارزش ترين بيت سرريزی وجود داشته باشد اين بيت يک می شود. (توضيحات بيشتر در محاسبات مکمل 2 داده شده است)
ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ــــــــــــــــــــــــ

*IP:* این ثبات حاوی آفست و دستور اجرایی بعدی در سگمنت کد می باشد.


*سگمنت*

*تعریف اول:* برای آدرس دهی به هر يک از اين سگمنت های برنامه يک ثبات وجود دارد که مشخص می کند کدام بخش حافظه برای قسمت های مختلف برنامه به کار رفته است.
*تعریف دوم:* ناحیه ای از حافظه است که از مرز پاراگراف شروع می شود یعنی آدرس شروع آن بر 16 قابل تقسیم است و اندازه هر سگمنت حداکثر 64 کیلو بایت می باشد. بطور کل هم چهار سگمنت وحود دارد.

ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ــــــــــــــــــ
CS	شامل آدرس شروع سگمنت کد، که به CPU می فهماند دستورالعمل های برنامه در کجا قرار دارند
DS	شامل آدرس شروع سگمنت داده که به پردازنده می فهماند داده ها و فضای کاری در کجا قرار دارد
SS	آدرس شروع سگمنت پشته را در خود ذخيره می کند
ES	آدرس شروع سگمنت اضافی، سگمنت داده دوم
ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ــــــــــــــــــ

*ثبات های اشاره گر*
ثبات های اشاره گر نگهدارنده بخش آفست در آدرس دهی هستند و همراه با يکی از ثبات های سگمنت به محلی از حافظه اشاره دارند. طبق پيش فرض ثبات های همه منظوره و ايندکس همراه با DS و ثبات های پشته همراه با SS و IP همراه با CS استفاده می شوند.

*IP	*همراه با ثبات CS به دستورالعمل بعدی که بايد توسط CPU اجرا شود اشاره می کند.
*SP	*آفست مکانی از سگمنت پشته که عمل قرار گرفتن داده در پشته صورت می گيرد. به عبارت ديگرSS:SP به بالای پشته اشاره دارد.
*BP	*برای دسترسی به متغيرهای محلی که در پشته قرار دارند استفاده می شود.
ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ــــــــــــــــــ

*ثبات های ايندکس*
دو ثبات 16 بيتی ايندکس وجود دارد که اغلب به عنوان اشاره گر به همراه DS به کار می روند تا به داده های موجود در سگمنت داده دسترسی شود. اما می توانند به همان منظورهای ديگر، مانند ثبات های همه منظوره، هم استفاده شود؛ گرچه نمی توانند به دو بخش 8 بيتی تجزيه شوند.

*SI	*برای آدرس دهی و در عمليات رشته ای بعنوان مبدا استفاه می شود
*DI	*برای آدرس دهی و در عمليات رشته ای بعنوان مقصد استفاه می شود

*نظرات خودتون رو برای من پیام خصوصی کنید/*

----------


## JaVa

قالب کلی دستورات اسمبلی ومعرفی عملوند های حافظه

قالب کلیدستورات اسمبلی به این شکل است:
[توضیحات;][عملوندها]دستورالعمل[شناسه]
دستورالعمل های اسمبلی ممکن است فاقد شناسه، عملوندها و توضیحات باشند.

*شناسه* از عناصر اصلی برنامه اسمبلی مثل نام برنامه و برچسب هاست.

هر دستور زبان اسمبلی می تواند یک، دو یا هیچ عملوندی نداشته باشد. اگر دستور العمل دو عملوند داشته باشد فرمت کلی آن دستور العمل بصورت زیر است:
[توضیحات;]<عملوند منبع>و<عملوند مقصد>دستورالعمل[شناسه]

*مثال:*
L1: Mov Ax,4c00h;This is a Sample

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

*قالب کلی برنامه اسمبلی که ما اینجا باهاش سر کار داریم:*

تعریف سگمنت پشته
تعریف سگمنت داده 
نام سگمنت کد
Proc Far نام برنامه
.
.
.
Endp نام برنامه
Ends نام سگمنت کد
نام برنامه End

*تعریف سگمنت ها
*

پارامترها Segment نام سگمنت
.
.
.
Ends نام سگمنت

هر برنامه ممکن است چند سگمنت داشته باشد. مثلا: سگمنت داده، سگمنت پشته ، سگمنت کد، برای تعریف هر سگمنت از شبه دستور Segment بصورت بالا استفاده می شود.

 پارامترهای که در تعریف سگمنت بکار می روند بر سه نوع اند:

1- پارامتر تنظیم(Align)
2- پارامتر ترکیب(Combine)
3- پارامتر کلاس(Class)


[پارامتر کلاس][پارامتر ترکیب][پارامتر تنظیم] Segment نام سگمنت
.
.
.
ENDS نام سگمنت


*پارامتر تنظیم* مرزی را که سگمنت باید از آن جا شروع شود را مشخص می کندپارامتر تنظیم یکی از مقادیر زیر را می پذایرد.
*
1-byte: آدرس سگمنت می تواند از هر نقطه ای از حافظه شروع شود.
2-word:آدرس سگمنت می تواند از هر نقطه ای از حافظه که آدرس آن زوج باشد شروع شود.
3-para:آدرس سگمنت می تواند از مرز پاراگراف یعنی جایی که بر 16 قابل تقسیم است می تواند شروع شود.
4-Page:آدرس سگمنت می تواند از مرز پاراگراف یعنی جایی که بر 256 قابل تقسیم است می تواند شروع شود.

**نکته:* اگر در مقدار پارامتر چیزی نوشته نشود مقدار پیشفرض Para است.

ادامه دارد........

----------


## محسن=0

چرا به اموزش ادامه نمیدید؟

----------

