ВУЗ:
Составители:
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). В реальных
Страницы
- « первая
- ‹ предыдущая
- …
- 8
- 9
- 10
- 11
- 12
- …
- следующая ›
- последняя »