Методическое пособие по решению задач лабораторного практикума по курсу "ЭВУ и системы" (изучение архитектуры и системы команд INTEL-совместимых микропроцессоров). Коршунов А.Д. - 10 стр.

UptoLike

Составители: 

10
Повторим ещё раз: команды-префиксы REP, REPE, REPNE работают как
специальные операторы циклов, но только в сочетании с командами обработки строк.
Бессмысленно писать такие вот «циклы»: REP INC AX и т.п.
Содержимое индексных регистров SI и DI во время работы строковых команд не
остаётся неизменным - оно также изменяется автоматически в соответствии с правилом
SI SI ± delta, DI DI ± delta. Здесь delta=1 для байтовых строк и delta=2 для строк,
состоящих из 16-разрядных машинных слов. Кроме того, в ряде случаев возникает
необходимость в пересылке строки в обратном порядке, начиная не с первого, а с
последнего элемента. Содержимое индексных регистров при этом должно не
увеличиваться (автоинкрементирование), а уменьшаться (автодекрементирование).
Направление изменения содержимого (знак «
±
») задаётся с помощью флага DF в
регистре FLAGS микропроцессора: при DF=0 используется «плюс», при DF=1 - «минус».
Сам же флаг DF управляется специальными командами: CLD (сбросить флаг, это
значение по умолчанию) и STD (установить флаг).
На первый взгляд всё это кажется очень сложным, на самом деле описанный здесь
подход очень удобен для программиста: не надо заботиться о конструировании каких-
либо специальных циклов, изменении значений счётчика цикла и регистров-указателей и
т.д. Достаточно записать начальные значения в соответствующие регистры и выполнить
команду с префиксом. Разумеется, никто не запрещает использовать строковые команды и
внутри обычных циклов типа LOOP или met: … JNZ met.
CMPS, CMPSB (compare strings). Команда осуществляет поэлементное сравнение
элементов двух строк (слов или байтов), одна из которых, как и прежде, расположена в
памяти по адресу в регистрах DS:SI, вторая - по адресу в ES:DI. При выполнении этой
команды производится вычитание элемента строки с адресом в SI из элемента строки с
адресом в DI; как и в обычной команде CMP, результат вычитания никуда не
записывается, но зато устанавливаются соответствующие флаги (наиболее важным в
данной ситуации является флаг ZF). Следовательно, эту команду удобно использовать с
префиксами REPE или REPNE.
SCAS, SCASB (scan string). Эта команда используется для так называемого
«сканирования» одной строки в поисках нужного элемента (слова или байта). В процессе
работы команды осуществляется сравнение элемента строки, расположенного по адресу в
ES:DI, со значением в регистре AX (или AL) путём вычитания; результат вычитания не
фиксируется, но устанавливаются соответствующие флаги. Как и при выполнении прочих
строковых
команд, производится автоинкрементирование (либо автодекрементирование)
регистра DI. Таким образом, загрузив искомый образец в AX (или AL) и выставив нужное
начальное значение ES:DI (а также и CX), программист может смело применить команду
REPE SCAS(B). Имеет смысл подумать над вопросом: а что произойдёт, если строка не
содержит искомого образца?
LODS, LODSB (load from string). Команда осуществляет загрузку элемента строки
(слова или байта) в регистр AX или AL соответственно. Строка адресуется с помощью
регистров DS:SI. Эта команда обычно не используется с префиксами повторения (делать
это можно, но не имеет особого смысла).
STOS, STOSB
(store to string). С помощью этой команды производится заполнение
строки словом или байтом. Заполняемая строка адресуется с помощью регистров ES:DI.
Эта команда используется с префиксом REP тогда, когда необходимо загрузить строку
какой-либо константой (например, заполнить строку пробелами).
Команды различного назначения (Таблица 5).
HLT (27, Halt) - останов работы МП. Микропроцессор, выполнив эту команду,
прекращает работу и ждёт внешних сигналов, в частности, сигнала начального сброса.
Завершать работу программы с помощью этой команды можно (в данном лабораторном
практикуме) лишь при работе с учебной моделью МП (приложением AsmEd). В реальных
                                                                                     10
       Повторим ещё раз: команды-префиксы REP, REPE, REPNE работают как
специальные операторы циклов, но только в сочетании с командами обработки строк.
Бессмысленно писать такие вот «циклы»: REP INC AX и т.п.
       Содержимое индексных регистров SI и DI во время работы строковых команд не
остаётся неизменным - оно также изменяется автоматически в соответствии с правилом
SI ← SI ± delta, DI ← DI ± delta. Здесь delta=1 для байтовых строк и delta=2 для строк,
состоящих из 16-разрядных машинных слов. Кроме того, в ряде случаев возникает
необходимость в пересылке строки в обратном порядке, начиная не с первого, а с
последнего элемента. Содержимое индексных регистров при этом должно не
увеличиваться (автоинкрементирование), а уменьшаться (автодекрементирование).
Направление изменения содержимого (знак « ± ») задаётся с помощью флага DF в
регистре FLAGS микропроцессора: при DF=0 используется «плюс», при DF=1 - «минус».
Сам же флаг DF управляется специальными командами: CLD (сбросить флаг, это
значение по умолчанию) и STD (установить флаг).
       На первый взгляд всё это кажется очень сложным, на самом деле описанный здесь
подход очень удобен для программиста: не надо заботиться о конструировании каких-
либо специальных циклов, изменении значений счётчика цикла и регистров-указателей и
т.д. Достаточно записать начальные значения в соответствующие регистры и выполнить
команду с префиксом. Разумеется, никто не запрещает использовать строковые команды и
внутри обычных циклов типа LOOP или met: … JNZ met.
       CMPS, CMPSB (compare strings). Команда осуществляет поэлементное сравнение
элементов двух строк (слов или байтов), одна из которых, как и прежде, расположена в
памяти по адресу в регистрах DS:SI, вторая - по адресу в ES:DI. При выполнении этой
команды производится вычитание элемента строки с адресом в SI из элемента строки с
адресом в DI; как и в обычной команде CMP, результат вычитания никуда не
записывается, но зато устанавливаются соответствующие флаги (наиболее важным в
данной ситуации является флаг ZF). Следовательно, эту команду удобно использовать с
префиксами REPE или REPNE.
       SCAS, SCASB (scan string). Эта команда используется для так называемого
«сканирования» одной строки в поисках нужного элемента (слова или байта). В процессе
работы команды осуществляется сравнение элемента строки, расположенного по адресу в
ES:DI, со значением в регистре AX (или AL) путём вычитания; результат вычитания не
фиксируется, но устанавливаются соответствующие флаги. Как и при выполнении прочих
строковых команд, производится автоинкрементирование (либо автодекрементирование)
регистра DI. Таким образом, загрузив искомый образец в AX (или AL) и выставив нужное
начальное значение ES:DI (а также и CX), программист может смело применить команду
REPE SCAS(B). Имеет смысл подумать над вопросом: а что произойдёт, если строка не
содержит искомого образца?
       LODS, LODSB (load from string). Команда осуществляет загрузку элемента строки
(слова или байта) в регистр AX или AL соответственно. Строка адресуется с помощью
регистров DS:SI. Эта команда обычно не используется с префиксами повторения (делать
это можно, но не имеет особого смысла).
       STOS, STOSB (store to string). С помощью этой команды производится заполнение
строки словом или байтом. Заполняемая строка адресуется с помощью регистров ES:DI.
Эта команда используется с префиксом REP тогда, когда необходимо загрузить строку
какой-либо константой (например, заполнить строку пробелами).
       Команды различного назначения (Таблица 5).
       HLT (27, Halt) - останов работы МП. Микропроцессор, выполнив эту команду,
прекращает работу и ждёт внешних сигналов, в частности, сигнала начального сброса.
Завершать работу программы с помощью этой команды можно (в данном лабораторном
практикуме) лишь при работе с учебной моделью МП (приложением AsmEd). В реальных