Сборка - Массивы
Мы уже обсуждали, что директивы определения данных для ассемблера используются для выделения памяти для переменных. Переменная также может быть инициализирована некоторым конкретным значением. Инициализированное значение может быть указано в шестнадцатеричной, десятичной или двоичной форме.
Например, мы можем определить словесную переменную «месяцы» одним из следующих способов:
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