Учебники

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

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

Например, мы можем определить переменную слова ‘months’ любым из следующих способов —

MONTHS	DW	12
MONTHS	DW	0CH
MONTHS	DW	0110B

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

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

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

Давайте рассмотрим другой пример. Вы можете определить массив с именем инвентарь размера 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 —

Live Demo

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

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