Сборка - Массивы

Мы уже обсуждали, что директивы определения данных для ассемблера используются для выделения памяти для переменных. Переменная также может быть инициализирована некоторым конкретным значением. Инициализированное значение может быть указано в шестнадцатеричной, десятичной или двоичной форме.

Например, мы можем определить словесную переменную «месяцы» одним из следующих способов:

MONTHS	DW	12
MONTHS	DW	0CH
MONTHS	DW	0110B

Директивы определения данных также могут использоваться для определения одномерного массива. Определим одномерный массив чисел.

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

В приведенном выше определении объявляется массив из шести слов, каждое из которых инициализировано числами 34, 45, 56, 67, 75, 89. Это выделяет 2x6 = 12 байтов последовательного пространства памяти. Символьный адрес первого числа будет НОМЕРА, второго числа - НОМЕРА + 2 и так далее.

Возьмем другой пример. Вы можете определить массив с именем inventory размером 8 и инициализировать все значения нулем, как -

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

Что можно сократить как -

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

Директива TIMES также может использоваться для нескольких инициализаций одного и того же значения. Используя TIMES, массив INVENTORY можно определить как:

INVENTORY TIMES 8 DW 0

пример

Следующий пример демонстрирует вышеупомянутые концепции путем определения трехэлементного массива x, в котором хранятся три значения: 2, 3 и 4. Он добавляет значения в массив и отображает сумму 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

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

9