• Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal
LuaErrorAdmin

assembly
آموزش زبان اسمبلی

1 ارسال در این موضوع قرار دارد

بسم الله الرحمن الرحیم

مقدمه

زبان اسمبلی چیست

زبان اسمبلی که يک زبان برنامه نويسی سطح پايين است که ساختار و عملکردی وابسته به ماشين دارد. بين عبارات آن و دستورالعمل های زبان ماشين کامپيوتر تناظر يک به يک برقرار است. يعنی هر دستورالعمل اسمبلی دقيقا يک دستورالعمل زبان ماشين را نشان می دهد، در حاليکه در زبان سطح بالا يک عبارت معمولا به چندين دستورالعمل ماشين تبديل می شود.

يک برنامه اسمبلی مانند برنامه های سطح بالا به صورت text نوشته می شود. هر دستورالعمل زبان اسمبلی يک نمايش نمادی (يک کد الفبائی کوتاه) از يک دستورالعمل ماشين است، که به اين صورت معنی دستور واضح تر از کد زبان ماشين می شود.

 

مقايسه زبان اسمبلی و زبان های سطح بالا

دو دسته اصلی زبان های برنامه نويسی عبارتند از:

1. زبان های سطح بالا 
    • مانند C++، Pascal، Java و Visual Basic.
2. زبان های سطح پايين 
    • زبان ماشين 
    • زبان اسمبلی

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

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

 

زبان ماشين

هر خانواده ای از پردازنده ها دارای مجموعه ای از دستورالعمل های منحصر بفرد است که زبان ماشين ناميده می شود. مجموعه دستورالعمل های يک پردازنده (Instruction Set) مجموعه ای از اعداد دودوئی است که ماشين می تواند آنها را درک و اجرا کند. هر نوع CPU تنها زبان مخصوص خود را درک می کند و دارای مفسری بنام microprogram است که دستورات زبان ماشين را به سيگنال های سخت افزاری تفسير و ترجمه می کند.

اسمبلر

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

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

محبوب ترين اسمبلرها برای پردازنده ها ی خانواده اينتل عبارتند از:

• ماکرواسمبلر Microsoft’s Assembler MASM
• توربو اسمبلر Borland’s Assembler TASM
• و ASM86

 

برنامه ديگری که برای رديابی اجرای برنامه و بررسی محتوای حافظه کاربرد دارد ديباگر(Debugger) است که استفاده از آن بهترين راه برای يادگيری برنامه های اسمبلی و روند اجرای آنهاست. ديباگر برنامه ای است که اجازه بررسی ثبات ها و حافظه را بعد از اجرای هر دستور برنامه می دهد و خصوصا برای تست برنامه های اسمبلی مفيد است.

برنامه Debug از جمله ساده ترين ديباگرهاست که توسط MS-DOS عرضه شده است. CodeView همراه با ميکروسافت اسمبلر می آيد که اجازه می دهد کد منبع برنامه ها، بلاک های حافظه و ثبات ها را مشاهده کنيد. Turbo Debugger بورلند هم به همين صورت است.

يک برنامه ديگر همراه با اسمبلر برنامه لينکر(Linker) است که فايل های مجزای توليد شده توسط اسمبلر يا کامپايلر را به يک برنامه اجرائی تبديل می کند. برنامه Link که همراه فايل های MS-DOS می باشد يکی از متداولترين برنامه های لينکر می باشد.

هدف از يادگيري زبان اسمبلي

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

• زبان اسمبلی وسيله خوبی برای يادگيری نحوه کار کامپيوتر، کامپايلرها و زبان های سطح بالا است و به درک عميق تر معماری کامپيوتر، مفاهيم سيستم عامل، نمايش داده ها و دستگاه های سخت افزاری کمک می کند که دانستن آنها باعث می شود برنامه نويس از عهده اشکالزدائی و رفع مسائل برنامه نويسی در سطح بالا بهتر برآيد و نرم افزارهای پربارتری را در زبان های سطح بالا مانند ++C پياده سازی کند.
• برنامه های اسمبلی سريع تر، کوچکتر و با توانائی های بيشتر از زبان های ديگر هستند و معمولا حافظه و زمان اجرای کمتری را نياز دارد. گاهی نوشتن کد در اسمبلی سريعتر و کوتاهتر از کدکامپايل شده می شود. يک برنامه ويژوال بيسيک می تواند زيربرنامه های DLL نوشته شده در زبان اسمبلی را برای افزايش سرعت برنامه در حالات بحرانی فراخوانی کند.
• برنامه های اسمبلی می توانند براحتی از محدوديت های موجود در زبان های سطح بالا عبور کنند و کنترل بيشتری نسبت به نيازمندی های سخت افزاری خاص ارائه دهند. برخی از اعمال در زبان های سطح بالا دشوار يا غير ممکن است، مانند ارتباط با سيستم عامل يا دسترسی مستقيم به کنترلرها. يک برنامه نويس مجرب می تواند با نوشتن کد بيشتر راهی برای گذشتن از اين محدوديت ها پيدا کند اما خوانائی برنامه کاهش پيدا می کند. زبان اسمبلی، در مقابل، محدوديت های کمی دارد و تقريبا همه چير را به نظر برنامه نويس واگذار می کند. 

اين دلايل نشان می دهند که فراگرفتن اسمبلی می تواند مفيد باشد حتی اگر هيچوقت با آن برنامه ای نوشته نشود.

امروزه توليد برنامه ای که کاملا با زبان اسمبلی باشد غير معمول است، زيرا برنامه نويسی در زبان سطح بالا بسيار ساده تر از اسمبلی است علاوه براين استفاده از اسمبلی باعث می شود حمل برنامه به کامپيوترهای مختلف دشوارتر شود. در حقيقت بندرت کسی کاملا در زبان اسمبلی برنامه می نويسد. در عوض اسمبلی برای بهينه سازی بخش های حساس برنامه و افزايش سرعت و دسترسی به سخت افزار و نوشتن برنامه های PROM استفاده می شود.

البته زبان برنامه نويسی C کيفيت منحصر به فردی در عرضه کردن مصالحه بين ساختار سطح بالا و جزئيات سطح پايين دارد. اکثر کامپايلرهای C توانائی توليد کد منبع اسمبلی را دارند. برنامه نويسان اغلب ترکيب C و اسمبلی را در برنامه های کاربردی به کار می برند.

 

ثبات ها

ثبات های 8 بیتی :

AL,AH قسمت کم ارزش = AL , قسمت پر ارزش AH

BL,BH قسمت کم ارزش = BL , قسمت پر ارزش BH

CL,CH (معروف به کانتر(شماره انداز ) ) قسمت کم ارزش = CL , قسمت پر ارزش = CH

DL,DH قسمت کم ارزش =CL , قسمت پر ارزش = CH

ثبات های 16 بیتی : AX,BX,CX,DX

 

 

سگمنت ها و آدرس دهی

یک سگمنت ناحیه خاصی است که در یک برنامه تعریف شده واز مرز پاراگراف شروع می شود

یعنی از مکانی که همواره بر ١۶ یا ١٠ شانزده شانزدهی بخش پذیر است. هر چندکه یک سمگنت

64 باشد ولی نقطه به k می تواند در هر جایی از حافظه قرار بگیرد و در حالت حقیقی می تواند تا

اندازه ای فضا لازم دارد که برنامه برای اجرا شدن به آن نیاز دارد.

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

است که آدرس مو جود در یک ثبات سگمنت مناسبی را تغییر داد. ٣ سگمنت اصلی عبارتند از

سگمنت های داده ، پشته وکد

سگمنت کد

سگمنت کد شامل دستورالعمل های ماشین است اجرا می شوند. معمولا اولین دستورالعمل اجرایی

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

سگمنت کد را آدرس دهی می ، (cs) شروع کند همانطور که از نام آن پیداست ، ثبات سگمنت کد

64 نیاز داشته باشد ، برنامه ممکن است نیاز داشته باشد که بیش k کند.اگر ناحیه کد شما به بیش از

از یک سگمنت کد را تعریف کند.

سگمنت داده ها

سگمنت داده ها شامل داده ها ، ثابت ها و نواحی کاری یک برنامه می باشد ثبات سگمنت داده ها

64 نیاز داشته باشد در k سگمنت داده ها را آدرس دهی می کند . "اگر ناحیه داده به بیش از (DS)

برنامه می توانید بیش از یک سگمنت داده را تعریف کنید ".

سگمنت پشتر

به زبان ساده ، پشتر حاوی هر گونه داده و آدرسی است که برای ذخیره موقت و یا جهت استفاده

سگمنت پشتر را آدرس (ss) توسط زیر روال های فراخوانی شده لازم است . ثبات سگمنت پشته

دهی می کند.

حدود یک سگمنت

یک ثبات سگمنت حاوی آدرس شروع یک سگمنت می باشد همانطور که قبلا ذکر شد یک

سگمنت بر روی مرز پارا گراف شروع می شود که آدرسی است که همواره بر ١۶ تقسیم پذیر است

088 شروع می شود در نظر بگیرید چون دراین مورد EOH یک سگمنت داده را از مکان حافظه

وتمام موارد دیگرراستی ترین رقم شانزده شانزدهی برابر صفر است طراحان کامپیوتر تشخیص

038E 038 به صورت EOH دادند که ذخیره کردن رقم صفر درثبات سگمنت لازم نیست . لذا

ذخیره می شود که صفر سمت راست آن بدیهی است. در این کتاب هر جا لازم باشد از کروشه ها

038 استفاده خواهد شد. [ برای اشاره به سمت راست ترین صفر ما نند [ 0

آفست های سگمنت

در داخل یک برنامه مکان های حافظه نسبت به آدرس شروع سگمنت بیان می شوند فاصله بایتی

از آدرس سگمنت تا یک مکان دیگر در داخل همان سگمنت به صورت یک آفست (جا بجایی)

یا از صفر تا 65,535 FFFFH 0000 تا H بیان می شود. محدوده یک افست ٢بایتی می تواند از

باشد. بنابراین اولین بایت سگمنت که در آفست 00 ، دومین بایت در آفست 01 الی آخر تا آفست

65535 قرار می گیرند برای مراجعه به هر مکان حافظه در یک سگمنت ، پردازنده آدرس سگمنت

موجود در یک ثبات سگمنت را با یک مقدار افست ترکیب می کند.

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

0032 بایت در H 038 می باشد ویک دستور العمل به مکانی با آفست E[o]H سگمنت داده ها یعنی

داخل سگمنت داده ها مراجعه می کند.

پسند شده توسط 1 کاربر

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

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

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !


ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید


ورود به حساب کاربری