Ассемблер для IBM PC

Методическое пособие - Компьютеры, программирование

Другие методички по предмету Компьютеры, программирование

е ячейки какой-то области памяти одной и той же величины, указанной в регистре AL или АХLODSПеренос элементов из строки-источника src в аккумулятор: [DS:SI] ALрегистрами DS:SIрегистр AL (AX)Используется вместе с командой STOS для переписи строк, когда между считыванием и записью элементов строк над ними должна быть выполнена какая-то дополнительная операция

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

 

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

УсловиеБез знакаСо знакомsrc dstJAJG

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

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

rep (repeat) - повторять, пока CX > 0; используется с командами, реализующими операции-примитивы пересылки (movs) и сохранения элементов цепочек (stos);

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

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

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

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

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

 

data

srcDBABCDEFGHIJ; строка-источникDB10 dup (?); строка - приемник

code

ASSUME DS: @data, ES: @data

Main:

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

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

MOVES, AX; настройка ES на адрес сегмента данныхSI, src; поместить в SI смещение строки-источника srcDI, dst; поместить в DI смещение строки-приемника dstCX, 10; длина строки; по возрастанию адресовMOVS dst, src; повторить пока CX > 0

 

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

 

data

bufferDB0C8h, 0FBh, 0F5h, 0Cah, 41h, 32h, 43h. 04h, 87h, 8ChDB10 DUP (?)

code

MOVSI, OFFSET buffer; буфер-источникDI, OFFSET output; буфер-приемник

MOVCX, 10; длина буфера:buffer; копировать DS: SI в ALAL, 7FH; очистить старший битoutput; сохранить AL в ES: DIL; повторить пока CX <> 0

Сравнить две строки S1 и S2 каждая длиной N.

 

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

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

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

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

L:

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

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

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

EQ:

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

NOEG:

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

 

В строке S из 500 символов заменить первое вхождение символа '*' на точку.

 

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

PUSHDS;

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

LEADI, S; ES:DI=начало SСХ, 500; длина строки

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

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

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

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

FIN:…

Практическая часть.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.Реализуе?/p>