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