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

 

هر برنامه شامل يک يا چند سگمنت است. هنگامی که برنامه دارد اجرا می شود ثبات های سگمنت به سگمنت های جاری اشاره می کنند. چهار سگمنت را در آن واحد می توان داشت؛ کد، داده، پشته و ‌اضافی. در مد حقيقی هر سگمنت حداکثر 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

 

پردازنده 8086 دارای 14 ثبات 16 بيتی با کاربردهای متفاوت است. اين ثبات ها را می توان به صورت زير گروه بندی کرد:

1. ثبات های همه منظوره : AX، BX، CX و DX
2. ثبات های ايندکس : SIو DI
3. ثبات های آدرسی : BP،SP و IP
4. ثبات های سگمنت : CS، DS، SS و ES
5. ثبات های وضعيتی : Flag

دیاگرام ثبات های ۸۰۸۶

 

 

پردازنده های 80286 به بعد دارای دو مد حقيقی (real mode) و محافظت شده (protected mode) براي اجرا هستند. تعاريف سگمنت داده شده در قسمت بالا بر اساس مد حقيقی است.

در مد حقيقی پردازنده مانند 8086 عمل می کند. ارجاع به حافظه توسط يک آفست 16 بيتی درون يک سگمنت تعيين می شود. آدرس فيزيکی 20بيتی طبق فرمول آفست + 16×سگمنت بدست می آيد. به اين طريق تا يک 1MB حافظه قابل آدرس دهی است. اما در هر لحظه فقط تا 64KB را می توان آدرس داد. در اين حالت يک برنامه به هر آدرسی از حافظه دسترسی دارد حتی حافظه برنامه های ديگر که باعث می شود اشکالزدائی و امنيت بسيار دشوار بشود.

کليه برنامه های تحت DOS در مد مجازی اجرا می شوند.

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

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

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