abc Asembler - elektronski priručnik
XVI dio Nizovi (arrays)

Nizovi (arrays)

Već smo razmatrali da se direktive asembleru za definiciju podataka koriste za alociranje spremišta za varijable. Varijabla može takođe biti inicijalizovana sa nekom specifičnom vrijednošću. Inicijalizovana vrijednost može biti specificirana u heksadecimalnoj, decimalnoj ili binarnoj formi.
Na primjer, možemo definisati word varijablu ‘months’ na neki od sljedećih načina:

MONTHS   DW   12
MONTHS   DW   0CH
MONTHS   DW   0110B

Direktive za definiciju podataka mogu se takođe koristiti za definisanje jednodimenzionalnog niza. Definišimo jednodimenzionalni niz brojeva.

NUMBERS   DW  34,  45,  56,  67,  75,  89

Gore navedena definicija deklariše niz od 6 word-a, svaki inicijalizovan sa brojevima 34, 45, 56, 67, 75, 89. Ovo alocira 2x6 = 12 bajtova konsekutivnog memorijskog prostora. Simbolička adresa prvog broja će biti NUMBERS, a drugog broja će biti NUMBERS + 2 i tako dalje.
Razmotrimo još jedan primjer. Možemo definisati niz sa imenom inventory veličine 8, i inicijalizovati sve vrijednosti sa nulom, kao:

INVENTORY 	DW  0
DW  0
DW  0
DW  0
DW  0
DW  0
DW  0
DW  0

Što se može skratiti kao:

INVENTORY     DW  0,  0,  0,  0,  0,  0,  0,  0

Takođe se može koristiti direktiva TIMES za višestruke inicijalizacije na istu vrijednost. Koristeći TIMES, niz INVENTORY može se definisati kao:

INVENTORY   TIMES  8  DW  0

Primjer
Sljedeći primjer demonstrira gore navedene koncepte definišući 3-elementni niz x, koji sprema 3 vrijednosti: 2, 3 i 4. On sabira vrijednosti u nizu i prikazuje sumu 9:

section   .text
      global _start 	;must be declared for linker (ld)
_start:

         mov   eax, 3 	;number bytes to be summed
         mov   ebx, 0 	;EBX will store the sum
         mov   ecx, x 	;ECX will point to the current element to be summed
top:     add   ebx,  [ecx]
         add   ecx, 1 	;move pointer to next element
         dec   eax 		;decrement counter
         jnz   top 		;if counter not 0, then loop again
done:
         add   ebx, '0'
         mov   [sum], ebx 	;done, store result in "sum"
display:
         mov  edx, 1 	;message length
         mov  ecx, sum 	;message to write
         mov  ebx, 1 	;file descriptor (stdout)
         mov  eax, 4 	;system call number (sys_write)
         int  0x80   	;call kernel
         mov  eax, 1 	;system call number (sys_exit)
         int  0x80  	;call kernel

section    .data
global  x
x:
         db  2
         db  4
         db  3
sum:
         db  0

Kada se gore navedeni kod kompajlira i izvrši, on će proizvesti sljedeći rezultat:
9

Repeticioni prefiksi    <    Index    >    Procedure