4495
Массивы на языке ассемблера
Лекция
Информатика, кибернетика и программирование
Массивы на языке ассемблера Дадим формальное определение: массив - структурированный тип данных, состоящий из некоторого числа элементов одного типа. Для того чтобы разобраться в возможностях и особенностях обработки массивов в программах на ассембл...
Русский
2012-11-21
35.65 KB
145 чел.
Дадим формальное определение:
массив - структурированный тип данных, состоящий из некоторого числа элементов одного типа.
Для того чтобы разобраться в возможностях и особенностях обработки массивов в программах на ассемблере, нужно ответить на следующие вопросы:
Описание и инициализация массива в программе
Специальных средств описания массивов в программах ассемблера, конечно, нет. При необходимости использовать массив в программе его нужно моделировать одним из следующих способов:
;массив из 5 элементов.Размер каждого элемента 4 байта: mas dd 1,2,3,4,5 |
;массив из 5 нулевых элементов. ;Размер каждого элемента 2 байта: mas dw 5 dup (0) |
Такой способ определения используется для резервирования памяти с целью размещения и инициализации элементов массива.
... n=0 ... mas_b label byte mas_w label word rept 4 dw 0f1f0h endm |
В результате в памяти будет создана последовательность из четырех слов f1f0. Эту последовательность можно трактовать как массив байт или слов в зависимости от того, какое имя области мы будем использовать в программе mas_b или mas_w.
Листинг 2 Инициализация массива в цикле ;prg_12_1.asm MASM MODEL small STACK 256 .data mes db 0ah,0dh,'Массив- ','$' mas db 10 dup (?) ;исходный массив i db 0 .code main: mov ax,@data mov ds,ax xor ax,ax ;обнуление ax mov cx,10 ;значение счетчика цикла в cx mov si,0 ;индекс начального элемента в cx go: ;цикл инициализации 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 21h show: mov ah,02h ;функция вывода значения из al на экран mov dl,mas[si] add dl,30h ;преобразование числа в символ int 21h inc si loop show exit: mov ax,4c00h ;стандартный выход int 21h end main ;конец программы |
Доступ к элементам массива
При работе с массивами необходимо четко представлять себе, что все элементы массива располагаются в памяти компьютера последовательно.
Само по себе такое расположение ничего не говорит о назначении и порядке использования этих элементов. И только лишь программист с помощью составленного им алгоритма обработки определяет, как нужно трактовать эту последовательность байт, составляющих массив. Так, одну и ту же область памяти можно трактовать как одномерный массив, и одновременно те же самые данные могут трактоваться как двухмерный массив. Все зависит только от алгоритма обработки этих данных в конкретной программе. Сами по себе данные не несут никакой информации о своем “смысловом”, или логическом, типе. Помните об этом принципиальном моменте.
Эти же соображения можно распространить и на индексы элементов массива. Ассемблер не подозревает об их существовании и ему абсолютно все равно, каковы их численные смысловые значения.
Для того чтобы локализовать определенный элемент массива, к его имени нужно добавить индекс. Так как мы моделируем массив, то должны позаботиться и о моделировании индекса. В языке ассемблера индексы массивов это обычные адреса, но с ними работают особым образом. Другими словами, когда при программировании на ассемблере мы говорим об индексе, то скорее подразумеваем под этим не номер элемента в массиве, а некоторый адрес.
Давайте еще раз обратимся к описанию массива. К примеру, в программе статически определена последовательность данных:
mas dw 0,1,2,3,4,5 |
Пусть эта последовательность чисел трактуется как одномерный массив. Размерность каждого элемента определяется директивой dw, то есть она равна 2 байта. Чтобы получить доступ к третьему элементу, нужно к адресу массива прибавить 6. Нумерация элементов массива в ассемблере начинается с нуля.
То есть в нашем случае речь, фактически, идет о 4-м элементе массива 3, но об этом знает только программист; микропроцессору в данном случае все равно ему нужен только адрес.
В общем случае для получения адреса элемента в массиве необходимо начальный (базовый) адрес массива сложить с произведением индекса (номер элемента минус единица) этого элемента на размер элемента массива:
база + (индекс*размер элемента)
Архитектура микропроцессора предоставляет достаточно удобные программно-аппаратные средства для работы с массивами. К ним относятся базовые и индексные регистры, позволяющие реализовать несколько режимов адресации данных. Используя данные режимы адресации, можно организовать эффективную работу с массивами в памяти. Вспомним эти режимы:
mas dw 0,1,2,3,4,5 ... mov si,4 ;поместить 3-й элемент массива mas в регистр ax: mov ax,mas[si] |
Этот вид адресации удобно использовать при обработке двухмерных массивов. Пример использования этой адресации мы рассмотрим далее при изучении особенностей работы с двухмерными массивами.
Напомним, что в качестве базового регистра может использоваться любой из восьми регистров общего назначения. В качестве индексного регистра также можно использовать любой регистр общего назначения, за исключением esp/sp.
Микропроцессор позволяет масштабировать индекс. Это означает, что если указать после имени индексного регистра знак умножения “*” с последующей цифрой 2, 4 или 8, то содержимое индексного регистра будет умножаться на 2, 4 или 8, то есть масштабироваться.
Применение масштабирования облегчает работу с массивами, которые имеют размер элементов, равный 2, 4 или 8 байт, так как микропроцессор сам производит коррекцию индекса для получения адреса очередного элемента массива. Нам нужно лишь загрузить в индексный регистр значение требуемого индекса (считая от 0). Кстати сказать, возможность масштабирования появилась в микропроцессорах Intel, начиная с модели i486. По этой причине в рассматриваемом здесь примере программы стоит директива .486. Ее назначение, как и ранее использовавшейся директивы .386, в том, чтобы указать ассемблеру при формировании машинных команд на необходимость учета и использования дополнительных возможностей системы команд новых моделей микропроцессоров.
В качестве примера использования масштабирования рассмотрим листинг 3, в котором просматривается массив, состоящий из слов, и производится сравнение этих элементов с нулем. Выводится соответствующее сообщение.
Листинг 3. Просмотр массива слов с использованием масштабирования ;prg_12_2.asm MASM MODEL small STACK 256 .data ;начало сегмента данных ;тексты сообщений: mes1 db 'не равен 0!$',0ah,0dh mes2 db 'равен 0!$',0ah,0dh mes3 db 0ah,0dh,'Элемент $' mas dw 2,7,0,0,1,9,3,6,0,8 ;исходный массив .code .486 ;это обязательно main: mov ax,@data mov ds,ax ;связка ds с сегментом данных xor ax,ax ;обнуление ax prepare: mov cx,10 ;значение счетчика цикла в cx mov esi,0 ;индекс в esi compare: mov dx,mas[esi*2] ;первый элемент массива в dx cmp dx,0 ;сравнение dx c 0 je equal ;переход, если равно not_equal: ;не равно mov ah,09h ;вывод сообщения на экран lea dx,mes3 int 21h mov ah,02h ;вывод номера элемента массива на экран mov dx,si add dl,30h int 21h mov ah,09h lea dx,mes1 int 21h inc esi ;на следующий элемент dec cx ;условие для выхода из цикла jcxz exit ;cx=0? Если да на выход jmp compare ;нет повторить цикл equal: ;равно 0 mov ah,09h ;вывод сообщения mes3 на экран lea dx,mes3 int 21h mov ah,02h mov dx,si add dl,30h int 21h mov ah,09h ;вывод сообщения mes2 на экран lea dx,mes2 int 21h inc esi ;на следующий элемент dec cx ;все элементы обработаны? jcxz exit jmp compare exit: mov ax,4c00h ;стандартный выход int 21h end main ;конец программы |
Еще несколько слов о соглашениях:
;переслать байт из области данных, адрес которой находится в регистре ebx: mov al,[ebx]
|
add eax,mas[ebx*4] ;сложить содержимое eax с двойным словом в памяти ;по адресу mas + (ebx)*4
|
Заметим, что базово-индексную адресацию не возбраняется сочетать с прямой адресацией или указанием непосредственного значения. Адрес тогда будет формироваться как сумма всех компонентов.
К примеру:
mov ax,mas[ebx][ecx*2] ;адрес операнда равен [mas+(ebx)+(ecx)*2] ... sub dx,[ebx+8][ecx*4] ;адрес операнда равен [(ebx)+8+(ecx)*4]
|
Но имейте в виду, что масштабирование эффективно лишь тогда, когда размерность элементов массива равна 2, 4 или 8 байт. Если же размерность элементов другая, то организовывать обращение к элементам массива нужно обычным способом, как описано ранее.
Рассмотрим пример работы с массивом из пяти трехбайтовых элементов (листинг 4). Младший байт в каждом из этих элементов представляет собой некий счетчик, а старшие два байта что-то еще, для нас не имеющее никакого значения. Необходимо последовательно обработать элементы данного массива, увеличив значения счетчиков на единицу.
Листинг 4. Обработка массива элементов с нечетной длиной ;prg_11_3.asm MASM MODEL small ;модель памяти STACK 256 ;размер стека .data ;начало сегмента данных N=5 ;количество элементов массива mas db 5 dup (3 dup (0)) .code ;сегмент кода main: ;точка входа в программу mov ax,@data mov ds,ax xor ax,ax ;обнуление ax mov si,0 ;0 в si mov cx,N ;N в cx go: mov dl,mas[si] ;первый байт поля в dl inc dl ;увеличение dl на 1 (по условию) mov mas[si],dl ;заслать обратно в массив add si,3 ;сдвиг на следующий элемент массива loop go ;повтор цикла mov si,0 ;подготовка к выводу на экран mov cx,N show: ;вывод на экран содержимого ;первых байт полей mov dl,mas[si] add dl,30h mov ah,02h int 21h loop show exit: mov ax,4c00h ;стандартный выход int 21h end main ;конец программы |
А также другие работы, которые могут Вас заинтересовать | |||
60090. | Сценарий литературного праздника по творчеству С. Я. Маршака | 97.5 KB | |
Цель: в игровой форме вспомнить и повторить произведения С.Я. Маршака; пробудить интерес к его творчеству; учить воспринимать содержание произведений; прививать интерес к чтению книг; развивать воображение... | |||
60091. | Срібна ниточка поміж берегами | 77.5 KB | |
В народі говорять: Яка мама така і доня. Отже доня це маленька мама яка запамятовує всі накази дорослої мами. Під ясними вітрилами любові і добра У подорож далеку запрошую вас я На океанських крилах донести хочем ми Одвічну шану матері заступниці рідні... | |||
60092. | Урок – свято «Великодні дзвони» | 48 KB | |
Найбільшим святом весни є Великдень. Цього дня воскрес Ісус Христос. До цього свята готуються заздалегідь. Неділю перед Великоднем називають Вербною. Перші «котики» верби - символ пробудження природи. | |||
60093. | Загальношкільна лінійка «Збережи де живеш, де стоїш…» | 53.5 KB | |
Учень 1: Кожної весни земля цього благодатного краю вкривається барвистим килимом рослин дає притулок різним живим істотам. Учень 2: З давніх здавен як тільки виникли рослини на землі почали вони змагатися між собою за кращі умови освітленості вологи живлення. | |||
60094. | Запобігання торгівлі людьми | 31 KB | |
Мета: надати учням інформацію про явища торгівлі людьми (дітьми), зовнішні та внутрішні причини виникнення даної проблеми; про те, які права порушуються в ситуації торгівлі людьми. | |||
60095. | Внеклассное мероприятие по химии Что? Где? Когда? | 53 KB | |
Команды придумывают себе название делают эмблему выбирают капитана капитан координирует и направляет игру команды. Ход проведения мероприятия: Ведущий Приветствует команды зрителей представляет жюри. Приветствие команд представляют эмблему комментируют название команды приветствуют команду соперника Разминка Вопросы к... | |||
60096. | НА РУШНИКУ ХАЙ ДОЛЯ КВІТНЕ | 51.5 KB | |
Мета: розширити знання студентів про різновиди українського рушника та народні традиції повязані з ним; розвивати творчі здібності студентів; виховувати любов до традицій свого народу заохочувати студентів до вивчення української народної культури. | |||
60097. | Свято останнього дзвоника в школі | 56 KB | |
До присутніх звертаються учні 10 класу читають вірші. Ведуча: 10 клас Коли весна травневим ранком Бентежить в жилах юну кров На свято школи урочисте Усі збираємося знов. Ведучий: 10 клас Шкільне подвіря забуяло цвітом. | |||
60098. | Усний журнал КИМ БУТИ? | 58.5 KB | |
Ким же я стану Сьогодні ми проведемо усний журнал КИМ БУТИ Яку відповідь на це запитання знайшов наш гість ми зараз послухаємо на першій сторінці яка має назву І сторінка ЦІКАВА ЗУСТРІЧ В гості до нас прийшов щоб розповісти про власний вибір професії Лауреат премії ім. Усі професії потрібні і важливі. Будівельник показую малюнок і слова МАЛЯР МУЛЯР... | |||