Практическая работа специальности 09.02.01.

  • docx
  • 28.11.2022
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала ПЗ15_ Команды обработки строк данных и команды организации циклов.docx

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

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

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

Теория

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

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

 

Таблица 7.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 Разработать программу на языке Ассемблер для выполнения задачи в соответствии с вариантом.

 

Таблица 7.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?

5.  Можно ли его использовать не со строковыми командами?