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