Сист. прогр. Ч2 (Методические указания к выполнению лабораторных работ по СПО)

2018-01-12СтудИзба

Описание файла

Файл "Сист. прогр. Ч2" внутри архива находится в следующих папках: Методические указания к выполнению лабораторных работ по СПО, сист прогр лабы. Документ из архива "Методические указания к выполнению лабораторных работ по СПО", который расположен в категории "". Всё это находится в предмете "операционные системы" из 7 семестр, которые можно найти в файловом архиве РТУ МИРЭА. Не смотря на прямую связь этого архива с РТУ МИРЭА, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "операционные системы" в общих файлах.

Онлайн просмотр документа "Сист. прогр. Ч2"

Текст из документа "Сист. прогр. Ч2"

133


9. Команды обработки строк

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

ВВЕДЕНИЕ

Команды, показанные в предыдущих главах, оперировали одним байтом или одним словом за одно выполнение. Часто, однако, бывает необходимо переслать или сравнить поля данных, которые превышают по длине одно слово. Например, необходимо сравнить описания или имена для того, чтобы отсортировать их в восходящей последовательности. Элементы такого формата известны как строковые данные и могут являться как символьными, так и числовыми. Для обработки строковых данных ассемблер имеет пять команд обработки строк:

MOVS переслать один байт или одно слово из одной области памяти в другую;

LODS загрузить из памяти один байт в регистр AL или одно слово в регистр АХ;

STOS записать содержимое регистра AL или АХ в память;

CMPS сравнить содержимое двух областей памяти размером в

один байт или в одно слово;

SCAS сравнить содержимое регистра AL или АХ с содержимым памяти.

Префикс REP позволяет этим командам обрабатывать строки любой длины.

ОСОБЕННОСТИ КОМАНД ОБРАБОТКИ СТРОК

Цепочечная команда может быть закодирована для повторяющейся обработки одного байта или одного слова за одно выполнение. Например, можно выбрать "однобайтовую" команду для обработки строки с нечетным числом байтов или "двухбайтовую" команду для обработки четного числа байтов. Ниже перечислены регистры, участвующие в цепочечных командах (для однобайтовых и двухбайтовых вариантов). Предположим, что регистры DI и SI содержат необходимые адреса:

Команда Операнды Байт Слово

MOVS DI, SI MOVSB MOVSW

LODS AL,SI или АХ,SI LODSB LODSW

STOS DI, AL или DI,AX STOSB STOSW

CMPS SI, DI CMPSB CMPSW

SCAS DI, AL или DI ,АХ SCASB SCACW

Операнды указываются, например, для команды MOVS, но опускаются для MOVSB и MOVSW. Эти команды предполагают, что регистры DI и SI содержат относительные адреса, указывающие на необходимые области памяти (для загрузки можно использовать команду LEA). Регистр SI обычно связан с регистром сегмента данных - DS:SI. Регистр DI всегда связан с регистром дополнительного сегмента - ES:DI. Следовательно, команды MOVS, STOS, CMPS и SCAS требуют инициализации регистра ES (обычно адресом в регистре DS).

REP: ПРЕФИКС ПОВТОРЕНИЯ КОМАНДЫ

Несмотря на то, что цепочечные команды имеют отношение к одному байту или одному слову, префикс REP обеспечивает повторение команды несколько раз. Префикс кодируется непосредственно перёд цепочечной командой, например REP MOVSB. Для использования префикса REP необходимо установить начальное значение в регистре СХ. При выполнении цепочечной команды с префиксом REP происходит уменьшение на 1 значения в регистре СХ до нуля. Таким образом, можно обрабатывать строки любой длины.

Флаг направления определяет, направление повторяющейся
операции:

  • для направления слева направо необходимо с помощью

команды CLD установить флаг DF в 0;

  • для направления справа налево необходимо с помощью

команды STD установить флаг DF в 1.

В следующем примере выполняется пересылка 20 байт из STRING1 в STRING2. Предположим, что оба регистра DS и ES инициализированы адресом сегмента данных:

STRING1 DB 20 DUP(‘*’)
STRING2 DB 20 DUP (‘ ‘)

……………….

CLD ;Сброс флага DF

MOV CX, 20 ;Счетчик на 20 байт

LEA DI, STRING2. ;Адрес "куда"

LEA SI, STRING1. ;Адрес "откуда"

REP MOVSB ;Переслать данные

При выполнении команд CMPS и SCAS возможна установка флагов состояния, так чтобы операция могла прекратиться сразу после обнаружения необходимого условия. Ниже приведены модификации префикса REP для этих целей:

REP повторять операцию до тех пор, пока СХ не равно 0;

REPZ повторять операцию до тех пор, пока флаг ZF показывает или "равно или ноль". Прекратить операцию при флаге ZF,

RЕРЕ указывающем на не равно или не ноль, или при СХ, равном 0;

REPNE повторять операцию до тех пор, пока флаг ZF показывает или "не равно или не ноль". Прекратить операцию при флаге

REPNZ ZF, указывающем на " равно или ноль", или при СХ, равном 0.

Для процессоров 8086, 80286 и 80386, обрабатывающих слово за одно выполнение, использование цепочечных команд, где это возможно, приводит к повышению эффективности работы программы.

MOVS: ПЕРЕСЫЛКА СТРОКИ

На рис. 7.5. была показана программа для пересылки девятибайтового поля. Программа включала три команды для инициализации и пять команд для цикла. Команда MOVS с префиксом REP и счетчиком в регистре СХ может выполнять пересылку любого числа символов более эффективно.

Для области, принимающей строку, сегментным регистром является регистр ES, а регистр DI содержит относительный адрес. Для области, передающей строку, сегментным регистром является регистр DS, а регистр SI содержит относительный адрес. Таким образом, в начале программы перед выполнением команды MOVS необходимо инициализировать регистр ES вместе с регистром DS, a также загрузить требуемые относительные адреса полей в регистры DI и SI. В зависимости от состояния флага DF команда MOVS производит увеличение или уменьшение на 1 (для байта) или на 2 (для слова) содержимого регистров DI и S1,

Приведем команды, эквивалентные цепочечной команде REP MOVSB:

JCXZ LABEL2

IABEL1: MOV, AL,[SI]

MOV [DI],AL

INC/DEC DI ;Инкремент или декремент

INC/DEC SI ;Инкремент или декремент

LOOP LABEL1

LABEL2: ...

В программе на рис. 9.1 процедура C10MVSB использует команду MOVSB для пересылки содержимого десятибайтового поля NAME1 в поле NAME2. Первая команда CLD сбрасывает флаг направления в 0 для обеспечения процесса пересылки слева направо. В нормальном состоянии флаг DF обычно имеет нулевое значение и команда CLD используется из предосторожности.

Две команды LEA загружают регистры SI и DI относительными адресами NAME1 и NAME2 соответственно. Так как регистры DS и ES были ранее инициализированы адресом DATASG, то полные адреса полей NAME1 и NAME2 будут в регистрах ES:DI и DS:SI. (СОМ-программа автоматически инициализирует регистры ES и DS). Команда MOV заносит в регистр СХ значение 10 - длину полей NAME1 и NAME 2. Команда REP MOVSB выполняет следующее:

  • пересылает самый левый байт из поля NAME1 (адресованного регистрами ES:DI) в самый левый байт поля NAME2 (адресованного регистрами DS:SI);

  • увеличивает на 1 адреса в регистрах DI и SI для следующего байта;

  • уменьшает СХ на 1;

  • повторяет перечисленные действия (в данном случае 10 раз), пока содержимое регистра СХ не станет равным нулю.

Поскольку флаг DF имеет нулевое значение, команда MOVSB увеличивает адреса в регистрах DI и SI, и в каждой итерации процесс перемещается на байт вправо, т.е. пересылает байт из NAME1 + 1 в NAME2 + 1 и т.д. Если бы флаг DF был равен 1, тогда команда MOVSB уменьшала бы адреса в регистрах DI и SI, выполняя процесс справа налево. Но в этом случае регистры SI и DI необходимо инициализировать адресами последних байтов полей, т.е. NAME1+9 и NAME2 + 9 соответственно.

В процедуре D10MVSW (рис. 9.1) используется команда MOVSW, пересылающая одно слово за одно выполнение. Так как команда MOVSW увеличивает адреса в регистрах DS и SI на 2, операция требует только пять циклов. Для процесса пересылки справа налево регистр SI должен быть инициализирован адресом NAME1 +8, а регистр DI - NAME2 + 8.

LODS: ЗАГРУЗКА СТРОКИ

Команда LODS загружает из памяти в регистр AL один байт или в регистр АХ одно слово. Адрес памяти определяется регистрами DS:SI. В зависимости от значения флага DF происходит увеличение или уменьшение значения в регистре SI.

Поскольку одна команда LODS загружает регистр, то практической пользы от префикса REP в данном случае нет. Часто простая команда MOV полностью адекватна команде LODS, хотя MOV генерирует 3 байта машинного кода, a LODS - только один, но требует инициализации регистра SI. Можно использовать команду LODS в случае, когда требуется продвигаться вдоль строки (по байту или по слову), проверяя загружаемый регистр на конкретное значение.

Команды, эквивалентные команде LODSB:

MOV AL,[SI]
INC SI

Ha рис.9.1 процедура E10LODS демонстрирует использование команды LODSW. В примере обрабатывается только одно слово: первый байт из области NAME1 (содержащий значение As) заносится в регистр AL, а второй байт - в регистр АН. В результате в регистре АХ получится значение sA.

STOS: ЗАПИСЬ СТРОКИ

Команда STOS записывает (сохраняет) содержимое регистра AL или АХ в байте или в слове памяти. Адрес памяти всегда представляется регистрами ES:DI. В зависимости от флага DF команда STOS также увеличивает или уменьшает адрес в регистре DI на 1 для байта или на 2 для слова.

Практическая польза команды STOS с префиксом REP -инициализация области данных конкретным значением, например очистка дисплейного буфера пробелами. Длина области (в байтах или в словах) загружается в регистр СХ. Команды, эквивалентные команде REP STOSB:

JCXZ LABEL2
LABEL1: MOV [DI], AL

INC/DEC DI ;Инкремент или декремент

LOOP LABEL1

LABEL2: ...

На рис.9.1 процедура F10STOS демонстрирует использование команды STOSW. Операция осуществляет запись пробелов (2020) пять раз в область NAME3, причем значение из регистра AL заносится в первый байт, а из регистра АН - во второй. По завершении команды регистр DI содержит адрес NAME3+10.

CMPS: СРАВНЕНИЕ СТРОК

Команда CMPS сравнивает содержимое одной области памяти (адресуемой регистрами DS:SI) с содержимым другой области (адресуемой регистрами ES:DI). В зависимости от флага DF команда CMPS также увеличивает или уменьшает адреса в регистрах SI и DI на 1 для байта или на 2 для слова. Команда CMPS устанавливает флаги AF, CF, OF, PF, SF и ZF. При использовании префикса REP в регистре СХ должно находиться значение длины сравниваемых полей. Команда CMPS может сравнивать любое число байтов или слов.

Рассмотрим процесс сравнения двух строк, содержащих имена JEAN и JOAN. Сравнение побайтово слева направо приводит к следующему:

J : J Равно

Е : О Не равно (Е меньше О)

А : А Равно

N : N Равно

page 60,132

TITLE STRING (EXE) ;Строковые операции

STACKSG SEGMENT PARA STACK ‘Stack’

DW 32 DUP(?)

STACKSG ENDS

DATASG SEGMENT PARA ‘Data’

NAME1 DB ‘Assemblers’

NAME2 DB 10 DUP (‘ ‘)

NAME3 DB 10 DUP (‘ ‘)

DATASG ENDS

CODESG SEGMENT PARA ‘Code’

BEGIN PROC FAR ; Основная процедура

ASSUME CS:CODESG, DS:DATASG, SS: STACKSG, ES: DATASG

PUSH DS

SUB AX, AX

PUSH AX

MOV AX, DATASG

MOV DS, AX

MOV ES, AX

CALL C10MVSB ;Подпрограмма MVSB

CALL D10MVSW ;Подпрограмма LODS

CALl E10L0DS ;Подпрограмма LODS

CALL F10STOS ;Подпрограмма CMPS

CALL H10SCAS ;Подпрограмма SCAS

RET

BEGIN ENDP

Использование MOVSB:

C10MVSB PROC NEAR

CLD

LEA SI, NAME1

LEA DI, NAME2

MOV CX,10

REP MOVSB

RET

C10MVSB ENDP ;Переслать 10 байтов из NAME1 в NAME2

; Использование MOVSW:

D10MVSW PROC NEAR

CLD

LEA SI, NAME2

LEA DI, NAME3

MOV CX, 05

REP MOVSW

RET

D10MVSW ENDP ;Переслать 5 слов из NAME2 в NAME3

; Использование LODSW:

E10LODS PROC NEAR

CLD

LEA SI, NAME1 ;3агрузить 1-е слово
LODSW ; из NAME1 в АХ

RET

E10LODS ENDP

; Использование STOSW:

F10STOS PROC NEAR

CLD

LEA DI, NAME3

MOV СХ, 05

MOV AX, 2020H ;Переслать пробелы

REP STOSW ; в NAME3

RET

F10STOS ENDP
G10CMPS PROC NEAR

CLD

MOV CX, 10

LEA SI, NAME1

LEA DI, NAME2

REPE CMPSB ;Сравн. NAME1 и NAME2 He равны?

JNE G20

MOV BH, 01

G20: MOV CX, 10

LEA SI, NAME2

LEA DI, NAME3

REPE CMPSB ;Сравн. NAME2 и NAME3 Если равны, то выйти

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5193
Авторов
на СтудИзбе
434
Средний доход
с одного платного файла
Обучение Подробнее