Montage - Arrays
Wir haben bereits diskutiert, dass die Datendefinitionsanweisungen an den Assembler zum Zuweisen von Speicher für Variablen verwendet werden. Die Variable könnte auch mit einem bestimmten Wert initialisiert werden. Der initialisierte Wert kann in hexadezimaler, dezimaler oder binärer Form angegeben werden.
Zum Beispiel können wir eine Wortvariable 'Monate' auf eine der folgenden Arten definieren:
MONTHS DW 12
MONTHS DW 0CH
MONTHS DW 0110B
Die Datendefinitionsanweisungen können auch zum Definieren eines eindimensionalen Arrays verwendet werden. Definieren wir ein eindimensionales Array von Zahlen.
NUMBERS DW 34, 45, 56, 67, 75, 89
Die obige Definition deklariert ein Array von sechs Wörtern, die jeweils mit den Nummern 34, 45, 56, 67, 75, 89 initialisiert sind. Dies weist 2x6 = 12 Bytes aufeinanderfolgenden Speicherplatzes zu. Die symbolische Adresse der ersten Nummer lautet NUMBERS und die der zweiten Nummer lautet NUMBERS + 2 usw.
Nehmen wir ein anderes Beispiel. Sie können ein Array mit dem Namen Inventar der Größe 8 definieren und alle Werte mit Null initialisieren, als -
INVENTORY DW 0
DW 0
DW 0
DW 0
DW 0
DW 0
DW 0
DW 0
Was abgekürzt werden kann als -
INVENTORY DW 0, 0 , 0 , 0 , 0 , 0 , 0 , 0
Die TIMES-Direktive kann auch für mehrere Initialisierungen mit demselben Wert verwendet werden. Mit TIMES kann das INVENTORY-Array wie folgt definiert werden:
INVENTORY TIMES 8 DW 0
Beispiel
Das folgende Beispiel demonstriert die obigen Konzepte durch Definieren eines 3-Element-Arrays x, in dem drei Werte gespeichert sind: 2, 3 und 4. Es addiert die Werte im Array und zeigt die Summe 9 - an.
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
Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:
9