Варианты индивидуальных заданий

П.В. Лекомцев

 

 

Строковые операции в MASM32

Методическое пособие

по дисциплине «Основы вычислительной техники»

 

 

Ижевск 2008


УДК

Рецензент: С.А.Трефилов, канд. техн. наук, доцент

Зав. кафедрой: Ю.В.Турыгин, докт. техн. наук, профессор

 

В пособии рассмотрены команды работы со строками при программировании на языке Assembler для Win32, примеры использования данных команд. Даны индивидуальные задания к выполнению лабораторной работы, сформулированы требования к содержанию отчета к лабораторной работе, приведен список рекомендуемой методической и справочной литературы.

ã Издательство ИжГТУ, 2008


Содержание

 

Цель работы

Задание на лабораторную работу

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

Цепочечные команды в языке Assembler

Примеры использования цепочечных команд

Список рекомендуемой литературы

Приложение А (обязательное) Варианты индивидуальных заданий

Приложение B. Пример программы в MASM32



Цель работы

Целью данной лабораторной работы является освоение навыков программирования на языке Assembler для Win32, в частности освоения команд работы со строками и их практического применения в операциях поиска, копирования, изменения данных.

 

Задание на лабораторную работу

Разработать алгоритм и программу на языке Assembler для Win32 в соответствии с индивидуальным заданием. Ввод и вывод осуществить в диалоговом окне Windows. Варианты заданий приведены в Приложении A.

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

 

  1. Титульный лист
  2. Задание на лабораторную работу
  3. Введение
  4. Разработка схемы алгоритма решения задачи
  5. Разработка программы
  6. Результаты вычислительного эксперимента
  7. Выводы
  8. Список литературы

Цепочечные команды в языке 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 с.


  1. Приложение А

Варианты индивидуальных заданий

I. В диалоговом окне ввести строку. Выполнить над ней преобразование, вывести полученную строку.

Варианты к I-му заданию:

  1. Циклический сдвиг вправо на 1 символ
  2. Циклический сдвиг влево на 1 символ
  3. Выделить байт с наибольшим ASCII-кодом
  4. Выделить байт с наименьшим ASCII-кодом
  5. Произвести реверс байтов
  6. Поменять крайние символы местами
  7. Поменять средние символы местами
  8. Заменить четные цифры символом «?»
  9. Заменить нечетные цифры символом «?»
  10. Убрать пробелы в тексте
  11. Заменить все символы ‘a’ на символ, введенный с клавиатуры

II. В тексте определить количество чисел, у которых:

  1. Все цифры не совпадают
  2. Цифры образуют комбинацию «стрит» (напр.: 43576)
  3. Три одинаковых цифры в числе (напр.: 36533)
  4. Все цифры идут подряд (в порядке возрастания или убывания)
  5. Ни одной цифры подряд

III.В тексте найти:

  1. Количество гласных букв
  2. Количество согласных букв
  3. Количество слов с удвоенными согласными
  4.  Количество слов с удвоенными гласными
  5. «Слова -перевертыши» (напр.: кабак)
  6. Слово с максимальным количеством одинаковых символов
  7. Количество четных чисел
  8. Количество нечетных чисел

IV. Ввести 2 строки одинаковой длины, определить:

  1. Количество одинаковых символов
  2. Количество одинаковых слов
  3. Количество ошибок в случае, если 1-я строка – шаблон, 2-я – проверяемый текст


Приложение B


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: