Как сделать массив в ассемблере
Массивы Массив - структурированный тип данных, состоящий из некоторого числа элементов одного типа.
В Ассемблере массивом можно назвать несколько подряд идущих в памяти байт, слов или двойных слов , но все элементы массива должны быть либо байтами, либо словами, либо двойными словами, т.е. иметь одинаковую длину . В качестве имени массива используется символическое имя адреса (смещения) первого байта первого элемента массива.
Для понимания расположения элементов массива в памяти и обращения к ним необходимо вспомнить основные типы данных микропроцессора и расположение байтов в них (рис 1).
Рис 1.Основные типы данных микропроцессора
Пример описания и определения массива:
- из 5 элементов, размер каждого элемента 4 байта:
mas1 dd 1,2,3,4,5 ;mas –имя массива, dd-тип элементов массива двойное слово
- используя оператор повторения dup:
;массив из 5 нулевых элементов, размер каждого элемента 2 байта: mas2 dw 5 dup (0)
При работе с массивами необходимо четко представлять себе, что все элементы массива располагаются в памяти компьютера последовательно. Только программист с помощью составленного им алгоритма обработки определяет, как нужно трактовать эту последовательность байт, составляющих массив. Так, одну и ту же область памяти можно трактовать как одномерный массив, и одновременно те же самые данные могут трактоваться как двухмерный массив. Все зависит только от алгоритма обработки этих данных в конкретной программе. Сами по себе данные не несут никакой информации о своем “смысловом” , или логическом , типе. Помните об этом принципиальном моменте.
Эти же соображения можно распространить и на индексы элементов массива . Ассемблер не подозревает об их существовании и ему абсолютно все равно, каковы их численные смысловые значения.
Для того чтобы обратиться к элементу массива, к его имени нужно добавить индекс . В языке ассемблера индексы массивов — это обычные
Чтобы получить доступ к третьему элементу, нужно к адресу массива mas3 прибавить 6 . Нумерация элементов массива в ассемблере начинается с нуля. То есть в нашем случае речь, фактически, идет о 4 -м элементе массива — 7, но об этом знает только программист; микропроцессору в данном случае все равно — ему нужен только адрес.
Архитектура микропроцессора предоставляет достаточно удобные программно-аппаратные средства для работы с массивами. К ним относятся базовые и индексные регистры, позволяющие реализовать несколько режимов адресации данных. Используя данные режимы адресации, можно организовать эффективную работу с массивами в памяти. Вспомним эти режимы: индексная адресация со смещением — режим адресации, при котором эффективный адрес (т.е. смещение данных относительно начала сегмента данных) формируется из двух компонентов:
o постоянного (базового) — указанием прямого адреса массива в виде имени идентификатора, обозначающего начало массива; o переменного (индексного) — указанием имени индексного регистра.
Пример обращения к элементам массива:
0,5,6,7,8,9 ;определили одномерный массив с размерностью элементов в слово (2 байта)
В методических указаниях приведено описание основных команд языка Assembler для ввода и вывод данных, работы с массивами, арифметическим сопроцессором и файлами. Методические указания предназначены для студентов направления подготовки бакалавров по направлению 230100.62 "Информатика и вычислительная техника", изучающих курс "Машинно-ориентированные языки".
Приведенный ниже текст получен путем автоматического извлечения из оригинального PDF-документа и предназначен для предварительного просмотра.
Изображения (картинки, формулы, графики) отсутствуют.
Тема: Разработка программ на ассемблере. Обработка одномерных массивов.
Цель работы: Изучить этапы разработки программ на ассемблере. Научиться решать типовые задачи обработки одномерных массивов на ассемблере.
Разработка программы на ассемблере
Разработка программы на языке ассемблере включает в себя несколько этапов:
1) Подготовка исходного текста программы на ассемблере. Для набора и редактирования текста программы можно использовать любой текстовый редактор. Текст программы необходимо сохранить в файле с расширением *.asm.
3) Компоновка программы. Осуществляется с помощью редактора связей (например, Tlink.exe). На этапе компоновки все объектные файлы и библиотеки собираются в один исполняемый файл с расширением *.exe, который содержит машинный код предназначенный для выполнения на микропроцессоре 8086.
4) Отладка программы. На данном этапе программист осуществляет тестирование своей программы с целью проверки правильности ее работы в соответствии с заданным алгоритмом. Для отладки программ на ассемблере используются программы – отладчики (например, Tdebug.exe).
Обработка одномерных массивов на ассемблере
Прежде чем начинать обработку массива, его сначала нужно разместить в памяти микропроцессорной системы. Для этого в ассемблере используется конструкция повторения. Директива DUP имеет следующий формат:
DUP (начальное значение).
Рассмотрим примеры использования директивы DUP для создания массивов:
- X DB 10 DUP (0); создается массив байт с именем Х, состоящий из 10 элементов, с начальным значением всех элементов равным нулю.
- Y DW 30 DUP (?); создается массив слов из 30 элементов, с неопределенным исходным значением всех элементов.
- Z DB 10 DUP (5 DUP (?)); создается двухмерный массив, представляющий собой матрицу размером 10 на 5 элементов.
Для обращения к элементам массива в ассемблере микропроцессора 8086 используется модификация адресов. В качестве модификатора адреса в микропроцессоре 8086 можно использовать четыре регистра: BX, SI, DI и BP. Регистр ВР не рекомендуется использовать для обработки массивов, т.к. он по умолчанию адресует ячейки памяти в сегменте стека, а не в сегменте данных, где обычно располагаются все массивы. Если регистр используется в качестве модификатора, то он указывается в команде в квадратных скобках, например: MOV AX, X[BX]. В такой команде в регистр АХ будет считано содержимое ячейки памяти, адрес которой будет равен сумме адреса переменной Х и содержимого регистра ВХ: ADR = X+[BX]. Таким образом, для обращения к i-элементу массива, в команде необходимо указать имя массива, а в регистр модификатор необходимо записать номер элемента массива – число i. Первый элемент массива имеет номер – 0, а последний элемент массива – (N-1), где N – число элементов массива. Так как для индексирования элементов массива используется 16-разрядный регистр, то размер массива в микропроцессоре 8086 не может превышать 64 Кб (65536 элементов).
Обработку одномерных массивов на ассемблере разберем на следующем примере. Задан массив из 10 байт. Необходимо вычислить сумму элементов этого массива и поместить ее в регистр AL. Текст программы на ассемблере позволяющий решить данную задачу приведен ниже.
Вы можете изучить и скачать доклад-презентацию на тему Основы языка ассемблер. Использование массивов. Презентация на заданную тему содержит 12 слайдов. Для просмотра воспользуйтесь проигрывателем, если материал оказался полезным для Вас - поделитесь им с друзьями с помощью социальных кнопок и добавьте наш сайт презентаций в закладки!
Массивы Массивом называется последовательный набор однотипных данных, именованный одним идентификатором. Примеры инициализации M1 DD 0,1,2,3,4,5,6,7,8,9 M2 DD 0,1,2,3 Для инициализации всех элементов массива одинаковыми значениями используется оператор DUP: Идентификатор Тип Размер DUP (Значение) Идентификатор - имя массива; Тип - определяет количество байт, занимаемое одним элементом; Размер - константа, характеризующая количество элементов в массиве Значение - начальное значение элементов. a DD 20 DUP (0) - описывает массив a из 20 элементов, начальные значения которых равны 0. Если необходимо выделить память, но не инициализировать ее, в качестве поля Значение используется знак ?. Например, b DD 20 DUP(?)
Программа org 100h .model tiny .data N dw 10 ; Кол-во элементов в массиве. A db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 B db 3, 4, 15,6, 1, 0, 0, 2, 2, 18 C dw 10 dup(0) .code Start: mov si, 0 ; индекс массивов A и B. mov di, 0 ; индекс массива C. M1: mov ah, 0 mov al, A[si] mul B[si] ; Умножение AX = AL*B[si]. mov C[di], ax ; Запись результата. inc si ; Завершение add di, 2 ; тела цикла. cmp si, N jb M1 end Start ret
Задача Задан массив A[N] из элементов типа целое 16-разрядное со знаком. Составить программу суммирования элементов массива и абсолютных значений элементов массива. Обычное суммирование провести в переменной Sum, суммирование по модулю - в переменной Abs.
Программа org 100h .model tiny .data N dw 10 ; Количество элементов в массиве A. A dw -1, -5, 3, 5, 28, -11, 7, 8, 32, -90 Sum dw 0 ; Результат обычного суммирования. Abs dw 0 ; Результат суммирования по модулю. .code Start: mov si, 0 mov cx, N M1: mov ax, A[si] add Sum, ax ; Обычное суммирование. or ax, ax ; Проверка перед суммированием по модулю. jns M2 ; Если число положит. - сразу прибавить к Abs. neg ax ; Если число отрицательное - взять по модулю. M2: add Abs, ax add si, 2 ; индекс на следующий элемент. loop M1 ; Повторять тело цикла N раз. end Start ret
Задача Задан массив A[N] из элементов типа Word (целое 16-разрядное без знака). Составить программу сортировки массива по убыванию. Алгоритм Просматр массив целиком, сравнивая каждый раз парные элементы: A[i-1] и A[i]. Если возникла ситуация A[i-1]
Программа org 100h .model tiny .data N dw 10 ; Количество элементов в массиве A. A dw 0, 4, 1, 2, 15, 10, 20, 11, 3, 5 ChFlag db 0 ; Если ChFlag>0, то в ходе просмотра был обмен. .code Start: mov ChFlag, 0 ; Обнуляем ChFlag перед текущим просмотром. mov cx, N ; Устанавливаем счётчик внутреннего цикла. dec cx ; Пар в массиве на 1 меньше, чем элементов. mov si, 2 ; Устанавливаем индекс массива. M1: mov ax, A[si-2] ; Считываем A[i-1]-й элемент. mov bx, A[si] ; Считываем A[i]-й элемент. cmp ax, bx ; Сравниваем их. jnb M2 mov A[si], ax ; A[i-1]
Читайте также: