П.В. Лекомцев
Строковые операции в MASM32
Методическое пособие
по дисциплине «Основы вычислительной техники»
Ижевск 2008
УДК
Рецензент: С.А.Трефилов, канд. техн. наук, доцент
Зав. кафедрой: Ю.В.Турыгин, докт. техн. наук, профессор
В пособии рассмотрены команды работы со строками при программировании на языке Assembler для Win32, примеры использования данных команд. Даны индивидуальные задания к выполнению лабораторной работы, сформулированы требования к содержанию отчета к лабораторной работе, приведен список рекомендуемой методической и справочной литературы.
ã Издательство ИжГТУ, 2008
Содержание
Цель работы
Задание на лабораторную работу
Содержание отчета
Цепочечные команды в языке Assembler
Примеры использования цепочечных команд
Список рекомендуемой литературы
Приложение А (обязательное) Варианты индивидуальных заданий
Приложение B. Пример программы в MASM32
Цель работы
Целью данной лабораторной работы является освоение навыков программирования на языке Assembler для Win32, в частности освоения команд работы со строками и их практического применения в операциях поиска, копирования, изменения данных.
|
|
Задание на лабораторную работу
Разработать алгоритм и программу на языке Assembler для Win32 в соответствии с индивидуальным заданием. Ввод и вывод осуществить в диалоговом окне Windows. Варианты заданий приведены в Приложении A.
Содержание отчета
- Титульный лист
- Задание на лабораторную работу
- Введение
- Разработка схемы алгоритма решения задачи
- Разработка программы
- Результаты вычислительного эксперимента
- Выводы
- Список литературы
Цепочечные команды в языке Assembler
Цепочечные команды иногда называют командами обработки строк символов. Однако это название является частным случаем, когда размер элемента последовательности (символа) составляет байт (ASCII-кодировка) или слово (UNOCODE). Цепочка же более общее название для случаев, когда размер элемента последовательности превышает байт и составляет слово или двойное слово. Таким образом, цепочечные команды позволяют проводить действия над блоками памяти, представляющими собой последовательности элементов размеров в байт (8бит), слово (16бит) и двойное слово (32бита).
Перечислим команды, реализующие операции обработки цепочек:
MOVS dest,src -команда передает байт, слово или двойное слово из цепочки, адресуемой DS:[ESI], в цепочку dest, адресуемую ES[EDI]. При этом EDI и ESI автоматически корректируются согласно значению флага DF. Допускается явная спецификация MOVSB (byte), MOVSW (word), MOVSD (word). Dest и src можно явно не указывать.
|
|
LODS src - команда загрузки цепочки в аккумулятор. Имеет разновидности LODSB, LODSW, LODSD. При выполнении команды байт, слово, двойное слово загружается соответственно в AL,AX,EAX. При этом ESI автоматически изменяется на 1 в зависимости от значения флага DF. Префикс REP не используется.
STOS dest - команда, обратная LODS, т.е. передает байт, слово или двойное слово из аккумулятора в цепочку и автоматически корректирует EDI.
SCAS dest - команда сканирования цепочки. Команда вычитает элемент цепочки dst из содержимого аккумулятора (AL\AX\EAX) и модифицирует флаги. Префикс REPNE позволяет найти в цепочке нужный элемент.
CMPS dest,src - команда сравнения цепочек. Данная команда производит вычитание байта, слова или двойного слова цепочки dst из соответствующего элемента цепочки src. В зависимости от результата вычитания модифицируются флаги. Регистры EDI и ESI автоматически продвигаются на следующий элемент. При использовании префикса REPE команда означает – сравнивать, пока не будет, достигнут конец цепочки или пока элементы не будут равны. При использовании префикса REPNE команда означает – сравнивать, пока не достигнут конец цепочки или пока элементы будут равны.
REP - префикс, означающий повтор строковой операции до обнуления ECX. Префикс имеет также разновидности REPZ (REPE) – выполнять, пока не нуль (ZF=1), REPNZ (REPNE) – выполнять, пока нуль. Цепочечная команда без префикса выполняется один раз.
Если программа пишется в Win32, то заботиться о сегментных регистрах DS и ES не придется, поскольку программа пишется в одном большом сегменте. Флаг DF устанавливается или сбрасывается командами STD и CLD соответственно.
Примеры использования цепочечных команд
Рассмотрим несколько типичных алгоритмов с использованием цепочечных команд.
Пример 1. Копирование содержимого STR1 в STR2. Команда CLD сбрасывает флаг DF, это необходимо, чтобы на каждом шаге копирования происходило увеличение (а не уменьшение) содержимого EDI и ESI на единицу.
CLD
MOV ECX,N
LEA ESI,STR1
LEA EDI,STR2
REP MOVSB
Пример 2. Сравнение двух строк.
CLD
MOV ECX,N;длина сравниваемых строк
LEA ESI,STR1
LEA EDI,STR2
REPE CMPSB
JNE NO_SAME
JMP _SAME
...
Пример 3. Заполнение строки некоторым символом.
CLD
MOV AL,65
MOV ECX,10
LEA EDI,STR2
REP STOSB
Пример 4. Поиск в строке знаков '$' и замена их на подчеркивание.
CLD
MOV AL,'$'
LEA EDI,STR2
MOV ECX,20
LO:
REPNE SCASB;здесь поиск
JNZ DONE
MOV BYTE PTR [EDI-1],"_";а здесь замена
JMP LO
DONE:
Пример 5. Поиск подстроки в строке. Строка STR1 длиной N1 ищется в строке STR2 длиной N2. Разумеется N2>N1.
CLD
LEA EDI,STR2
MOV EAX,0
MOV EDX,EDI
LO:
MOV ECX,N1
LEA ESI,STR1
REPE CMPSB
JE FOUND
INC EDX
INC EAX
CMP EAX,N2-N1-1
JZ NO_FOUND
MOV EDI,EDX
JMP LO
NO_FOUND:
;строка не найдена
...
FOUND
;строка найдена
...
Разбирая Пример 5 обратите внимание на роль регистра EDX. В нем храниться адрес символа в строке STR2, с которого на каждом шаге начинается поиск. Если поиск увенчался успехом, то именно в этом регистре хранится начало найденной подстроки.
Список рекомендуемой литературы
1. В.Ю. Пирогов ASSEMBLER. Учебный курс.- М.: Издатель Молгачева С.В., Издательство Нолидж, 2001. - 848 с
2. В.И. Юров Assembler. Учебник для вузов. 2-ое изд. – СПб.: Питер, 2004. – 637 с.
3. В.Ю. Пирогов Ассемблер для Windows. -2-ое изд., перераб. и доп. – СПб.: БХВ – Петербург, 2003.-656 с.
- Приложение А
Варианты индивидуальных заданий
I. В диалоговом окне ввести строку. Выполнить над ней преобразование, вывести полученную строку.
Варианты к I-му заданию:
- Циклический сдвиг вправо на 1 символ
- Циклический сдвиг влево на 1 символ
- Выделить байт с наибольшим ASCII-кодом
- Выделить байт с наименьшим ASCII-кодом
- Произвести реверс байтов
- Поменять крайние символы местами
- Поменять средние символы местами
- Заменить четные цифры символом «?»
- Заменить нечетные цифры символом «?»
- Убрать пробелы в тексте
- Заменить все символы ‘a’ на символ, введенный с клавиатуры
II. В тексте определить количество чисел, у которых:
|
|
- Все цифры не совпадают
- Цифры образуют комбинацию «стрит» (напр.: 43576)
- Три одинаковых цифры в числе (напр.: 36533)
- Все цифры идут подряд (в порядке возрастания или убывания)
- Ни одной цифры подряд
III.В тексте найти:
- Количество гласных букв
- Количество согласных букв
- Количество слов с удвоенными согласными
- Количество слов с удвоенными гласными
- «Слова -перевертыши» (напр.: кабак)
- Слово с максимальным количеством одинаковых символов
- Количество четных чисел
- Количество нечетных чисел
IV. Ввести 2 строки одинаковой длины, определить:
- Количество одинаковых символов
- Количество одинаковых слов
- Количество ошибок в случае, если 1-я строка – шаблон, 2-я – проверяемый текст
Приложение B