Описание и инициализация массива в программе

Специальных средств описания массивов в программах ассемблера, конечно, нет. При необходимости использовать массив в программе его нужно моделировать одним из следующих способов:

1. Перечислением элементов массива в поле операндов одной из директив описания данных. При перечислении элементы разделяются запятыми. К примеру:

;массив из 5 элементов.Размер каждого элемента 4 байта:mas dd 1,2,3,4,5

2. Используя оператор повторения dup. К примеру:

;массив из 5 нулевых элементов.;Размер каждого элемента 2 байта:mas dw 5 dup (0)

Такой способ определения используется для резервирования памяти с целью размещения и инициализации элементов массива.

3. Используя директивы label и rept. Пара этих директив может облегчить описание больших массивов в памяти и повысить наглядность такого описания. Директива rept относится к макросредствам языка ассемблера и вызывает повторение указанное число раз строк, заключенных между директивой и строкой endm. К примеру, определим массив байт в области памяти, обозначенной идентификатором mas_b. В данном случае директива label определяет символическое имя mas_b, аналогично тому, как это делают директивы резервирования и инициализации памяти. Достоинство директивы label в том, что она не резервирует память, а лишь определяет характеристики объекта. В данном случае объект — это ячейка памяти. Используя несколько директив label, записанных одна за другой, можно присвоить одной и той же области памяти разные имена и разный тип, что и сделано в следующем фрагменте:

...n=0...mas_b label bytemas_w label wordrept 4 dw 0f1f0hendm

В результате в памяти будет создана последовательность из четырех слов f1f0. Эту последовательность можно трактовать как массив байт или слов в зависимости от того, какое имя области мы будем использовать в программе — mas_b или mas_w.

4. Использование цикла для инициализации значениями области памяти, которую можно будет впоследствии трактовать как массив. Посмотрим на примере, каким образом это делается.

Пример: Инициализация массива в циклеMASMMODEL smallSTACK 256.datames db 0ah,0dh,'Массив- ','$'mas db 10 dup (?);исходный массивi db 0.codemain: mov ax,@data mov ds,ax xor ax,ax;обнуление ax mov cx,10;значение счетчика цикла в cx mov si,0;индекс начального элемента в cxgo:;цикл инициализации mov bh,i;i в bh mov mas[si],bh;запись в массив i inc i;инкремент i inc si;продвижение к следующему элементу массива loop go;повторить цикл;вывод на экран получившегося массива mov cx,10 mov si,0 mov ah,09h lea dx,mes int 21hshow: mov ah,02h;функция вывода значения из al на экран mov dl,mas[si] add dl,30h;преобразование числа в символ int 21h inc si loop showexit: mov ax,4c00h;стандартный выход int 21hend main;конец программы

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: