Assembler proqramlaşdırma dili

Segmenləri təyin edən direktivlər

Segmenləri təyin edən direktivlər

Assembler proqramı bir və ya bir neçə seqmentdən ibarət olur. Əmrlərin olduğu sahə yaddaşda kodlar (əmrlər) seqmenti, verilənlər yerləşdirilən yaddaş sahəsi verilənlər seqmenti və stek üçün ayırılmış yaddaş sahəsi - stek seqmenti adlanır. Mikroprosessorda hər bir seqment üçün uyğun seqment registrləri mövcudur. Bildiyimiz kimi informasiyanın emalı üçün aşağıdakı 6 seqment registlərindən istifadə edə bilərik:

CS – əmrlər seqmenti;

SS – stek seqmenti;

DSESFSGS verilənlər seqmentləri.

Ümumiyyətlə, assemblerdə proqramın həcmindən asılı olaraq proqramlar bir və ya bir neçə seqmentdə təşkil edilə bilər. Hər bir seqment ‘SEGMENT’ sözü ilə başlayaraq ‘ENDS’ sözü ilə qurtara bilər. Bu halda seqmenti aşağıdakı kimi təyin edə bilərik:

Segmentin_ adı SEGMENT [K] [N] [M] [L] …

Direktivlər, əmrlər, makroəmrlər, kommetariyalar

Segmentin_ adı ENDS

Burada Segmentin_ adı – məcburi parametr olub seqmentin ünvanını almaq və həmçinin seqmentlər qrupunda seqmentləri kombina etmək üçün istifadə edilən nişandır. Ondan həm də seqmentlərin bir qrupda birləşdirilməsi zamanı istifadə edirlər. SEGMENT-in başqa parametrləri məcburi deyil. Burada

K – düzlənmə tipini ;

N –əlaqə tipini;

M –seqmentin sinfini;

L –seqmentin ölçüsünü təyin edən tipi göstərir.

Əvvəlcə verilənlər seqmentinə aid sadə misal göstərək:

Data_seg SEGMENT
A       DB  56
BB     DB ?
MAS  DB  9,7,5,4,5DUP(3)
Data_seg  ENDS

Qeyd etmək lazımdır ki, seqment təkcə proqramı kodlar, verilənlər və steklərə bölmək üçün deyil, o, daha geniş funksional təyinatlara malikdir. Seqment (bölüm) modul proqramlaşdırması konsepsiyası ilə bağlı olan ümumi mexanizmin əsas hissəsidir. O müxtəlif proqramlaşdırma dillərinin kompilyatorları tərəfindən yaradılan obyekt modullarının unikal təşkilinə imkan verir. Bu isə müxtəlif proqramlaşdırma dillərində yazılmış proqramları birləşdirməyə imkan yaradır. Müxtəlif varianların belə birləşdirilməsi üçün SEGMENT direktivində bir sıra operandlar nəzərdə tutulub. Bunları ətraflı nəzərdən keçirək:

Düzlənmə tipi kimi MempagePagePareWordDWordByte kimi atributlar götürülə bilər. Düzlənmə tipi bölümün hansı ünvandan başlandığını təyin edir. Bu parametr ona görə vacibdir ki, düzlənmənin düzgünlüyündən asılı olaraq MP verilənlərə müraciəti daha sürətlə icra edir.

Mempage –tipli bölümün başlanğıc ünvanının axırıncı 3 rəqəmi ‘000H’ ilə qurtarır. Yəni, ünvan 4kb –a qalıqsız bölünməlidir ( növbəti yaddaş səhifəsinin ünvanı 4kb səhifə sərhəddinə tamamlanır).

Page - tipli bölümün başlanğıc ünvanının axırıncı 2 rəqəmi ‘00H’ ilə qurtarır. Ünvan 256–ya qalıqsız bölünür (256 bayt ölçülü səhifə sərhəddinə tamamlanır).

Para - tipli bölümün başlanğıc ünvanının axırıncı rəqəmi ‘0H’ ilə qurtarır. Yəni, ünvan 16–ya qalıqsız bölünür (paraqraf sərhəddinə tamamlanır).

Dword – bölümün başlanğıc ünvanı 4 bölünən olmalıdır (ikiqat söz sərhəddinə tamamlanır).

Word - bölümün başlanğıc ünvanı 2–yə qalıqsız bölünən olmalıdır.

Byte –bölüm yaddaşın ixtiyarı ünvanından başlayır.

Susmaya görə düzləmə tipi kimi Para götürülür.

Əlaqə tipi, əlaqələr redaktoruna (LİNK.EXE və TLİNK.EXE proqramı) eyni adlı bölümlərin necə əlaqələndirilməsi haqqında məlumat verir. Əlaqə tipi kimi PrivatePublicCommonStac götürülə bilər.

Private –tipli əlaqə zamanı eyni adlı bölümlər by moduldan kənarda birləşmir. Alınan yeni bölüm tam və kəsilməz olacaq.

Public –tipli əlaqə ilə bütün eyni adlı bölümlər Link mərhələsində birləşdilir. Bütün əməliyyatlar bu bölümün başlanğıcına nəzərən aparılacaq.

Common – tipli əlaqə ilə Link mərhələsində eyni adlı bölmələr üçün eyni ünvandan yer ayrılır. Bölümün ölçüsü ən böyük bölümə uyğun təyin edilir. Belə üsul ilə bəzən overley proqramlar tərtib edilir.

Stac – tipli əlaqə bölmünlərin icra mərhələsində birləşəcəyini təyin edir. Bu tip əsasən Exe genişlənməli fayllardan istifadə edilir. Əməliyyatlar SS registrindəki ünvana nəzərən aparılır.

M – bölümün CodeData və Extra siniflərindən birinə aid olduğunu göstərir və onlar apastrof arasında yazılırlar. Proqram bir neçə molulların bölümlərindən ibarət olduqda əlaqələr redaktoruna uyğun bölümlər ardıcıllığını təyin etməkdə kömək edir. Əlaqələr redaktoru eyni adlı sinifləri bir ünvandan başlayaraq birləşdirir.

L –atributu bölümlərin ölçü atributudur və Use16 və ya Use32 kimi təyni edilə bilər. İ80386-dan başlayaraq bölümlər 16 və ya 32 mərtəbəli ola bilərlər. Bu həm bölümlərin ölçüsünə, həm də seqment daxilində fiziki ünvanın tərtib dərəcəsinə təsir göstərir.

Use16 – onu göstərir ki, bütün əmrlər və ünvanlar bu bölümlərdə 16 mərtəbəlidir. Yəni, fiziki ünvanın yaranmasında yalnız 16 mərtəbəli sürüşmədən istifadə edilir. Buna uyğun olaraq da bölümlər 64 kb qədər ola bilər.

Use32 –onu göstərir ki, bütün əmrlər və ünvanlar bu bölümlərdə 32 mərtəbəlidir. Yəni, fiziki ünvanın yaranmasında 32 mərtəbəli sürüşmədən istifadə edilir. Buna uyğun olaraq da bölümlər 4 qb-yə qədər ola bilər.

Məsələn:

Data_seg SEGMENT

A            DB      56

BB           DB ?

MAS      DB   9,7,5,4,5DUP(3)

Data_seg ENDS

Göründüyü kimi Segment direktivinin yazılışında bölümlərin hansı seqment registrinə görə ünvanlaşacağı assembler translyatoruna bildirilmir. Verilənlərin hansı seqment registrinə görə ünvanlaşacağı aşağıdakı direktiv ilə təyin edilir.

Assume A: B [ , ... ]

Assume A : Nothing [ , .. ]

Burada Aseqment registrindən birini (CS, DS, ...);

isə Segment direktivdərinin (Code, Date, ...) adını göstərir.

2 –ci yazılış isə seqment registri üçün əvvəlki seqmentləri ləğv edir. Məsələn:

Assume DS : Date – direktivi Date seqmentindəki verilənlərə müraciət etdikdə verilənlərin baza ünvanı kimi DS –in məzmunun götürülməsinə göstərişdir. Assume direktivi, proqramda əmrlər seqmenitini göstərən Segment direktivindən sonra gəlir. Başlanğıc qiymətlər seqment registrlərinə assembler əmrlərinin köməyi ilə mənimsədilir (CS seqment registrinin başlanğıc qiymətini ƏS təyin edir). Məsələn:

Sseg segment stack    

            db 256 dup(?)    

top_of_stack dw ?

sseg ends

message db "Bu programi TD.EXE sazlayicisi ile yoxla $"

dey_1 db 0ffh

dey_2 dw 3a7fh

dey_3 dd 0f54d567ah

mas   db 10 dup(" ")

unv dw   dey_3

tam_unv   dd dey_3

dat   ends

ext   segment

t   dw 50 dup(0)

ext   ends

cod   segment para public 'code'

      assume cs:cod,ss:sseg,ds:dat,es:ext 

start proc far

              push ds

              push ax

              mov ax,dat

              mov ds,ax

              mov ax,sseg

              mov ss,ax

              mov ax,ext

              mov es,ax

              mov sp,offset top_of_stack

              call main ret  

              start endp

              main proc near

              mov ah,9h

              mov dx, offset message

              int 21h

              mov ax,4c00h

              int 21h

              ret

      main endp

      cod ends

         end start