Assembler proqramlaşdırma dili

İdarənin ötürülməsi əmrləri

İdarənin ötürülməsi əmrləri

Əksər proqramlarda əmrlərin xətti icra ardıcıllığı pozulur. Yəni cari əmrin icrasından sonra, tələbdən asılı olaraq (xətti icra ardıcıllığını pozaraq), idarəni proqramın bu və ya digər əmrinə göndərmək lazım gəlir. Bu cür prosesləri idarə etmək üçün mikroprosessorun idarənin ötürülməsi əmrlərindən istifadə olunur. Proqramda mikroprosessor növbəti əmrin icra olunmasını, CS:IP (USE16 ünvanlaşdırma rejimi üçün) və ya CS:EIP (USE32 - üçün) registrlər cütlüyünün məzmununa görə təyin edir.

CS registrində cari kodlar seqmentinin fiziki (baza) ünvanı yerləşir.

EIP/ IP – əmr göstəricisi registrində yaddaşdakı nöbəti icra olunacaq əmrin seqmentə nisbətən sürüşmə ünvanı göstərilir.

Proqramda keçidləri təmin edən mikroprosessor əmrlərini, işləmə prinsipinə görə üç qrupa bölmək olar:

1. Şərtsiz kedidlərin idarə əmrləri:

· şərtsiz keçid əmri;

· prosedura müraciət və prosedurdan qayıtma;

· proqram kəsilmələrinə müraciət və proqram kəsilmələrindən qayıtma.

2. Şərti keçidlərin idarə əmrləri:

· müqayisə əmrlərinin nəticəsinə görə keçid əmrləri;

· müəyyən bayraqların vəziyyətinə görə keçid əmrləri;

· ECX/CX registrinin məzmununa görə keçid əmrləri.

3. Dövrü idarə edən əmrlər:

· ECX/CX sayğac registrinə görə dövrün təşkili əmri;

· ECX/CX sayğac registrinə görə və ya əlavə şərt əsasında dövrdən yarımçıq çıxmanın təşkili əmri.

Bütün bu əmrlərdə idarənin tələb olunan yerə göndərilməsində nişandan istifadə olunur.

Nişan – müəyyən yaddaş xanasının simvolik adı olub, keçidlərin idarə olunması əmrlərində operand kimi istifadə olunur.

Dəyişənlərdə olduğu kimi Assembler translyatoru istənilən nişana üç atribut mənsub etdirir:

-nişanın təsvir edildiyi kodlar seqmentinin adını;

- nişanın təsvir edildiyi kodlar seqmentinin başlanğıcından olan baytla məsafəni ( sürüşdürməni);

-nişanın tipini və ya məsafə atributunu.

Nişanın tip atributu iki qiymət ala bilər:

-NEAR (yaxın) – bu nişana keçid yalnız nişanın yazıldığı seqment daxilində ola bilər. Fiziki olaraq bu o deməkdir ki, bu nişana kemək üçün yalnız EIP/IP registrinin məzmununu dəyişdirmək kifayətdir;

-FAR (uzaq)- bu nişana keçid, yalnız seqmentlərarası idarənin ötürülməsi nəticəsində mümkündür. Bunu həyata keçirmək üçün isə, həm EIP/IP registrinin, həm də CS registrinin məzmununu dəyişdirmək tələb olunur.

Nişanları iki üsulla təyin etmək olar:

Ad_nişan : əmr

Bu üsulun köməyi ilə nişan yalnız yaxın tip (NEAR) üçün təyin edilir. Proqramda simvolik ad yalnız bir dəfə təyin oluna bilər. Assemblerdə əmr nişanla bir sətrdə və nişandan sonrakı sətrdə yazıla bilər.

İkinci üsulda nişan LABELdirektiviindən istifadə edilməklə təyin edilirÜmumi şəkildə aşağıdakı kimi göstərilir:

nişanın _adı LABEL tipin adı

LABEL əsasən identifikatorların tipini təyin etmək üçün istifadə olunur. Məsələn, aşağıdakı nişanın yaxın tipli təsvirləri ekvivalentdir:

nishan:

MOV AX, K1

nishan LABEL NEAR
MOV AX, K1
MOV AX,K1 - əmrinə bu kod seqmenti ilə eyni zamanda yüklənən seqmentlərdən müraciəti təşkil etmək üçün, onun nişanını PUBLIC direktivi ilə təyin etmək və LABEL direktivində isə FAR tipi ilə göstərmək lazımdır

...
PUBLIC    nish_far  	; xarici proqramlar üçün 
;görünən etmək
...
nish_far LABEL  FAR   ; nish_far nishanını uzaq tiplə
           ;təyin etmək
nish_near:                         ; nish_near nishanını yaxın tiplə
                                           ;təyin etmək 
       MOV   AX,K1

mov AX, K1 əmri üçün iki nişan təyin etməklə, ona həm bu seqmentdən, həm də digər seqmentlərdən müraciəti təşkil etmək olar.

LABEL direktivinin köməyi ilə eyni yaddaş sahəsindən müxtəlif tipli verilənlər üçün istifadəni təşkil etmək olar. Məsələn:

      ...
      n_b  LABEL BYTE
      n_w   DW  15 DUP (?)
      ...

Bu proqram fraqmentində LABEL direktivi ilə hər iki n_b və n_w identifikatorları üçün bir yaddaş sahəsi ayrılmışdir və müxtəlif nişanlardan istifadə etməklə həmin sahəni baytlar massivi kimi, ya da sözlər massivi kimi işlədə bilərik. Məsələn

 MOV   n_b + 10,AL     ;(AL) –in məzmunu n_b  
			; yaddaş sahəsinin 11 baytına  göndərilir
MOV n_w, AX   ;(AX)-in məzmunu n_w yaddaş
			;sahəsinin birinci sözünə göndərildi

Keçid əmrləri EIP/IP əmrlər göstəricisi registrini və bəzi hallarda, hətta CS kodlar seqmenti registrini modifikasiya edir. Hansı regstrin modifikasiya olunacağı aşağıdakı amillərdən asılıdır:

- şərtsiz keçid əmrində operandın tipindən (yaxın və ya uzaq);

- keçid ünvanının (keçid əmrindəki) əvvəlində modifikatorun göstərilməsindən; bu zaman keçid ünvanının özü bilavasitə əmrdə (birbaşa keçid), ya registrdə və ya yaddaş xanasında (dolayı keçid) ola bilər.

Modifikator aşağıdakı qiymətləri ala bilər:

NEAR PTR - cari kodlar seqmenti daxilindəki nişana birbaşa keçidi göstərir. Bu halda ancaq EIP/IP registri (kodlar seqmentinin USE16 və ya USE32 tipindən asılı olaraq) modifikasiya edlir.

FAR PTR - başqa kodlar seqmentindəki nişana birbaşa keçidi göstərir. Aydındır ki, bu halda keçidin ünvanı bilavasitə operand və ya ünvan (nişan) kimi verilir və 16 bitlik selektordan, Sürüşmənin ölçüsü 32 və ya 16 bitdir. Bunlar isə uyğun olaraq CS və EİP/İP registrlərinə yüklənir.

WORD PTR – cari kodlar seqmenti daxilindəki nişana dolayı keçidi göstərir. Yalnız EIP/IP registrinin qiymətini (əmrdə göstərilən ünvan və ya registr ilə təyin olan yaddaşdakı sürüşmənin qiyməti ilə) modifikasiya edir. Sürüşmənin ölçüsü 32 və ya 16 bitdir.

DWORD PTR- başqa kodlar seqmentindəki nişana dolayısı ilə keçidi göstərir. Hər iki CS və EIP/IP registrlərinin qiymətini (qiymət yalnız yaddaşda və ya registrdə ola bilər) modifikasiya edir. Bu ünvanın birinci sözü və ya ikiqat sözü sürüşməni təsvir edir və IP və ya EIP registrlərinə yüklənir; ikinci və ya üçüncü söz isə CS registrlərinə yüklənir.