Пиши Дома Нужные Работы

Обратная связь

Обработка символьной информации.

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

Задачи:

ü Научиться проводить действия над блоками памяти, представляющими собой последовательности элементов размерами байт и слово.

ü Изучить синтаксис и использование префиксов повторений: REP, REPE и REPNE.

ü Изучить синтаксис и использование команд: пересылки строк – MOVS, LOADS, STOS и их эквивалентные формы; сравнение строк CMPS и его эквивалентную форму;

ü Научиться приемам обработки строк.

Теоретическая часть.

Цепочечные или строковые команды.

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

Особенности строковых команд.

1. Каждая строковая операция представлена двумя командами: одна из них предназначена для обработки строк из байтов (мнемокод содержит букву b (byte)), а другая – для обработки строк из слов (мнемокод содержит букву w (word)). В целом действия этой пары команд совпадают, поэтому обычно про них говорят как про одну команду, и в случае необходимости уточняют, какой именно вариант ее имеют в виду.

2. Для выполнения своих функций строковые команды используют определенные регистры. Полные физические адреса для операндов строковых команд следующие: адрес источника src – пара DS:SI, адрес приемник dst – пара ES:DI.

3. Все строковые команды по завершении основного действия выполняют изменение регистров SI и DI так, чтобы в них оказались адреса соседних элементов строк. Направление просмотра строки зависит состояния флага направления DF:



· если DF = 0, то значение регистров SI и DI увеличиваются на 1 (или 2) при обработке байт (слов);

· если DF = 1, то значение регистров SI и DI уменьшаются на 1 (или 2) при обработке байт (слов).

 

Изменить состояния флаг направления DF можно командами:

· CLD (clear DF) – очистка флага DF (DF:=0) – просмотр слева направо;

· STD (set DF) – установка флага DF (DF:=1) – просмотр справа налево.

Существует пять основных строковых команд, которые можно разделить на две группы:

· команды пересылки строк: MOVS – пересылка, LOADS – загрузка, STOS – запись;

· команды проверки строк: SCAS – сканирование, CMPS – сравнение.

Перечень команд обработки строк представлен в таблице 1.

Замечание. Алгоритм работы команды CMPS заключается в последовательном выполнении вычитания над очередными элементами обеих строк. По результатам вычитания изменяется содержимое регистра флага, но при этом не меняется информация в ячейках памяти, адресуемые регистрами SI и DI. Если строка-источник src меньше, чем строка-приемник dst, то CF = 1. Если строки равны, то ZF = 1. Если строка-источник src больше, чем строка-приемник dst, то CF = 0 и ZF = 0. В этих командах могут быть использованы префиксы повторения REPE - повторить пока dst = src или REPNE - повторить пока dst <> src.


Таблица 1.

Строковые команды

Мнемокод Действие Операнд 1 Операнд 2 Примечание
CMPS Сравнение пары элементов: [DS:SI]=[ES:DI]?; SI:=SI+d; DI:=DI+d, Регистры DS и SI Регистры ES и DI Записывается без операндов. По результатам сравнения изменяется регистр флагов.
SCAS Сканирование строки (сравнения значения аккумулятора AL/AX с байтом/словом в памяти) AL=[ES:DI]?; DI:-DI±1 Регистры ES:DI AL Используется для поиска в строке элемента, равного заданному (в AL или АХ) или отличного от заданного
MOVS Пересылка строки: [DS:SI] => [ES:DI]; SI:=SI+d; DI:=DI+d Источник - регистры DS и SI Приемник - ES и DI Не меняет флаги и потому выход из цикла возможен только по СХ=0.
STOS Перенос элементов из аккумулятора в строку-приемник dst: AL®[ES:DI] регистра AL регистров ES:DI Используется для записи во все ячейки какой-то области памяти одной и той же величины, указанной в регистре AL или АХ
LODS Перенос элементов из строки-источника src в аккумулятор: [DS:SI] ® AL регистрами DS:SI регистр AL (AX) Используется вместе с командой STOS для переписи строк, когда между считыванием и записью элементов строк над ними должна быть выполнена какая-то дополнительная операция

В таблице 2 приведены условные переходы, которые можно использовать с командой CMPS.

Таблица 2. Условные переходы для команд сравнения.

Условие Без знака Со знаком
src < dst JB JL
src <= dst JBE JLE
src <> dst JNE (JNZ) JNE (JNZ)
src = dst JE (JZ) JE (JZ)
src >= dst JAE JGE
src > dst JA JG

Команды префикса повторения.

Строковые команды могут обрабатывать только один байт или слово. При обработке длинных строк используются специальные директивы префиксы повторения. Префикс заставляет команду выполняться несколько раз. В строковых командах можно использовать следующие префиксы повторения:

ü REP (REPeat) – повторять, пока CX > 0. Используется с командами, реализующими операции-примитивы пересылки – MOVS и сохранения элементов цепочек – STOS;

ü repe или repz (repeat while Equal or Zero) – повторять, пока флаг нуля ZF установлен и CX > 0. Используются с командами сравнения – cmps и сканирования – scas для поиска отличающихся элементов цепочек;

ü repne или repnz (repeat while Not Equal or Zero) – повторять, пока флаг нуля ZF сброшен и CX > 0. Используются с командами сравнения – CMPS и сканирования – SCAS для поиска совпадающих элементов цепочек.

Префиксы повторения указываются перед нужной цепочечной командой в поле метки. Перед их использованием необходимо поместить в регистр CX значение, равное количеству повторов строковой команды. При этом цепочечная команда, перед которой стоит префикс, автоматически уменьшает содержимое cx на единицу.

Примеры программ, реализующих действия со строками.

Example 6.1.Фрагмент программы копирования 10 байт из поля отправителя src в поле получатель dst.

.data

src DB ‘ABCDEFGHIJ’ ; строка-источник

dst DB 10 dup (?) ; строка- приемник

.code

ASSUME DS: @data, ES: @data

Main:

MOV AX, @data ; загрузка сегментных регистров

MOV DS, AX ; настройка DS на адрес сегмента данных

MOV ES, AX ; настройка ES на адрес сегмента данных

LEA SI, src ; поместить в SI смещение строки-источника src

LEA DI, dst ; поместить в DI смещение строки-приемника dst

MOV CX, 10 ; длина строки

CLD ; по возрастанию адресов

REP MOVS dst, src ; повторить пока CX > 0

Example 6.2.Написать фрагмент программы сканирования буфера buffer, со сбросом старшего бита каждого байта и сохранением результата в output.

.data

buffer DB 0C8h, 0FBh, 0F5h, 0CAh, 41h, 32h, 43h. 04h, 87h, 8Ch

output DB 10 DUP (?)

.code

CLD

MOV SI, OFFSET buffer ; буфер-источник

MOV DI, OFFSET output ; буфер-приемник

MOV CX, 10 ; длина буфера

L:

LODS buffer ; копировать DS: SI в AL

AND AL, 7FH ; очистить старший бит

STOS output ; сохранить AL в ES: DI

LOOP L ; повторить пока CX <> 0

Example 6.3.Написать фрагмент программы сравнения двух строк S1 и S2 каждая длиной N.

...

CLD ; просмотр вперед

LEA SI, S1 ; в DS:SI поместить начало S1

LEA DI, S2 ; в ES:DI поместить начало S2

MOV CX, N ; в CX длина строк

L:

CMPSB ; сравнить пару элементов

JNE NOEG ; если S1<>S2, то NOEG

LOOP L ; к следующей паре

EQ:

... ; действия, если S1 = S2

NOEG:

... ; действия, если S1 <> S2

Example 6.4.Написать фрагмент программы, который в строке S из 500 символов заменяет первое вхождение символа '*' на точку.

CLD ; просмотр строки вперед

PUSH DS ;

POP ES ; установить ES на сегмент данных

LEA DI, S ; ES:DI=начало S

MOV СХ, 500 ; длина строки

MOV AL,'*' ; символ для поиска

REPNE SCASB ; поиск первого вхождения '*' в S

JNE FIN ; в строке S нет вхождения '*'

MOV BYTE PTR ES:[DI-1],'.' ; замена `*' на точку

FIN: ...

Задания для индивидуальной работы.

Составить программу, реализующую следующие действия (по вариантам).

1. Ввести с клавиатуры строку. Сжать строку, т.е. удалить пробелы и табуляции. Вывести результаты на экран.

2. Ввести с клавиатуры строку. Посчитать количество слов в строке. Вывести результаты на экран.

3. Ввести с клавиатуры строку. Ввести с клавиатуры коротенькую строку - шаблон. Найти шаблон во введенной строке. Вывести на экран "ДА", если шаблон есть, и "НЕТ", если его нет.

4. Ввести с клавиатуры две строки. Сравнить их. Вывести на экран номер позиции, в которой строки различаются.

5. Ввести с клавиатуры строку. Если она длиннее некоторой величины, то обрезать, если короче - растянуть, вставив нужное число пробелов между словами. Вывести результаты на экран.

6. Ввести с клавиатуры строку, состоящую из нескольких слов. Вывести каждое слово на экран в отдельной строке, т.е. выдать слова в столбик.

7. Выделить из исходной строки подстроку символов заданной длины с указанного номера позиции.

8. Определить номер позиции, с которой начинается первое слева вхождение заданной конфигурации символов в исходную строку.

9. Дана строка символов (введена с клавиатуры). Сформировать новую строку из исходной путем заданного числа повторений исходной строки.

10. Заданы две строки. Проверить вхождение каждого символа строки 1 в строку 2. Если какой-либо (первый слева) символ строки 1 не представлен в строке 2, то фиксируется номер позиции этого символа в строке 1.

11. Инвертировать заданную строку.

12. Найти максимальный и минимальный символы в исходной строке.

13. Удалить из исходной строки повторные вхождения заданного символа.

14. Удалить из исходной строки заданную конфигурацию символов.

Контрольные вопросы и задания.

1. Назовите строковые команды, выполняемые текстовым редактором, которые могут быть реализованы на языке ассемблера.

2. Напишите процедуру для копирования данных из одной области памяти в другую. Предусмотреть вывод данных до копирования, и после копирования.

3. Реализуйте процедуру копирования данных с использованием команд MOVSB и MOVSW.

4. Реализуйте процедуру копирования данных по убыванию адресов.

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

6. Выясните, что будет, если в SI поместить смещение строки dst, а в DI строки src.

7. Можно ли вместо префикса REP использовать другой, например REPE. Если, да, то почему.

8. Имеется следующее определение данных:

DATASG SEGMENT PARA

CONAME DB ‘SPACE EXPLORES INC.’

PRLINE DB 20 DUP (‘ ‘)

Используя цепочечные команды, выполните (запишите фрагмент программы):

a). Пересылку данных из CONAME в PRLINE слева направо.

b). Пересылку данных из CONAME в PRLINE справа налево.

c). Загрузку третьего и четвертого байта области CONAME в регистр AX.

d). Сохранение содержимого регистра AX по адресу PRLINE + 5

e). Сравнение данных в областях CONAME и PRLINE.

f). Сканирование области CONAME и поиск в ней символов «пробел». Если символ найден, то переслать его в регистр BH.

9. Напишите процедуру, реализирующий сравнение командой cmps две цепочки байт в памяти string1 и string2 и помещающий первый несовпавший байт из string2 в регистр al. Для загрузки этого байта в регистр-аккумулятор al использовать команду lods.

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

Битовые операции

Цель:Рассмотреть приемы использования битовых операций при программировании на языке ассемблер.

Задачи:

ü Изучить синтаксис и приемы использование логические команды: отрицания – NOT, конъюнкции – AND, дизъюнкции – OR, исключающая ИЛИ – XOR и проверки – TEST.

ü Изучить синтаксис и использование команд:

· логических сдвигов влево и вправо – SHL и SHR;

· арифметических сдвигов влево и вправо – SAL и SAR;

· циклических сдвигов влево и вправо – ROL и ROR;

· циклических сдвигов влево и вправо через перенос – RCL и RCR;

ü Научиться производить вычисления логических выражений.

Теоретическая часть.

Логические команды.

Наряду со средствами арифметических вычислений, система команд микропроцессора имеет также средства логического преобразования данных. Под логическими понимаются такие преобразования данных, в основе которых лежат правила формальной логики:отрицание (НЕ), конъюнкцию (И) и дизъюнкцию (ИЛИ).

Логическим командам присущ ряд общих черт:

1. Они реализуют поразрядные операции: i-й разряд результата зависит только от i-ых разрядов операндов. При этом одна и та же операция выполняется сразу над всеми разрядами операндов одновременно, параллельно.

2. Формальная логика работает на уровне утверждений истинно и ложно. Во всех логических командах бит 1 трактуется как "истина", а бит 0 - как "ложь". Именно при такой трактовке эти команды и реализуют логические операции отрицания, конъюнкции и дизъюнкции.

3. Эти команды меняют все флаги условий, но интерес обычно вызывает только флаг нуля ZF. Другие флаги в основном предназначены для работы с числами и в логических операциях малоинформативны.

4. Операндами логических команд должны быть либо байты, либо слова, но не то и другое одновременно.

Логические команды:

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

AND – производит поразрядное логическое умножение двух операндов и помещает результат в первый операнд;

OR – производит поразрядное логическое сложение двух операндов. и помещает результат в первый операнд;

XOR – производит поразрядное логическую операцию исключающего ИЛИ над двумя операндами и помещает результат в первый операнд;

TEST – аналог команды AND, выполняет поразрядно логическую операцию AND над битами операндов. Состояние операндов остается прежним, изменяются только флаги нуля ZF, знака SF, и четности PF, что дает возможность анализировать состояние отдельных битов операнда без изменения их состояния. Результат логического умножения никуда не записывается.

Синтаксис:NOT dst ;(dst) ← not (dst)

AND dst, src ;(dst) ← (dst) and (src)

OR dst, src ;(dst) ← (dst) or (src)

XOR dst, src ;(dst) ← (dst) xor (src)

TEST dst, src ;(dst) test (src)

В этих командах допустимы следующие комбинации операндов:

dst r8 m8 r16 m16
src i8, r8, m8 i8, r8 il6, rl6, ml6 il6, rl6

В таблице 6.2. приведены значения регистра флагов, устанавливаемые логическими командами.

Examle 7.1.Cодержимое младшей части регистра AX поразрядно умножить на двоичное число 0010 1010b (2Аh)

MOV AL, 0001 1100b; AL = 0001 1100b (1Ch)

AND AL, 0010 1010b; AL = 0000 1000b (08h)

Examle 7.2.Содержимое младшей части регистра AL логически сложить с содержимым его старшей части.

MOV AL, 1110 1100b; (ECh)

MOV AH, 1010 1010b; (AAh)

OR AL, AH; AL = 1110 1110b (EEh) AH = 1010 1010b (AAh)

Examle 7.3.Над содержимым АL и числом 1Аh (0001 1010b) произвести операцию исключающее ИЛИ.

MOV AL, 1110 0111b; AL = 1110 0111b (E7h)

XOR AL, 1Ah; AL = 1111 1101b (FDh)

Examle 7.4.

MOV BH, 1100b

TEST BH, 0011b; = 00000000b -> ZF=1

TEST BH, 1010b; = 00001000b -> ZF=0

Examle 7.5.Над содержимым младшей части регистра AХ выполнить операцию отрицания.

MOV AL, 0001 1100b; AL = 0001 1100b (1Сh)

NOT AL; AL = 1110 0011b (E3h)






ТОП 5 статей:
Экономическая сущность инвестиций - Экономическая сущность инвестиций – долгосрочные вложения экономических ресурсов сроком более 1 года для получения прибыли путем...
Тема: Федеральный закон от 26.07.2006 N 135-ФЗ - На основании изучения ФЗ № 135, дайте максимально короткое определение следующих понятий с указанием статей и пунктов закона...
Сущность, функции и виды управления в телекоммуникациях - Цели достигаются с помощью различных принципов, функций и методов социально-экономического менеджмента...
Схема построения базисных индексов - Индекс (лат. INDEX – указатель, показатель) - относительная величина, показывающая, во сколько раз уровень изучаемого явления...
Тема 11. Международное космическое право - Правовой режим космического пространства и небесных тел. Принципы деятельности государств по исследованию...



©2015- 2024 pdnr.ru Все права принадлежат авторам размещенных материалов.