Изучение системы команд Ассемблера. Команды обработки строк данных и команды организации циклов 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Изучение системы команд Ассемблера. Команды обработки строк данных и команды организации циклов



Практическое занятие № 12

«Изучение системы команд Ассемблера. Команды обработки строк данных и команды организации циклов»

 

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

 

Образовательные результаты, заявленные в ФГОС:

Студент должен уметь:

производить инсталляцию и настройку программного обеспечения компьютерных систем;

 

знать:

основные компоненты программного обеспечения компьютерных систем.

 

Команды обработки строк данных

Строка – это последовательность байтов или слов, размещаемых в смежных ячейках памяти.

 

Таблица 12.1 – Команды обработки строк

Название Мнемокод
Пересылка строки MOVS, MOVSB
Загрузка символа из строки LODS, LODSB
Запись символа в строку STOS, STOSB
Сканирование строки SCAS, SCASB
Сравнение строки CMPS, CMPSB

 

Если обрабатываемая строка состоит из 16-разрядных машинных слов, то применяется мнемокоды команд без буквы “B” на конце (например, LODS); если строка состоит из байтов, то – мнемокоды команд с буквой “B” (например, LODSB). Операнды команд после из мнемокодов, как правило, не указываются; везде используется неявная адресация.

Команда MOVS, MOVSB (move strings) – это пересылка элемента строки из одной области памяти в другую (в отличие от MOV, которая не может выполнять пересылки «память-память»). Строка-источник адресуется регистрами DS:SI (то есть находится в сегменте памяти, на который указывает DS, и имеет смещение, находящееся в SI), строка-получатель – регистрами ES:DI. Таким образом, строка-получатель размещается в дополнительном сегменте данных, если только значения DS и ES не равны.

Содержимое индексных регистров SI и DI во время работы строковых команд не остаётся неизменным – оно также изменяется автоматически в соответствии с правилом SI←SI+delta, DI←DI+delta. Здесь delta=1 для байтовых строк и delta=2 для строк, состоящих из 16-разрядных машинных слов.

В ряде случаев возникает необходимость в пересылке строки в обратном порядке, начиная не с первого, а с последнего элемента. Содержимое индексных регистров при этом должно не увеличиваться, а уменьшаться. Направление изменения содержимого задаётся с помощью флага DF в регистре FLAGS микропроцессора: при DF=0 используется «плюс», при DF=1 – «минус». Сам же флаг DF управляется специальными командами: CLD (сбросить флаг, это значение по умолчанию) и STD (установить флаг).

Команда LODS, LODSB (load from string). Команда осуществляет загрузку элемента строки (слова или байта) в регистр AX или AL соответственно. Строка адресуется с помощью регистров DS:SI.

Команда STOS, STOSB (store to string). С помощью этой команды производится заполнение строки словом (байтом) из регистра АХ или AL соответственно. Заполняемая строка адресуется с помощью регистров ES:DI.

Команда SCAS, SCASB (scan string). Эта команда используется для так называемого «сканирования» одной строки в поисках нужного элемента (слова или байта). В процессе работы команды осуществляется сравнение элемента строки, расположенного по адресу ES:DI, со значением в регистре AX (или AL) путём вычитания; результат вычитания не фиксируется, но устанавливаются соответствующие флаги. Как и при выполнении прочих строковых команд, производится автоинкрементирование (либо автодекрементирование) регистра DI.

Команда CMPS, CMPSB (compare strings). Команда осуществляет поэлементное сравнение элементов двух строк (слов или байтов), одна из которых, как и прежде, расположена в памяти по адресу в регистрах DS:SI, вторая – по адресу в ES:DI. При выполнении этой команды производится вычитание элемента строки с адресом в SI из элемента строки с адресом в DI; результат вычитания никуда не записывается, но зато устанавливаются соответствующие флаги.

ZF – флаг нуля. Устанавливается в 1, если результат предыдущей команды – ноль.

Команды организации циклов

При работе на Ассемблере можно организовать циклы, используя команды условных переходов. Однако, кроме этого, 8086-совместимые МП предоставляют в распоряжение программиста специальные команды циклов LOOP, LOOPNZ, LOOPZ. Все эти команды используют метку, расположенную выше по программе. Часть программы между меткой и какой-либо из рассматриваемых команд и есть тело цикла. Перед входом в цикл следует записать в регистр CX число повторений цикла. Каждый раз при очередном повторении тела цикла процессор будет автоматически вычитать единицу их СХ. Цикл закончится, если:

- СХ будет равен 0 (для команды LOOP);

- СХ будет равен 0 или флаг ZF будет равен 1 (для команды LOOPNZ);

- СХ будет равен 0 или флаг ZF будет равен 0 (для команды LOOPZ).

Для организации циклов при работе со строковыми командами имеются специальные команды-префиксы REP (repeat), REPE, REPNE. Они записываются перед основной командой (например, REP MOVSB) и обеспечивают её выполнение не один, а несколько раз, организуя по сути дела аппаратный (очень быстрый) цикл. Число повторений предварительно записывается в CX и на каждом шаге содержимое CX автоматически уменьшается на 1.

Префикс REP («повторять, пока не обнулится счётчик») анализирует только одно условие окончания повторений, а именно CX = 0.

Префикс REPE («повторять, пока равно») анализирует следующее составное условие окончания повторений: (CX = 0) ИЛИ (ZF = 0).

Префикс REPNE («повторять, пока не равно») в качестве условия окончания повторений использует следующее: (CX = 0) ИЛИ (ZF = 1).

 

Примеры программ

Пример 1: вычислить сумму 1+2+…+19+20 и записать результат в регистр SI.

Удобно программировать вычисление этой суммы в обратном порядке, т.е. начиная с 20 – тогда можно воспользоваться регистром с убывающим содержимым. В данном случае нам подходит цикл LOOP со счетчиком в CX – ведь его содержимое как раз уменьшается на каждой итерации цикла.

MOV AX, 0; будем накапливать сумму в АХ

MOV CX, 20; подготовим счётчик цикла

MET:               ; этой меткой обозначено начало цикла

ADD AX, CX; прибавляем очередное слагаемое

LOOP MET; переход на начало цикла, если СХ не равно нулю

MOV SI, AX; выдадим результат.

 

Пример 2: Дан массив из трех байтов. Получить другой массив, в котором каждый элемент первого массива увеличен на 5.

Рассматривая массив как строку байтов, разместим исходные данные в сегменте данных (DS) с адреса 0000h, а результат – в дополнительном сегменте (ES) также с адреса 0000h.

MOV SI, 0; начальное значение для LODS (источник данных)

MOV DI, 0; начальное значение для STOS (приемник)

MOV CX, 3; в нашем примере – три исходных элемента

MET:

LODSB     ; загрузим очередной байт массива в AL

ADD AL, 5; обработаем его, как указано в задаче

STOSB      ; запишем обработанный байт в массив результата

LOOP MET

 

Задания для практической работы

 

1 Составить таблицу «Команды обработки строк» с указанием названия команды, ее мнемокода, адресов источника и приемника.

2 Составить таблицу «Команды организации циклов» с указанием названия команды, ее мнемокода и выполняемого действия.

3 Разработать программу на языке Ассемблер для выполнения задачи в соответствии с вариантом.

 

Таблица 12.2 – Таблица вариантов

Вариант Задача
1 Дана последовательность 15 символов (строка), размещённая по адресу DS:0000h. Переписать эту строку (сделать копию) в другое место оперативной памяти, по адресу ES:0050h.
2 Дана последовательность из 10 чисел (байтов), размещённых в сегменте данных, начиная с адреса DS:0010h. Вычислить их сумму и записать результат по адресу ES:0020h.
3 Дана последовательность из 5 чисел (байтов), размещённых в сегменте данных, начиная с адреса DS:0000h. Вычислить сумму квадратов этих чисел и записать результат по адресу ES:0010h.
4 Дана последовательность из 6 символов (байтов), размещённых в сегменте данных, начиная с адреса DS:0000h. Записать строку в обратном порядке по адресу ES:0050h
5 Дана последовательность из 10 символов (байтов), размещённых в сегменте данных, начиная с адреса DS:0000h. Скопировать первые 5 символов в область по адресу ES:0050h, а вторые 5 символов – по адресу ES:0500h
6 Дана последовательность из 8 символов (байтов), размещённых в сегменте данных, начиная с адреса DS:0000h. Поменять местами первые 4 и последние 4 символов и поместить их в область памяти по адресу ES:0000h
7 Дана последовательность из 9 символов (байтов), размещённых в сегменте данных, начиная с адреса DS:0000h. Скопировать строку по адресу ES:0000h, поменяв местами первый и последний символы.
8 Дана последовательность из 8 чисел (байтов), размещённых в сегменте данных, начиная с адреса DS:0000h. Вычислить сумму первых 4 и сумму последних 4 чисел. Разность первой и второй суммы поместить в регистр DX.
9 Дана последовательность из 7 чисел (байтов), размещённых в сегменте данных, начиная с адреса DS:0000h. Вычислить сумму произведений чисел на их номер в строке и записать результат по адресу ES:0020h.
10 Дана последовательность из 10 чисел (байтов), размещённых в сегменте данных, начиная с адреса DS:0000h. Вычислить сумму с третьего по девятое число и записать результат по адресу ES:0020h.

Контрольные вопросы

 

1 В каком случае в мнемокоде команд обработки строк ставится буква В?

2 Как изменить направление изменения содержимого индексных регистров?

3 Опишите работу команды LOOP.

4 Как работает префикс REP? Можно ли его использовать не со строковыми командами?



Поделиться:


Последнее изменение этой страницы: 2020-03-27; просмотров: 408; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.153.38 (0.01 с.)