- •1. Обработка символьной информации
- •Команды префикса повторения.
- •Примеры программ, реализующих действия со строками.
- •Практическая часть.
- •Контрольные вопросы и задания.
- •Передача параметров в процедуру.
- •1. Передача через регистры: программа перед вызовом заносит входные параметры в некоторые регистры процессора, а после возврата выбирает из регистров значения результатов.
- •Модульная структура программ на языке Ассемблера.
- •Работа с командой прерываний int.
- •Практические задания.
- •Синтаксис:
- •Команды сдвига.
- •Команды логического сдвига shl и shr.
- •Команды арифметического сдвига sal и sar.
- •Команды циклического сдвига: rol и ror, rcl и rcr.
- •Использование логических и арифметических команд сдвига.
- •1. Команды логического сдвига. Используются для выполнения быстрого умножение и деление целых чисел на степени двойки, на 2 k.
- •Литература
Команды префикса повторения.
Строковые команды могут обрабатывать только один байт или слово. При обработке длинных строк используются специальные префиксы повторения. Префикс заставляет команду выполняться несколько раз. В строковых командах можно использовать следующие префиксы повторения:
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
src DB ‘ABCDEFGHIJ’ ; строка-источник DB 10 dup (?) ; строка - приемник
code
ASSUME DS: @data, ES: @data
Main:
MOV AX, @data ; загрузка сегментных регистров
MOV DS, AX ; настройка DS на адрес сегмента данных
MOV ES, AX ; настройка ES на адрес сегмента данных SI, src ; поместить в SI смещение строки-источника src DI, dst ; поместить в DI смещение строки-приемника dst CX, 10 ; длина строки ; по возрастанию адресов MOVS dst, src ; повторить пока CX > 0
Examle 7.1. Фрагмент программы сканирования буфера buffer, со сбросом старшего бита каждого байта и сохранением результата в output.
data
buffer DB 0C8h, 0FBh, 0F5h, 0Cah, 41h, 32h, 43h. 04h, 87h, 8Ch DB 10 DUP (?)
code
…
MOV SI, OFFSET buffer ; буфер-источник DI, OFFSET output ; буфер-приемник
MOV CX, 10 ; длина буфера: buffer ; копировать DS: SI в AL AL, 7FH ; очистить старший бит output ; сохранить AL в ES: DI L ; повторить пока CX <> 0
Сравнить две строки 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
В строке S из 500 символов заменить первое вхождение символа '*' на точку.
CLD ; просмотр строки вперед
PUSH DS;
POP ES ; установить ES на сегмент данных
LEA DI, S ; ES:DI=начало S СХ, 500 ; длина строки
MOV AL, '*' ; символ для поиска
REPNE SCASB ; поиск первого вхождения '*' в S
JNE FIN ; в строке S нет вхождения '*'
MOV BYTE PTR ES: [DI-1], '.' ; замена `*' на точку
FIN:…
Практическая часть.
Составить программу, реализующую следующие действия (по вариантам).
1. Ввести с клавиатуры строку. Сжать строку, т.е. удалить пробелы и табуляции. Вывести результаты на экран.
2. Ввести с клавиатуры строку. Посчитать количество слов в строке. Вывести результаты на экран.
. Ввести с клавиатуры строку. Ввести с клавиатуры коротенькую строку - шаблон. Найти шаблон во введенной строке. Вывести на экран «ДА», если шаблон есть, и «НЕТ», если его нет.
. Ввести с клавиатуры две строки. Сравнить их. Вывести на экран номер позиции, в которой строки различаются.
. Ввести с клавиатуры строку. Если она длиннее некоторой величины, то обрезать, если короче - растянуть, вставив нужное число пробелов между словами. Вывести результаты на экран.
6. Ввести с клавиатуры строку, состоящую из нескольких слов. Вывести каждое слово на экран в отдельной строке, т.е. выдать слова в столбик.
. Выделить из исходной строки подстроку символов заданной длины с указанного номера позиции.
8. Определить номер позиции, с которой начинается первое слева вхождение заданной конфигурации символов в исходную строку.
. Дана строка символов (введена с клавиатуры). Сформировать новую строку из исходной путем заданного числа повторений исходной строки.
. Заданы две строки. Проверить вхождение каждого символа строки 1 в строку 2. Если какой-либо (первый слева) символ строки 1 не представлен в строке 2, то фиксируется номер позиции этого символа в строке 1.
. Инвертировать заданную строку.
. Найти максимальный и минимальный символы в исходной строке.
. Удалить из исходной строки повторные вхождения заданного символа.
. Удалить из исходной строки заданную конфигурацию символов.
