Assembler proqramlaşdırma dili

Massivin elementlərinə müraciətin təşkili

Massivin elementlərinə müraciətin təşkili

Massivlərlə işləyərkən massivin elementlərini kom­pü­terin yaddaşında ardıcıl yerləşdirmək lazımdır. Həmin ardıcıl baytların, massiv olma alqoritmi proqramçı tərəfindən müəyyənləşdirilir. Bu cür təşkil olunmuş yaddaş sahəsindəki verilənlərə həm birölçülü, həm də ikiölçülü massiv kimi baxmaq olar. Assembler dilində massivin indeksi kimi, sadəcə olaraq elementin yerləşdiyi ünvan başa düşülür və indekslə işləmək ünvanlarla işləmə qaydalarına əsaslanır.

Fərz edək ki, proqramda verilənlər ardıcıllığı aşağıdakı

mas DW 0,1,7,9,4,5

birölçülü massiv kimi təyin olunub. Bu ardıcıllıq DW direktivi ilə təyin olunduğundan hər bir elementin uzunluğu iki baytdır. Üçüncü elementə müraciət etmək üçün, massivin ünvanına 6 əlavə etmək lazımdır. Assemblerdə massivin elementlərinin ünvanı sıfırdan başlayaraq nömrələnir. Bilirik ki, mikroprosessora yalnız ünvanı təyin etmək lazımdır. Ümumi halda, massivin elementinin ünvanını almaq üçün, massivin başlanğıc (baza) ünvanın üzərinə elementin indeksi ilə (elementin nömrəsi çıxılsın vahid) elementin ölçüsünün hasilini gəlmək lazımdır. Beləliklə, massivin hər hansı elementinin ünvanı

baza+(indeks* elementin ölçüsü)

kimi təyin olunur.

Mikroprossesorun arxitekturasında massivlərlə işləmək üçün, çoxlu sayda proqram-aparat vasitələri mövcuddur. Bu vasitələrə, verilənlərin bir neçə ünvanlaşdırma rejimlərinin realizə edilməsinə imkan verən baza və indeks registrləri daxildir. Verilmiş ünvanlaşdırma rejimlərindən istifadə etməklə, yaddaşda massivlərlə işini səmərəli təşkil etmək olar. Bu rejimlərə aşağıdakılar aiddir:

-indeksləməklə birbaşa unvanlaşdırma rejimi.

Bu halda effektiv ünvan iki komponentlə yaradılır:

1. Sabit kimi (baza)-massivin birbaşa ünvanını ğöstərməklə (massivin başlanğıcına verilmiş identifikatorun adı şəkilində);

Dəyişən kimi (indeksli)- indeks registrinin adını göstərməklə.

Məsələn,
        mas	DW    0,1,8,7,4,5
             ... 
    MOV SI,4
    ; mas adlı massivin 3-ci elementini (8 ədədini) 
    ; AX registrində yerləşdirək:
      MOV AX,mas[SI];

-bazaya görə indeksli və miqyaslaşdırmaqla ünvanlaşdırma. Bu halda effektiv ünvan maksimum üç komponent ilə yaradılır:

1)massivin birbaşa ünvanı qismində massivin başlanğıc ünvanını ğöstərən identifikatorun adı şəkilində və ya bilavasitə qiymətlə verilən sabitdən (məcburi komponent deyil) istifadə şəkilində;

2)dəyişəndən (baza)- baza registrinin adını göstərməklə;

3)dəyişəndən (indeksli)- indeks registrinin adını göstərməklə.

Bu ünvanlaşdırma rejimlərindən ikiölçülü massivlərin emalında istifadə etmək əlverişlidir. Belə ünvanlaşdırma rejimlərindən istifadə olunmasına aid misala sonra baxılacaq.

Aydındır ki, baza registri kimi, istənilən ümumi təyinatlı registrlərdən, indeks registrləri kimi isə, ESP/SP registri müstəsinə olmaqla, istənilən ümumi təyinatlı registrlərdən istifadə oluna bilər.

Mikroprosessorun indeksi miqyaslama imkanına malikdir. Bu o deməkdir ki, indeks registrinin adından sonra vurma işarəsi (*) 2, 4 və ya 8 rəqəmləri yazılarsa, mikroprosessor indeks registrinin məzmununu bu rəqəmlərə vurmaqla miqyaslama aparır. Bu əməliyyatı apardıqdan sonra, massivin elementinin əvvəlcədən təyin olunmuş uzunluğuna görə, elementlərinin uzunluğu 2, 4 və 8 bayt olan massivin növbəti elementinin unvanını mikroprosessor avtomatik olaraq müəyyən edir. Bunun üçün tələb olunan indeksin qiymətini (0-dan hesablayaraq) indeks registrinə yükləmək lazımdır.

Miqyaslama Intel mikroprosessorunun i486 modelindən başlayaraq tətbiq olunduğundan, aşağıdakı proqramda .486 direktivindən istifadə olunub. Bu isə Assemblerə maşın əmrinin formalaşmasında mikroprosessorun yeni imkanlarından istifadə etməyə imkan verir.

Misal. Elementləri söz uzunluğunda olan massivin elementlərini sıfırla müqayisə edərək, müqayisənin nəticəsidən asılı olaraq alınan məlumatları çıxışa vermək.

; TLINK /v /3 PRG_12_2.OBJ
; / 3 opsiyası 32-bitlik ünvanlaşmanı verir 
MASM
MODEL SMALL
. STACK 256
.DATA	
	; məlumatın mətnləri:
	mes1 DB ' 0 bərabər deyil. $',0Ah,0Dh
	mes2 DB ' 0 bərabərdir $',0Ah,0Dh
	mes3 DB 0Ah,0Dh,'Element $'
	mas   DW  2,7,0,0,1,9,3,6,0,8	; İlkin massiv
.CODE 
.486                            ;mütləq göstərilməlidir
main:
MOV AX,@DATA
MOV DS,AX
XOR AX,AX ; AX  təmizləmək prepare:
MOV CX,10  ;Dövrlərin sayını CX sayğacına yükləmək 
MOV ESI,0         ; İndeksi ESI yükləmək compare:
MOV DX,mas[ESI*2] ;massivin növbəti elementi DX-də 
	                ; ESI ardıcıl olaraq 0,1,2,...,9
                      ; bunlara uyğun olaraq hasil
                      ; 0,2,4,...,18 olacaq	
CMP DX,0    ; (DX) məz-nu  0-la müqayisə etmək
JE equal         ; əgər 0 bərabərdirsə, keçid
not_equal:	;0 bərabər deyil
MOV AH,09h        ; mes3 məlumatını ekrana çıxarmaq
LEA DX,mes3
INT 21h
MOV AH,02h       ; massivin elementinin nomrəsini
                                ; ekrana çıxarmaq
MOV DX,SI
ADD DL,30h
INT 21h
MOV AH,09h
LEA DX,mes1
INT 21h
INC ESI            ;Növbəti element
DEC CX           ;Dövrdən çıxış şərti
JCXZ exit         ;CX=0? Əgər hə – onda çıxış
JMP compare   ;yox-dövrü təkrarlamaq
equal:	    ; bərabər 0
MOV AH,09h     ;mes3 sətrini ekrana çıxaran funksiya 
LEA DX,mes3
INT 21h
MOV AH,02h ;DL-dəki qiyməti ekrana çıxaran funksiy
                         ; (massivin  elementinin nömrəsi) 
MOV DX,SI
ADD DL,30h
INT 21h
MOV AH,09h   ;  mes2 sətrlərini ekrana çıxaran funksiya
LEA DX,mes2
INT 21h
INC ESI           ; növbəti element
DEC CX
JCXZ exit          ; Bütün elementlər emal olunubmu?
JMP compare
exit:
MOV AX,4C00h    ;Standart çıxış
INT 21h
END	main

Qeyd.

1. Əgər baza ünvanlaşdırmada ünvanı yazmaq üçün ancaq bir registrdən istifadə olunarsa, bu registr baza registri kimi qəbul olunur:

MOV AL, [EBX] ;ünvanı EBX registrində olan baytın

; verilənlər sahəsindən göndərilməsi;

2. Birbaşa ünvanlaşdırmada (identifikator şəklində) ünvanın təyini üçün (söhbət indeksli ünvanlaşdırmadan gedir) istifadə olunan registr indeks registri sayıldığından, miqyaslamadan istifadə edərək massivin tələb olunan elementinin ünvanını bu registrin köməyi ilə təyin etmək olar:

ADD EAX,MAS[EBX*4] ; yaddaşda mas+( ebx)*4

; ünvanındakı ikiqat sözlə eax registrinin məzmununu

; toplamaq.

3. Əgər baza-indeks ünvanlaşdırma üsulu ilə ünvanı təyin etmək tələb olunarsa, onda iki registrdən istifadə olunur və bu zaman soldakı registr baza, sağdakı isə indeks registri sayılır. Ümumi halda bu seçim prinsipial xarakter daşımır. Əgər bu registrlərin birindən miqyaslama məqsədi ilə istifadə edəriksə, onda həmin registr indeks registri sayılacaq.

4. Qeyd edək ki, baza – indeks ünvanlaşdırılması bilavasitə, qiymətin göstərilməsi və ya birbaşa ünvanlaşdırmanı tələb etmir. Bu halda ünvan bütün komponentlərin cəmi kimi tapılır. Məsələn:

MOV AX,MAS [ EBX][ECX*2]
; operandın ünvanı  [mas+(ebx)+(ecx)*2] bərabər olacaq.
      ...
sub dx,[ebx+8][ecx*4]
; operandın ünvanı [(ebx)+8][(ecx)*4] bərabər olacaq

Bir daha qeyd edək ki, miqyaslama yalnız massivin elementlərinin ölçüsü 2, 4 və 8 bayt olduqda effektli sayıla bilər.

Misal. Elementlərinin ölçüsü üç bayt olan beş elementli mas­sivin tərtib olunması məsələsinin proqramına baxaq. Verilmiş massivin elementlərinin birinci baytlarının qiymə­tini bir vahid artırmaqla, ardıcıl olaraq, emal etmək tələb olunur.

MASM
MODEL SMALL
.STACK 256
.DATA
n=5	  ;  Massivin elementlərinin sayı
mas DB 5 DUP (3 DUP (0))
.CODE
main:
MOV AX,@DATA
MOV DS,AX
XOR AX,AX
MOV SI,0
MOV CX,n
go:
MOV DL,mas[SI];Növbəti bayt sahəsini DL  göndərmək
INC DL ;DL-i 1 vahid artırmaq (məsələnin  şərtinə görə)
MOV mas[SI],DL  ; Yenidən massivə göndərmək
ADD SI,3  ; Massivin növbəti  elementinə keçmək 
LOOP go
MOV SI,0 ; Ekrana çıxışa hazırlıq
MOV CX,n  ;Beş elementin birinci baytının 
                    ;  məzmununun ekrana çıxarılması
show:
MOV DL,mas[SI]
ADD SI,3
ADD DL,30h	
MOV AH,02h     ; DL-dən simvolun ekrana 
                          ; çıxarılması funksiyası
INT 21h
LOOP show
exit:
MOV AX,4C00h
INT 21h
END   main