Assembler proqramlaşdırma dili

İkiölçül massivlər

İkiölçül massivlər

Assemblerdə ikiölçülü massivi təsvir etmək üçün xüsusi vasitə yoxdur. İkiölçülü massivi təsvir etmək üçün onu modelləşdirmək lazımdır. Verilənlər üçün yaddaş sahəsinin ayrılması və inisiallaşdırılması direktivinin köməyi ilə ikiölçülü massiv üçün yaddaş sahəsi ayrılır.

Massivin emalı bilavasitə kodlar seqmentində mo­del­ləşir, burada proqramçı emal alqoritmini təsvir edərkən yaddaş sahəsinin müəyyən hissəsinə ikiölçülü massiv kimi baxılmasını təyin edir. Bu zaman ikiölçülü massivin yaddaşda sətrə və ya sütuna görə necə yerləşməsini proqramçının özü müəyyənləşdirir.

Əgər birtipli elementlər ardıcıllığı yaddaşda, sətrə görə ikiölçülü massiv kimi təsvir olunursa, onda (i,j) elementinin ünvanı aşağıdakı formula ilə hesablanır:

(baza+sətrdəki_elementlərin_sayı* elementin ölçüsü*i+j)

Burada, i=0...n-1 sətrlərin, j=0...m-1 isə sütunların nömrəsini göstərir. Məsələn, tutaq ki, ölçüsü 4*4 (i=0...3, j=0...3) olan ədədi (elementin uzunluğu 1 bayt) massiv verilmişdir.

23	04	05	67
05	06	07	99
67	08	09	23
87	09	00	08

Yaddaşda bu massivin elementləri aşağıdakı ardıcıllıqla yerləşəcəkdir:

23 04 05 67 05 06 07 99 67 08 09 23 87 09 00 08

Əgər bu ardıcıllığı yuxrıdakı verilmiş ikiölçülü massiv kimi göstərmək və məsələn, mas (2,3)=23 elementini hər elementin bir baytda yerləşməsi şərti ilə tapmaq istəyiriksə, aşağıdakı hesablamanı aparmaq lazımdır:

Effektiv ünvan mas (2,3)=mas+4*1*2+3=mas+11.

İkiölçülü massivdə ünvanlaşdırmanı təşkil etmək üçün, məntiqi olaraq, yuxarıda göstərilən baza-indeksləmə ünvanlaşdırma rejimindən istifadə olunur.

Bu halda, komponentlərin seçilməsi üçün, effektiv ünvanın yaradılmasının iki əsas variantı mövcuddur.

1) Komponentin baza ünvanı və indekslərin saxlanması üçün, iki indeks registrlərindən istifadə etməklə, birbaşa ünvanlaşdırma:

MOV AX,mas[EBX][ESI]

2) İki indeks registrlərinin kombinasıyası. Bu registrlərdən biri, eyni zamanda həm baza, həm də indeks, dmgəri isə yalnız indeks registri kimi seçilir:

MOV AX, [EBX][ESI]

Deyilənlərin proqramda istifadəsi aşağıdakı proqram fraqmentində verilmişdir:

; mas (2,3) massiv elementinin seçilməsinin proqram fraqmenti
.386
.DATA
mas DB 23,4,5,67,5,6,7,99,67,8,9,23,87,9,0,8
i=2
j=3
.CODE
...
 MOV SI,4*1*i
MOV DI, j
MOV AL, mas[SI][DI]        ; AL-ə mas (2,3) 
                                ; elementinin göndərilməsi
... 

İndi isə ikiölçülü ədədi massivdə (üçə bərabər olan) elementin axtarılmasının tam proqramını tərtib edək. Massivin elementləri proqramda verilib.

MASM
MODEL small
.STACK 256
.DATA
; 2x5 ölçüsü matrisinin elementlərini 
;insiallaşdırmasaq üçün
; yaddaş sahəsinin ayrılmasını aşağıdakı kimi 
;təyin edə bilərik
; array DW 2 DUP (5 DUP (?))
; biz onu aşağıdakı kimi inisiallaşdıraq:
array 	DW 1,2,3,4,5,6,7,3,9,0
; onda o məntiqi olaraq aşağıdakı kimi görünəcək:
;array=	{1  2}
;	{3  4}
;	{5  6}
;	{7  3}
;	{9  0}
elem     DW  3	; axtarış üçün element
failed    DB 0ah,0dh, ' massivdə belə element yoxdur!', '$'
success DB 0ah,0dh, 'axtarılan element massivdə var.', '$'
foundtime	DB 0  ; Tapılan elementlərin sayı
fnd    DB ' (ax)-in yeri',0ah,0dh,'$'
.CODE
main:
MOV AX,@DATA
MOV DS,AX
XOR AX,AX
MOV SI,0               ; SI= matrisdəki sütunlara
MOV BX,0              ; BX= matrisdəki sətrlərə
MOV CX,5              ; sətrlərin sayı
extr:	                    ; xarici dövr (sətrə görə)
MOV AX,ARRAY[BX][SI]	 ; matrisin birinci 
                                     ; elementi AX-də
PUSH CX   ; xarici dövr sayğacının məzmununu 
                 ; stekə göndərmək
MOV CX,2	; sətrlərin sayı
MOV SI,0
intr:	                   ; sətrə görə  daxili dövr
INC SI	; sətrdə növbəti elementə keçmək
; AX-dəki cari elementin məzmunu ilə axtarılan elementi 
; müqayisə etmək:
CMP AX,elem
JE here
; =-lik varsa here ünvanına keçid, 
LOOP intr ;əks halda dövr təkrarlanır
here:
JCXZ move_next ; sətr elementlərinə tam baxılıbmı?
INC foundtime  ; əks halda üst-üstə düşmə
                 ; sayğagını artırmaq
MOVE_NEXT:    ; matrisin növbəti elementləri
POP CX	        ; xarici dövr üçün  CX bərpa etmək
ADD BX,1	        ; növbəti sətrə keçmək
LOOP extr	        ; xarici dövr 
CMP foundtime,0h   ; axtarılan element 
                     ; sayının 0-la müqayisəsi
JA eql	  ; Əgər 0-dan böyükdürsə onda keçid,
not_equal:	  ; əks halda axtarılan element yoxdur
MOV AH,09h  ;  failed-in  ekrana çıxarılması funksiyası
MOV DX,OFFSET failed
INT 21h
JMP exit
eql:	; axtarılan element  var
MOV AH,09h  ; success-in ekrana çıxarılması funksiyası
MOV DX,OFFSET success
INT 21h
MOV AH,02h
MOV DL,foundtime
ADD DL,30h
INT 21h
MOV AH,09h
MOV DX,OFFSET fnd
INT 21h
exit:  MOV AX,4C00h
INT 21h
END main

Proqramın analizi zamanı Assemblerdə massivin ele­mentlərinin 0-dan başlayaraq nömrələndiyini nəzərə almaq lazımdır. Odur ki, massivin müəyyən elementinin axta­rılması zamanı massivə əvvəldən axıra kimi baxılır.

Proqramda massivin tapılan elementlərərinin sayı foundtime sahəsində saxlanır. İndeks reqistrləri kimi SI və BX reqistrlərindən istifadə olunub.