Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод.Указания к Лаб.Раб по АВС.doc
Скачиваний:
10
Добавлен:
05.03.2016
Размер:
2.2 Mб
Скачать

Содержание отчета

Отчет по лабораторной работе должен содержать:

  1. титульный лист;

  2. тему и цель работы;

  3. листинг программы;

  4. дамп памяти после выполнения программы;

  5. выводы по работе.

Что нужно знать для защиты отчета

Для защиты отчета по лабораторной работе необходимо внимательно изучить тему «Команды обработки строковых последовательностей». Вопросы для защиты лабораторной работы индивидуальны и задаются в форме небольших примеров – задач. Кроме того, необходимо четко понимать правила настройки регистров, которые по умолчанию используются этими командами, а также работу всех других команд, перечисленных в «Общих сведениях». При защите лабораторной работы Вы должны уметь отвечать на любые вопросы о работе Вашей программы.

Рекомендуемая литература

  1. Юров В. Assembler / В. Юров. – СПб.: Питер, 2001.- 624с.:ил.

  2. Чекатков А.А. Использование TA при разработке программ / АА. Чекатков. – К.: Диалектика, 1995.

  3. Сван Т. Освоение Turbo Assembler./ Т. Сван. – К.: Диалектика, 1996.

Лабораторная работа № 7

Тема: Обработка одномерных и двухмерных массивов в ассемблер-программах.

Цель работы: Получить навыки организации и обработки одно- и двухмерных массивов на ассемблере.

Общие сведения

Для реализации задач обработки одно и двухмерных массивов на языке ассемблер необходимо помнить, что в этом языке не существует таких типов данных как массив. Организация работы с памятью, в которой располагаются обрабатываемые данные, как с массивом одно или двух- мерным – задача программиста. При этом активно используется такой вид адресации, как косвенная адресация. Причем, если мы работаем с одномерным массивом, то в качестве индекса элемента массива может выступать один из индексных или базовых регистров. Если работаем с двухмерным массивом, то логично использовать базово-индексную адресацию. Причем, удобно какой-либо из базовых регистров использовать для индексации строки, а какой-либо индексный регистр – для индексации столбца. При этом, во время перехода от строки к строке для формирования индекса новой строки достаточно изменить значение базового регистра содержащего номер текущей строки на длину строки в байтах.

Варианты заданий

  1. В сегменте данных продекларировать массив из семи однобайтных элементов. Программно заполнить элементы массива значениями из PSP (0-ой … 6-ой байты PSP). Определить значение суммы элементов массива, его минимальный и максимальный элемент.

  1. В сегменте данных зарезервировать область памяти под двухмерный массив (5х5) однобайтовых элементов. Программно инициировать его значениями, вычисленными по формуле i х j, где i и j – номер строки и столбца в разделе данных. Определить максимальный элемент главной диагонали.

  1. В сегменте данных описать массив из 5-ти однобайтовых элементов. В сегменте кода объявить шесть меток. Значения элементов массива инициировать значениями длин фрагментов программы между соседними метками. Определить самый короткий и самый длинный фрагменты программы между метками.

  1. В сегменте данных организовать два массива каждый по семь элементов. Одновременно декларировать семь областей памяти, объявляя их как DB, DW, DD, DB, DW, DD, DB, причем в каждой области предусмотреть какое-либо количество данных (инициированных или нет). Каждый элемент первого массива заполнить значением смещения к последовательным декларированным областям памяти в сегменте данных. Каждый элемент второго массива заполнить длинами декларированных областей в байтах, используя для формирования второго массива значения первого. Определить самую минимальную по длине объявленную область памяти.

  1. Декларировать в сегменте данных двухмерный массив (3х7), однобайтовые элементы которого программно инициировать значениями, вычисленными в соответствии с выражением i or j, где i и j номера строк и столбцов. Определить произведение элементов нечетных столбцов. Значения произведений записать в отдельный массив.

  1. Объявить в сегменте данных массив из пяти слов. Элементы этого массива програмно заполнить значениями полей длиною в слово, прочитанных из PSP. Причем, читать требуется на подряд данные в два байта (слово) из PSP, а именно те поля, которые имеют длину – слово по структуре PSP (см. структуру PSP во второй лабораторной работе). Найти сумму значений этих полей и минимальное их значение.

  1. Описать в сегменте данных одномерный массив длиною в 10 байт. Программно инициировать элементы массива значениями, вычисленными по формуле not( i or i+1), где i – индекс элемента массива. Выполнить сортировку элементов массива по возрастанию методом «пузырька».

  1. Зарезервировать в сегменте данных одномерный массив длиною в 12 байт. Программно инициировать массив значениями, вычисленными по формуле ( i хor i+1), где i – индекс элемента массива. Выполнить сортировку элементов массива по убыванию методом перебора.

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

нулевой элемент = 5,

а последующие ai = ai-1*2i.

  1. Выполнить сортировку элементов массива по убыванию методом «пузырька». Описать в сегменте данных одномерный массив из 5-ти слов, элементы которого программно инициировать следующими значениями:

нулевой = FFh,

а последующие ai = ai-1 / 2i.

Выполнить сортировку элементов массива по возрастанию методом перебора.

  1. Описать в сегменте данных двухмерный массив (4х4) из элементов длиною в слово. Программно заполнить его значениями по следующей схеме - элемент a0,0 = ABCDh, каждый последующий элемент определяется так: к предыдущему прибавляется 1 и выполняется обмен значений младшего и старшего байтов. Выполнить сортировку элементов главной диагонали по убыванию методом перебора.

  1. Описать в сегменте данных двухмерный массив (7х7) слов. Программно заполнить его значениями по следующей схеме - элемент a0,0 = 5277h, каждый последующий элемент определяется так: из предыдущего вычитается 1 и выполняется обмен значений младшего и старшего байтов. Выполнить сортировку элементов нечетных строк по возрастанию методом «пузырька».

  1. Продекларировать в сегменте данных двухмерный массив для формирования таблицы истинности логической функции F

.

Выполнить программную инициализацию таблицы истинности её значениями.

  1. Зарезервировать с сегменте данных область байтовых данных, длину которой необходимо будет уточнить в программе после первого ассемблирования, так как эта область должна иметь длину сегмента кода Вашей программы. Организовать программную инициализацию этой области значениями из сегмента кода программы. Учитывая то, что коды команды mov могут принимать одно из следующих значений: 88h, 89h, 8Ah, 8Bh, 8Ch, 8Eh, A0h, A2h, A3h, A8h, B0h…BFh, C6h

  2. и C7h, определить количество использований данной команды в программе, то есть поиск кодов этой команды с подсчетом их количества.

  1. Продекларировать в сегменте данных двухмерный массив для формирования таблицы истинности логической функции F

Выполнить программную инициализацию таблицы истинности её значениями.

  1. В сегменте данных описать одномерный массив длиною 10 однобайтовых элементов. Программно инициировать эти элементы значениями чисел Фибоначчи, начиная от числа 3. Определить сумму четных элементов и произведение нечетных.

  1. Зарезервировать в сегменте данных область под двухмерный массив (5х5), элементы которого имеют длину - слово. Программно заполнить его значениями, прочитанными из кодового сегмента начиная с нулевого смещения. Выполнить сортировку элементов вспомогательной диагонали по возрастанию методом “пузырька”.

  1. Продекларировать в сегменте данных двухмерный массив для формирования таблицы истинности логической функции F

.

Выполнить программную инициализацию таблицы истинности её значениями.

19. В сегменте данных сформировать два матричных массива однобайтовых элементов: один массив - (3 х 4), а другой – (4 х 3). При декларации массивов инициировать их произвольными значениями. Выполнить программное умножение этих массивов (по правилу умножения матриц). Результаты умножения записать в третий, заранее зарезервированный в сегменте данных матричный массив.

  1. Описать в сегменте данных двухмерный массив (7х7) байт. Программно заполнить его значениями, прочитанными из PSP, начиная с нулевого байта. Вычислить суммы элементов четных столбцов. Результаты записать в отдельный, зарезервированный в сегменте данных, массив.

  1. Продекларировать в сегменте данных двухмерный массив для формирования таблицы истинности логической функции F

.

Выполнить программную инициализацию таблицы истинности её значениями.

  1. Продекларировать в сегменте данных массив длиною в 10 слов. Программно инициировать элементы массива значениями из полей PSP, имеющих длину – 4-е байта (см. структуру PSP во второй лабораторной работе). Учесть тот факт, что эти поля PSP содержат четырех байтовые полные (сегмент и смещение) адреса программ обработчиков прерываний, а значит, полученный массив будет в словах попеременно содержать значение сегментного адреса и соответствующее ему значение смещения. Определить, на каких местах в Вашем массиве будут значения сегментных адресов, а на каких – значения смещений, учитывая принцип расположения данных в памяти –«младший по младшему, старший по старшему адресу». Выполнить следующую обработку полученного массива - определить минимальный сегментный адрес и максимальное из значений всех смещений.

  1. Описать в сегменте данных матрицу (5х4) однобайтовых элементов инициированных произвольными значениями. Вычислить произведения элементов нечетных строк. Результаты записать в отдельный зарезервированный массив, при декларации которого продумать необходимую для сохранения произведений длину элементов массива (слова или двойные слова).

  1. Описать в сегменте данных матричный массив (4х4) однобайтовых элементов. Программно инициировать его значениями, вычисленными по формуле (i + j), где i и j – индексы элементов матрицы. Вычислить произведение элементов вспомогательной диагонали матричного массива.

  1. Описать в сегменте данных матричный массив (5х4) однобайтовых элементов инициированных произвольными значениями. Определить количество отрицательных, положительных и нулевых элементов полученного матричного массива.

  1. Описать в сегменте данных матричный массив (5х5) однобайтовых элементов инициированных произвольными значениями. Выполнить программное транспонирование матрицы.

  1. Продекларировать в сегменте данных двухмерный массив для формирования таблицы истинности логической функции F

.

Выполнить программную инициализацию таблицы истинности её значениями.

  1. Сформировать в сегменте данных массив из 26 однобайтовых элементов, который инициировать значениями символов нижней и верхней частей клавиш верхнего ряда алфавитно-цифровой части клавиатуры. Выполнить сортировку полученного массива по возрастанию методом «пузырька».

  1. Описать в сегменте данных массив длиною 49 байтовых элементов, инициированных произвольными значениями. Одновременно зарезервировать в сегменте данных область под матричный массив (7 х 7) однобайтовых элементов. Выполнить программное формирование матричного массива путем заполнения его по спирали значениями из одномерного массива.

  1. Зарезервировать в сегменте данных массив из 256 байтовых элементов. Программно скопировать в него содержимое PSP Вашей программы. Определить количество элементов полученного массива = 0h, количество элементов = FFh, количество элементов <= 0Ah и количество элементов > 0Ah.

Пример программы с комментариями

Data SEGMENT

array DB 7, 4, 3, 2, 5

DB 10, 1,12, 8, 7

DB 15, 7, 8, 5, 9

DB 14, 5, 2, 3, 7

DB 5, 2, 9, 6, 4

min DB ?

sum DB 0

count DW 5

Data ENDS

Code SEGMENT

ASSUME DS:Data,CS:Code,SS:Stack1,ES:Data

Start: mov AX,Data

mov DS,AX

;Сортировка первого столбца

mov CX,5 ;счетчик внешнего цикла

lea BX,array ;настройка регистра BX на смещение к массиву

mov DI,BX ;сохранение адреса элемента массива,

;с которого начинается данный шаг сортировки

;открытие внешнего цикла, организующего обработку всех

;элементов столбца

L1: mov AL,[BX];запись на AL значения первого элемента

;обрабатываемой части массива

mov SI,BX ;запись на SI смещения к элементу массива

push CX ;сохранение счетчика внешнего цикла в стеке

mov CX,count ;запись на CX значения счетчика

;внутреннего цикла;

;внутренний цикл, выполняющий поиск большего элемента

;во фрагменте массива

L2: add BX,5 ;формирование на BX смещения к следующему

;элементу обрабатываемого столбца (5 - длина строки)

cmp AL,[BX];сравнение значения элемента записанного

;на AL с текущим элементом массива

jns M1 ;переход на метку М1, если

;сравниваемый элемент меньше элемента на AL

jz M1 ;переход на метку М1, если

;сравниваемый элемент равен элементу на AL

mov AL,[BX];если предыдущие условия не выполняются,

;то делаем обмен значений

;(первого во фрагменте массива элемента с

;найденным большим элементом)

mov SI,BX

M1: loop L2 ;возвращение к первой команде внутреннего

; цикла

;обмен значений между найденным большим элементом

;и первым в обрабатываемом фрагменте массива элементом

mov DL,[DI];

mov [DI],AL

mov [SI],DL

;подготовка адресов для продолжения обработки

add DI,5 ;на DI формируем смещение к след. элементу

;столбца (DI + длина строки)

mov BX,DI ;запись смещения к след. элементу столбца

;на BX

dec count ;уменьшение на 1 значения счетчика

;внутреннего цикла

pop CX ;восстановление из стека значения

;счетчика внешнего цикла

loop L1 ;переход к первой команде внешнего цикла

;Поиск минимального элемента главной диагонали массива

lea BX,array ;настройка BX на смещение к началу

;массива

mov AL,[BX] ;запись на AL значения элемента массива

mov CX,4 ;на СX - счетчик цикла

L3: add BX,6 ;на BX - смещение к след. элементу главной диагонали

cmp AL,[BX] ;сравнение текущего элемента массива с сохраненным на AL

js M2 ;если текущий элемент больше элемента на AL

;переход к метке М2

jz M2 ;если текущий элемент равен элементу на AL

;переход к метке М2

mov AL,[BX] ;иначе, запись на AL значения текущего

;элемента

M2: loop L3 ;переход к первой команде цикла

mov min,AL ;сохранение найденного минимального ;значения в памяти

;Вычисление суммы элементов 3-ей строки массива

xor AL,AL ;обнуление AL

mov CX,5 ;запись на CX счетчика цикла

lea BX,array+10 ;запись на BX смещения к началу массива

mov SI,0 ;на SI смещение к первому элементу строки L4: add AL,[BX][SI] ;суммирование элементов строки

inc SI ;увеличение индекса элемента строки

loop L4 ;переход к первой команде цикла

mov sum,AL ;сохранение значения суммы в памяти

mov ah,4ch

int 21h

code ENDS

stack1 segment 'stack'

DB 80 dup (0)

stack1 ends

end start