You are on page 1of 15

Низи и матрици

Аудиториски вежби 4
Дефинирање на низи
 Податочен сегмент
 Неиницијализирани низи
 име тип големина dup (?)

CharArray db 128 dup (?) ;низа [0..127] од byte


IntArray db 8 dup (?) ;низа [0..7] од byte
PtrArray dw 4 dup (?) ;низа[0..3] од word
Дефинирање на низи
 Иницијализирана низа
 Иницијализација со иста вредност
 име тип големина dup (вредност)
 Иницијализација со различни вредности
 Име тип вредности_одделени_со_заприка

IntegerAry db 8 dup (1)


;низата е иницијализирана со единици

Squares dw 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100


;низата е инцијализирана со квадратите на броевите од 0 до 10
Дефинирање на низи
 Запишување на низи во меморија
 Елементите од низите секогаш се запишуваат
последователно во меморија
 почнувајќи со првиот елемент
 Која е адресата на секој елемент од низата?
 Index – индексот на елементот (од 0 до n-1)
 Base_Address – адресата на првиот елемент од низата
 Element_Size - големината на елементот (1 или 2 бајти зависно
од типот на елементи во низата)

Element_Address = Base_Address + Index * Element_Size


Дефинирање на низи
 Пристап до елемент на низа
 Squares dw 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
 Index dw 4
 Element_Address = Squares + index * 2
 Големината на елементите е 2B
Во виш јазик:
AX := Squares[index]
Начин 1 еквивалентно во асемблер:
mov bx, index ;индексот во BX BX
add bx, bx ;се дуплира индексот за да се добие вредноста 2*index
mov ax, Squares [bx] ; AX = [Squares + 2*index]
; регистерски- индиректен режим со поместување. Disp e Squares што
претставува адреса на првиот елемент од низата
Дефинирање на низи
 Инструкција за податочен трансфер
 LEA Reg, Src
 Load Effective Address
 Се копира ефективната адреса (поместувањето) на изворот (Src)
во регистерот (Reg)

Начин 2 еквивалентно во асемблер:


lea bx, Squares ; адресата на првиот елемент од низата се
сместува во bx
mov si, index
add si, si
mov ax, [bx][si] ; базен и индексен режим
Дефинирање на низи
 Асемблерска директрива
 OFFSET Src
 Со MOV BX, OFFSET Src, се копира поместувањето на изворот во
регистерот BX

Начин 3 еквивалентно во асемблер:


mov bx, OFFSET Squares ; адресата на првиот елемент од низата
се сместува во bx
mov si, index
add si, si
add bx, si
mov ax, [bx] ; регистерски-индиректен режим
Изминување на елементите од една низа
 Декларирање на низа
NIZA db 1,3,4,7,10
CX се намалува за 1 со
 Во кодот
извршува на
MOV BX, OFFSET NIZA инструкцијата LOOP
MOV CX, 05d
CIKLUS:
MOV DL, [BX] ; [BX] – вредноста кај што покажува
BX во DATA SEGMENT
... ; сега во DL e елемент од низата
INC BX ; BX покажува на следниот елемент
LOOP CIKLUS ; if --CX > 0 скокај на CIKLUS
Изминување на елементите од една низа
 Декларирање на низа
NIZA db 1,3,4,7,10
 Во кодот
MOV BX, OFFSET NIZA
MOV CX,0h
CIKLUS:
MOV DL, [BX] ; [BX] – вредноста кај што покажува
BX во DATA SEGMENT
... ; сега во DL e елемент од низата
INC BX ; BX покажува на следниот елемент
INC CX ; бројачот CX се зголемува за 1
cmp CX, 05d
jne CIKLUS ; if --CX <> 05 скокај на CIKLUS
Пример
 Да се напише програма која ќе најде максимален
елемент на низа која има елементи од тип WORD
array dw 4,3,2,12, 5,6,10,5,3,2
max dw 0

MOV BX, OFFSET array


MOV CX,0h
CIKLUS:
MOV AX, [BX]
CMP AX,max
JBE NOGreater
MOV max,AX
NOGreater:
ADD BX,2
INC CX
CMP CX, 10d
JNE CIKLUS
Дефинирање на повеќедимензионални низи
 Неиницијализирани матрици (nxm)
 n редици
 m колони
 име тип nxm dup (?)
 Пример
 А db 16 dup (?)
 B db 12 dup (0)
Дефинирање на повеќедимензионални низи
 Која е адресата на секој елемент
од матрица од ред nxm?
 Rowindex – индексот на редицата
(од 0 до n-1)
 Colindex – индексот на колоната
(од 0 до m-1)
 Row_size – големината во бајти на
една редица
 Base_Address – адресата на првиот
елемент од матрицата
 Element_Size - големината на еден
елемент (1 или 2 бајти зависно од
типот на елементи во матрицата)
Element_Address = Base_Address + (rowindex*row_size + colindex) * Element_Size
Изминување на матрица
data segment
i db ?
j db ?
MATRICA db 20 dup (?) code segment
Ends start:
; set segment registers:
MOV ax, data
stack segment MOV ds, ax
db 128 dup(0) MOV es, ax
ends
;код за матрици ---→

MOV ax, 4c00h


INT 21h
ends

end start
Изминување на матрица
MOV i, 0h ;бројач по редици
RED:
MOV j, 0h ;бројач по колони
KOLONA:
MOV ax, 4d ;4 елементи во една редица
MUL i ;MUL врши множење на AL со i
MOV dh, 0h
MOV dl, j
ADD ax, dx ;на AX (резултат од MUL) се додава j
MOV bx, ax ;во BX е поместувањето 4*i+j
… ;во MATRICA[bx] е сместен еден db со индекс i,j
ADD j,1d ;се зголемува бројачот на колони
CMP j,4d ;ако не се изминати сите колони
JNE KOLONA
ADD i,1d ;се зголемува бројачот на редици
CMP i, 5d ;ако не се изминати сите редици
JNE RED
Пример
 Најдете ја сумата на сите елементи во една
матрица!
data segment
i db ?
j db ?
MATRICA db 20 dup (?) ;матрицата има 4 редици и 5 колони
sum dw 0
Ends

;во MATRICA[bx] е сместен еден db со индекс i,j


MOV AL,MATRICA[bx]
MOV AH,0
ADD sum, AX

You might also like