Как сделать массив в ассемблере

Обновлено: 06.07.2024

Массивы Массив - структурированный тип данных, состоящий из некоторого числа элементов одного типа.

В Ассемблере массивом можно назвать несколько подряд идущих в памяти байт, слов или двойных слов , но все элементы массива должны быть либо байтами, либо словами, либо двойными словами, т.е. иметь одинаковую длину . В качестве имени массива используется символическое имя адреса (смещения) первого байта первого элемента массива.

Для понимания расположения элементов массива в памяти и обращения к ним необходимо вспомнить основные типы данных микропроцессора и расположение байтов в них (рис 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 слайдов. Для просмотра воспользуйтесь проигрывателем, если материал оказался полезным для Вас - поделитесь им с друзьями с помощью социальных кнопок и добавьте наш сайт презентаций в закладки!

500
500
500
500
500
500
500
500
500
500
500
500

Массивы Массивом называется последовательный набор однотипных данных, именованный одним идентификатором. Примеры инициализации 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]

Читайте также: