Montaż - tablice

Omówiliśmy już, że dyrektywy definicji danych do asemblera służą do przydzielania pamięci dla zmiennych. Zmienną można również zainicjować określoną wartością. Zainicjowaną wartość można określić w postaci szesnastkowej, dziesiętnej lub binarnej.

Na przykład, możemy zdefiniować zmienną słowo „miesiące” w jeden z następujących sposobów -

MONTHS	DW	12
MONTHS	DW	0CH
MONTHS	DW	0110B

Dyrektywy definicji danych mogą być również używane do definiowania jednowymiarowej tablicy. Zdefiniujmy jednowymiarową tablicę liczb.

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

Powyższa definicja deklaruje tablicę sześciu słów, z których każde jest zainicjowane liczbami 34, 45, 56, 67, 75, 89. To przydziela 2x6 = 12 bajtów kolejnej przestrzeni pamięci. Symboliczny adres pierwszej liczby to LICZBY, a adres drugiej liczby to LICZBY + 2 i tak dalej.

Weźmy inny przykład. Możesz zdefiniować tablicę o nazwie spis o rozmiarze 8 i zainicjować wszystkie wartości zerem, ponieważ -

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

Który można skrócić jako -

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

Dyrektywa TIMES może być również używana do wielu inicjalizacji tej samej wartości. Używając TIMES, tablicę INVENTORY można zdefiniować jako:

INVENTORY TIMES 8 DW 0

Przykład

Poniższy przykład demonstruje powyższe koncepcje, definiując 3-elementową tablicę x, która przechowuje trzy wartości: 2, 3 i 4. Dodaje wartości do tablicy i wyświetla sumę 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

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

9