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
|
 |