close
دانلود فیلم
راهنماهای سگمنت

زبان اسمبلی

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


 

مقدمه

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

 

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

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

اسمبلر چیست؟

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


 

 سیستم های عددی

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

جدول توان های 2

تبدیل باینری به اعشاری

جمع اعداد باينری

هگزا دسیمال و تبدیلات آن

جمع اعداد در هگزا دسیمال


 

نمایش داده ها

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

نمايش اعداد صحيح - روش علامت مقدار

روش نمايش مکمل2

جدول تعداد بيت ها و محدوده مقادير ممکن داده های عددی صحيح علامت دار به روش مکمل2

محاسبات در مکمل2

کاهش و افزايش طول داده


 

ساختمان کامپیوتر

يک سيستم کامپيوتری ترکيب کاملي از سخت افزار و نرم افزارهای سيستمی است که باعث می شود ماشين مفيد و وظيفه مندي برای کار معينی بشود.

اجزای اصلی سخت افزار يک ريز کامپيوتر شامل:

• پردازنده مرکزی
• حافظه
• صفحه کليد به عنوان ورودی
• صفحه نمايش به عنوان خروجی
• يک يا چند ديسک درايو برای ذخيره برنامه ها و داده ها

حافظه

پردازنده و انواع آن


پردازندهای اینتل

با توجه به اينکه دستورات اسمبلي 8086 در قسمت ها آينده بررسي مي شوند، در اين صفحه با نحوه آدرس دهي حافظه و ثبات هاي اين پردازنده آشنا خواهيد شد.

دیاگرام پردازنده های اینتل

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

مدهای اجرا

مجموعه ثبات ها

توضیحات ثبات ها


 

Debug

برنامه Debug محيطی برای بررسی فايل های مقصد دودوئی و اجرائی است. برنامه امکان انجام تغييرات جزئی در يک برنامه اجرائی را فراهم می کند بدون اينکه نياز به دوباره اسمبل کردن آن باشد.

برنامه Debug

دستورات Debug


 

دستورات اسمبلی

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

دستورات انتقال داده

دستورات گسترش داده

دستورات جمع و تفريق

دستورات ضرب و تقسيم

دستورات منطقی

ساختارهای حلقه تکرار

زيربرنامه

وقفه ها

پشته

دستورات کنترل CPU


 

برنامه نویسی

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

مدل حافظه

راهنماهای سگمنت

ثابت ها و متغيرها

برنامه اصلی

اسمبل و اجرای برنامه


 

ماکرو

ماکرو مجموعه ای از دستورات است که مشابه زيربرنامه يکبار نوشته می شود و چندين بار استفاده می شود.

ماکرو (macro) نام مخففی برای مجموعه ای از دستورالعمل ها، راهنماها يا ماکروهای ديگر است که يکبار نوشته می شود و به هر تعداد دفعات لازم قابل استفاده است.

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

ماکرو

تعريف ماکرو

کتابخانه ماکرو


 

پشته

پشته يک ليست LIFO است که می تواند به عنوان محلی مناسب برای ذخيره داده های موقتی استفاده شود. پشته برای فراخوانی زيربرنامه ها، ارسال پارامترها و متغيرهای محلی هم به کار می رود. دستورات ابتدائی پشته push و pop هستند.

پشته

تعريف پشته در برنامه

دستورات push و pop

ثبات SP


 

زیر برنامه

زير برنامه (procedure) مجموعه ای از دستورات است که يکبار تعريف و به دفعات استفاده می شود. با بکارگيری زيربرنامه خوانائی برنامه بالاتر رفته و از تکرار دستورات مشابه جلوگيری می شود. علاوه براين اشکال زدائی و تغيير برنامه آسان تر انجام گيرد.

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

زيربرنامه

زيربرنامه های near و far

دستورات فراخوانی و بازگشت زيربرنامه

ارسال و دريافت پارمترها


 

وقفه ها

گاهی اوقات جريان عادی اجرای يک برنامه برای پردازش رويدادی که نياز به پاسخ سريع دارد متوقف می شود. سخت افزار کامپيوتر برای مديريت اين رويدادها مکانيسمی به نام وقفه (interrupt) را دارد.

مثال. وقتی mouse حرکت می کند، سخت افزار mouse برنامه جاری را متوقف می کند تا حرکت mouse گرفته شود( برای حرکت مکان نمای mouse روی صفحه نمايش).

وقتی CPU يک سيگنال وقفه را تشخيص می دهد، فعاليت جاری خود را متوقف می کند و روتين خاصی را فراخوانی می کند که روتين وقفه (interrupt handler) نام دارد. اين روتين علت وقوع وقفه را تشخيص می دهد و عکس العمل مناسب را انجام می دهد.

بيشتر روتين های وقفه بعد از پايان يافتن کنترل اجرا را به برنامه متوقف شده بازمی گردانند. آنها کليه مقادير ثبات ها را به وضعيت قبل از توليد وقفه بر می گردانند. بنابراين برنامه متوقف شده به گونه ای به اجرا ادامه می دهد که هيچ اتفاقی نيافتاده است به جز اين که سيکل های CPU را از دست می دهند.

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

انواع وقفه

دستورالعمل int

جدول بردار وقفه


 

پورت ها

درحال آماه سازی


 

دستورات ۸۰۸۶

درحال آماه سازی


 

 

 

با نظرات خود ما را یاری کنید

 

 

هر برنامه شامل يک يا چند سگمنت است. هنگامی که برنامه دارد اجرا می شود ثبات های سگمنت به سگمنت های جاری اشاره می کنند. چهار سگمنت را در آن واحد می توان داشت؛ کد، داده، پشته و ‌اضافی. در مد حقيقی هر سگمنت حداکثر 64KB است. البته معمولا برنامه ها کمتر از 64KB را استفاده می کنند. اسمبلر اندازه سگمنت را بر اساس تعداد بايت های مورد استفاده سگمنت تنظيم می کند. بنابراين اگر برنامه ای برای نمونه تنها 10KB برای ذخيره داده نياز دارد سگمنت داده 10KB می شود نه 64KB.

برنامه های .exe سه سگمنت اول را بايد داشته باشند.

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

وقتی اجرای برنامه آغاز می شود سيستم عامل دو ثبات سگمنت CS و SS را برای اشاره به کد برنامه و سگمنت پشته مقداردهی می کند. برای دسترسی به سگمنت داده ثبات ds بايد حاوی آدرس سگمنت داده باشد. قبل از دسترسی به هر داده ای برنامه بايد آدرس سگمنت را در ثبات DS ذخيره کند.

سگمنت ها در برنامه اسمبلی توسط راهنماهای segment و ends مشخص می شوند. يک سگمنت به فرم کلی زير مشخص می شود:

segmentname segment {READONLY} {align} {combine} {use} {'class'}
      <statements>
segmentname ends

segmentname شناسه ای است که نام سگمنت معين می کند. نام سگمنت برای بدست آوردن آدرس آنها توسط اسمبلر استفاده می شود. نام سگمنت بايد در راهنمای ends هم مشخص شود.

align می تواند يکی از کلمات byte، word، dword، para يا page باشد. اين پارامتر مشخص می کنند سگمنت در محدوده بايت، کلمه، کلمه مضاعف، پاراگراف يا صفحه بار شود. اگر بايت باشد سگمنت از اولين بايت آزاد بعد از آخرين سگمنت ذخيره می شود. اين فيلد می تواند حذف شود. پيش فرض پاراگراف است. پاراگراف مضربی از 16 بايت است.

فيلد combine ترتيبی را که سگمنت های هم نام در فايل مقصد توسط اسمبلر نوشته می شوند را کنترل می کند و می تواند يکی از کلمات public، stack، common يا memory باشد. نوع stack برای سگمنت های پشته و public برای بقيه سگمنت ها استفاده می شود.


مثال.

DSEG    segment
Item1   byte   0
Item2   word   0
DSEG    ends

CSEG    segment
      mov   AX, 10
      add   AX, Item1
      ret
CSEG    ends


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


مثال. دستور زير آدرس سگمنت داده را در ثبات DS قرار می دهد.

mov   AX, dseg   ;Loads AX with segment address of dseg.
mov   DS, AX      ;Point ds at dseg.


راهنماهای .stack، .data و .code راهنماهای ساده شده سگمنت هستند که محل شروع سگمنت های پشته، داده و کد را مشخص می کنند. راهنمای .stack فضائی را برای پشته برنامه رزرو می کند. اندازه پشته در مقابل آن ذکر می شود. پيش فرض مقدار پشته 512 بايت درنظر گرفته می شود.

سگمنت ها به ترتيبی که در برنامه تعريف شده اند در حافظه بار می شوند.

ساختار کلی يک برنامه

SSeg    SEGMENT PARA
   DW 32 dup(0)
SSeg   ENDS
DSeg   SEGMENT PARA
   ;declarations
DSeg   ENDS
CSeg   SEGMENT PARA
   Main PROC FAR
      ASSUME SS:SSeg, DS:DSeg, CS:CSeg
      mov AX,DSeg
      mov DS,AX
      ...
      mov AX,4c00h
      int 21h
   Main ENDP
CSeg   ENDS
END Main

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

        .MODEL small
        .STACK [size]
        .DATA
   ;declarations
        .CODE
Main:
   mov AX,@Data
   mov DS,AX
   ...
   mov AX,4c00h
   int 21h ;return to DOS
END Main


نکته. ابتدای هر برنامه اسمبلی بايد آدرس سگمنت داده در ثبات DS قرار گيرد.


مثال. برنامه first.asm برای نمايش پيغام روی صفحه.

; First.asm
;
        .MODEL small
        .STACK [size]
        .DATA
message db "Hello world, I'm learning Assembly !!!", "$"
        .CODE
main PROC
   mov AX,seg message
   mov DS,AX
   mov AH,09
   lea DX,message
   int 21h
   mov AX,4c00h
   int 21h ;return to DOS
main ENDP
END main

به کانال تلگرام سایت ما بپیوندید