PDA

View Full Version : آموزش: آموزش برنامه نویسی به زبان اسمبلی به صورت گام به گام



JaVa
سه شنبه 12 اردیبهشت 1391, 21:49 عصر
توجه:

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



86576

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


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

JaVa
سه شنبه 12 اردیبهشت 1391, 22:02 عصر
مقدمه:

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

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


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

JaVa
سه شنبه 12 اردیبهشت 1391, 22:05 عصر
فهرست مطالب:
کاربرانی که به همکاری من در ساختن این تایپیک به من کمک کردن (http://barnamenevis.org/showthread.php?339501-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A7%D8%B3%D9%85%D8%A8%D9%84%DB%8C-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%DA%AF%D8%A7%D9%85-%D8%A8%D9%87-%DA%AF%D8%A7%D9%85&p=1497694&viewfull=1#post1497694)
پرسش و پاسخ (http://barnamenevis.org/showthread.php?339501-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A7%D8%B3%D9%85%D8%A8%D9%84%DB%8C-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%DA%AF%D8%A7%D9%85-%D8%A8%D9%87-%DA%AF%D8%A7%D9%85&p=1497695&viewfull=1#post1497695)
درباره زبان برنامه نویسی اسمبلی (http://barnamenevis.org/showthread.php?339501-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A7%D8%B3%D9%85%D8%A8%D9%84%DB%8C-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%DA%AF%D8%A7%D9%85-%D8%A8%D9%87-%DA%AF%D8%A7%D9%85&p=1497702&viewfull=1#post1497702)
ریجیسترها،انواع ریجیسترها،ثبات های سگمنت، ثبات های اشاره گر، ثبات های ایندکس. (http://barnamenevis.org/showthread.php?339501-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A7%D8%B3%D9%85%D8%A8%D9%84%DB%8C-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%DA%AF%D8%A7%D9%85-%D8%A8%D9%87-%DA%AF%D8%A7%D9%85&p=1497708&viewfull=1#post1497708)

JaVa
سه شنبه 12 اردیبهشت 1391, 22:06 عصر
کاربرانی که به همکاری من در ساختن این تایپیک به من کمک کردن:

تشکر می کنم از xman_1365_x (http://barnamenevis.org/member.php?33193-xman_1365_x) برای توضیحاتی که به من فرمودند.

JaVa
سه شنبه 12 اردیبهشت 1391, 22:07 عصر
پرسش و پاسخ:
(پرسش هایی که از طریق پیغام خصوصی دریافت می شوند در صورت نیاز در این قسمت مطرح و پاسخ داده خواهند شد.)

اگه دوستان بخوان که اطلاعات کاملی در مورد پروسسور 8086 بدست بیارند می تونند به این سایت (http://www.hpkclasses.ir/Courses/Assembly/asm0000.html)یه نگاهی بندازند.

JaVa
سه شنبه 12 اردیبهشت 1391, 22:22 عصر
درباره زبان برنامه نویسی اسمبلی :
زبان همگذاری یا اَسمبلی (به انگلیسی: 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 که این برنامه تحت ویندوز می باشد و به صورت گرافیکی شما می توانید با این برنامه کار کنید.
منبع : دانشنامه آزاد ویکی پدیا (http://fa.wikipedia.org/wiki/%D8%B5%D9%81%D8%AD%D9%87%D9%94_%D8%A7%D8%B5%D9%84% DB%8C)

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

JaVa
سه شنبه 12 اردیبهشت 1391, 22:45 عصر
با عرض سلام و خسته نباشید و ....
موضوع این پست: ریجیسترها،انواع ریجیسترها،ثبات های سگمنت، ثبات های اشاره گر، ثبات های ایندکس.

ریجسترها: ریجیسترها حافظه ی کوچک و محدود در 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
شنبه 27 خرداد 1391, 17:26 عصر
قالب کلی دستورات اسمبلی ومعرفی عملوند های حافظه

قالب کلیدستورات اسمبلی به این شکل است:

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

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

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

[توضیحات;]<عملوند منبع>و<عملوند مقصد>دستورالعمل[شناسه]

مثال:

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
سه شنبه 08 بهمن 1392, 08:19 صبح
چرا به اموزش ادامه نمیدید؟