تماس درباره   صفحه اصلی
  زبان اسمبلی > مقدمه  
 
 

مقدمه


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

مقايسه زبان اسمبلی و زبان های سطح بالا
زبان ماشين
زبان اسمبلي چيست؟
اسمبلر
هدف از یادگيری زبان اسمبلی


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

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

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

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

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


زبان ماشين

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


مثال 1. اعداد دودئی زير يک دستورالعمل ماشين اينتل است که عدد 5 را در ثبات AL قرار می دهد.

1011 0000 0000 0101

مثال 2. دستور زير ثبات های EAX و EBX را جمع کرده و حاصل را در ثبات EAX ذخيره کند.

0000 0011 1100 0011

هر دستورالعمل زبان ماشين شامل کد منحصر بفردی دارد که کدعملياتی (Operation Code) يا Opcode ناميده می شود. Opcode هميشه در ابتدای دستورالعمل قرار می گيرد. اکثر دستورات شامل داده هم هستند که توسط دستورالعمل استفاده می شود و عملوند (Operand) نام دارند.

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


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

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

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


مثال 1. کلمه mov نمادی برای عمل انتقال داده است. دستور اسمبلی زير جمع ثبات AL و عدد 5 را نشان می دهد.

mov AL,5

مثال 2. کلمه add يک نماد برای دستورالعمل جمع است. دستور جمع ثبات های EAX و EBX به صورت زير نوشته می شود.

add EAX, EBX

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

مثال 3. دستوری که عملوندی ندارد و فلگ carry را صفر می کند.

clc

مثال 4. دستور زير عدد يک را به ثبات AX اضافه می کند.

inc AX

مثال 5. دستور جمع مقدار متغير Count با محتوای ثبات به صورت زير است.

mov AX,Count

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

mnemonic operand(s)

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

• ثبات. عملوندهائی که مستقيما به محتوای ثبات های پردازنده مراجعه می کنند. مانند ثبات AL در مثال 1.
• متغير يا حافظه ای. عملوندهائی که به داده ای در حافظه اشاره دارند. مانند متغير Count در مثال 5.
• فوری. اين عملوندها مقادير ثابتی هستند که در داخل دستورالعمل قرار می گيرند. در مثال 1عدد 5 يک عملوند فوری است.
• ضمنی. عملوندهائی که صريحا در دستور ذکر نمی شوند. در مثال 4عدد يک با ثبات AL جمع می شود. عدد يک عملود ضمنی است.


اسمبلر

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

يک تفاوت مهم ديگر بين اسمبلی و زبان های سطح بالا اين است که هر نوع 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 و اسمبلی را در برنامه های کاربردی به کار می برند.


 


 


صفحه اصلی| PDF| درباره| تماس