Assembler proqramlaşdırma dili

Ünvanların və göstəricilərin göndərilməsi

Ünvanların və göstəricilərin göndərilməsi

Assembler proqramının tərtib olunması zamanı yaddaşda olan operandların ünvanlarından istifadə etmək tələbi yaranır. Bu əməliyyatı aparmaq üçün aşağıdakı xüsusi əmrlər qrupundan istifadə olunur:

LEA ( Load Effective Address), LDS (Load pointer using DS), LES (Load pointer using ES), LGS (Load pointer using GS i80386), LFS (Load pointer using FS i80386), LSS (Load pointer using SS).

LEA əmri aşağıdakı yazılış formatına malikdir:

LEA qəbuledici, mənbə

Qəbuledici kimi 16 və ya 32 mərtəbəli ümumi təyinatlı registrlər, mənbə kimi isə yaddaş xanasının ünvanı götürülür. Əmr icra olunarkən mənbənin (yaddaş xanasının) effektiv (icra) ünvanı hesablanır və qəbuledicidə yerləşdirilir. Mənbə WORD (16 -bit) və ya DWORD (32 -bit) atributuna malik olmalıdır.

Operandların seçilməsidə aşağıdakı mühüm amillərə fikir vermək vacibdir:

1. Əgər 16 mərtəbəli registrə (qəbulediciyə) 32 mərtəbəli sürüşməni (mənbəni) yükləməyə cəhd olunarsa, mənbənin böyük 16 mərtəbəsi itəcək;

2. Əgər 32 mərtəbəli qəbulediciyə 16 mərtəbəli ünvanı (mənbəni) yükləməyə cəhd olunarsa, qəbuledicinin böyük 16 mərtəbəsi sıfırlarla dolacaq.

LEAəmri də MOV əmri kimi göndərmə əməliyyatını yerinə yetirir. Ancaq LEAəmri MOV əmrindən fərqli olaraq veriləni deyil, mənbə-operandda göstərilən verilənin effektiv ünvanını (başqa sözlə, verilənlər seqmentin başlanğıcına nəzərən verilənin sürüşməsini) qəbulediciyə göndərir.

Misallar:

1) LEA BP, mem

yaddaşdan sürüşməni (mem-in effektiv ünvanını) 16 mərtəbəli BP registrinə yükləyir.

2) LEA EBP, mem

yaddaşdan sürüşməni (mem-in effektiv ünvanını) 32 mərtəbəli EBP registrinə yükləyir

OFFSET operandlı MOV əmrindən fərqli olaraq LEA əmrindəki mənbə operand daha mürəkkəb ünvanlaşdırma metodu ilə məsələn, bazaya görə indekslənmiş şəkildə verilə bilər:

LEA   AX, K1             ;   K1-in effektiv ünvanı 
                         ; AX registrinə yüklənir
MOV  DI, 8
LEA   BX, K1[ DI]        ; BX registrinə K1+8
                         ;  sürüşmə ünvanı yüklənir. 

Çox vaxt hər hansı əməliyyatı proqramda yerinə yetirdikdə verilənin effektiv ünvanının qiymətini bilmək kifayət etmir. Yəni, verilənin tam göstəricisini (vektor) bilmək tələb olunur. Verilənin tam göstəricisi dedikdə blokun nömrəsi və başlanğıca nəzərən sürüşmə nəzərdə tutulur. Ünvanların göndərilməsi qrupuna daxil olan qalan bütün əmrlər bir cüt registrin köməyi ilə operandın yaddaşdakı tam ünvan göstəricisini təyin etməyə imkan verir. Bu əmrlər eyni yazılış formasına malikdir:

LDS qəbuledici, mənbə

LES qəbuledici, mənbə

LGS qəbuledici, mənbə

LFS qəbuledici, mənbə

LSS qəbuledici, mənbə

Aydındır ki, mnemokodun yazılışındakı DS, ES, GS, FS, SS seqment registrlərinin adının göstəricisidir və bunlara cari seqmentin baza (blokun nömrəsi) ünvanı yüklənir. Yəni, 16 mərtəbəli seqment ünvanı (blokun nömrəsi) LDS əmri ilə DS registrinə, LES əmri ilə ES registrinə, LGS əmri ilə GS registrinə, LFS əmri ilə FS registrinə, LSS əmri ilə SS registrinə yüklənir. Üyğun olaraq sürüşmələr (mənbə - operanddan asılı olaraq 16 və ya 32 – mərtəbəli verilənlər) qəbuledicidə göstərilən ümumi təyinatlı registrlərə yerləşdirilir.Bu zaman qəbuledici kimi göstəricisini almaq istədiyimiz operandın yaddaşdakı adından birbaşa istifadə etmək olmaz. Bunun üçün əvvəlcə openrandın tam göstəricisini (yəni,yaddaşın ayrılması və ya inisiallaşdırılması direktivləri ilə təyin olunmuş dəyişənin adını DD direktivində operand kimi göstərməklə) almaq lazımdır. Sonra isə tam göstəricinin adını ünvanların göndərilməsi əmrlərində (LDS, LES, ...) mənbə kimi istifadə edə bilərik.

Dəyişənin ünvanının necə formalaşması dəyişən üçün ehtiyat yaddaş sahəsinin ayırılması və inisiallaşdırılması direktivlərinin seçilməsindən asılıdır. Əgər bu DW direktivi ilə təyin olunubsa, onda yaddaş ancaq 16 mərtəbəli effektiv ünvanın qiyməti, əgər, DD direktivi ilə təyin olunubsa, tam yaddaş ünvanın qiyməti kimi təyin olunur. Bu ünvanın yaddaşda yerləşməsi aşağıdakı kimi olacaq: kiçik sözdə sürüşmə, böyük 16 mərtəbədə isə blokun nömrəsi yerləşdirilir.

Məsələn:

perem_1    DB    0FFh
perem_2    DW  3A7Fh
perem_3    DD  0F54D567Ah
mas         DB  10 DUP (“  “)
adr          DW  perem_3
adr_full      DD   perem_3

Bu fraqmentdə adr dəyişəninə perem_3-ün sürüşmənin, adr_full dəyişəni isə verilənin tam (vektor) göstərici yüklənir.

Misallar:

LSS SI, myword

myword dəyişənin baza ünvanı SS seqment registrinə yüklənir sürüşməsinin qiyməti isə Sİ registrinə yüklənir.

LSS ESI, mydblword

mydbword dəyişəninin baza ünvanı SS seqment registrinə

yüklənir sürüşməsinin qiyməti isə ESİ registrinə yüklənir.

LES DI, yword

yword dəyişənin baza ünvanı ES seqment registrinə yüklənir sürüşməsinin qiyməti isə Dİ registrinə yüklənir

LES EDI, ydblword

ydbword dəyişənin baza ünvanı ES seqment registrinə yük­lənir sürüşməsinin qiyməti isə EDI registrinə yüklənir

Simvolların dövrü emalı ilə işlədikdə, onun başlanğıc ünvanını hər hansı registrdə yeləşdirmək və dövrün elementlərinə ardıcıl müraciət etmək üçün bu qiyməti modifikasiya etmək daha əlverişli olur. Aşağıdakı proqram fraqmentinin listinqində str_1 baytlar sətrinin str_2 baytlar sətrinə köçürülməsi göstərilmişdir:

<1>  MASM
<2>  MODEL SMALL
<3>  .DATA
<4>    ...
<5>   str_l DB “Assembler–proqramlaşdırma dili”
<6>   str_2 DB 50 DUP (” ”)
<7>   full_pnt DD str_l
<8>    ...
<9>  .CODE
<10> start:
<11>   ...
<12>   LEA   SI,str_l
<13>   LEA   DI,str_2
<14>   LES    BX,full_pnt    ; str_1-in tam göstəricisi 
                                                     ; ES: [BX] cütlüyündə
<15>    MOV   SX,30; dövrün təkrarlanma sayı CX-də
<16>    m1:
<17>    MOV   AL,[SI] 
<18>    MOV  [DI],AL
<19>    INC   SI
<20>     INC   DI
<21>   LOOP  m1   ; bütün simvollar göndərilənə 
                            ; qədər dövrü m1 
                            ; nişanından təkrarlamaq
<22>   ...
<23>   END start

Proqramın 12 və 13 sətrlərində SI və DI registrlərinə str_1 və str_2 dəyişənlərinin effektiv ünvanlarının qiyməti yüklənir. Sətr 14-də yaddaşda verilənin tam göstəricisini almaq üçün LES əmri ES registrinə blokun nömrəsini, BX-ə isə sürüşməni yükləyir. 17,18 sətrlərdə növbəti baytın bir sətrdən o biri sətrə köçürülməsi yerinə yetirilir. Sətrlərdə baytların mövqe göstəriciləri SI və DI registrlərinin məzmunu ilə müəyyən olunur. 18 və 19 sətrlərində növbəti baytları köçürmək üçün INC əmri ilə SI və DI registrlərinin məzmunları bir vahid artırılır. Bundan sonra bütün elementləri köçürmək üçün dövrü davam etdirmək lazımdır.