Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Rep movsb





Заметим, что хотя rep и является служебным словом (кодом операции), но его часто пишут на месте метки (в качестве первого поля предложения Ассемблера), так как служебное слово нельзя спутать с именем, заданным пользователем. Пара команд rep movsb является тесно связанной, они вместе выбираются на регистр команд центрального процессора, так что в цикле пересылки массива нет необходимости обращаться в память за командами. Теперь сложность нашего алгоритма снизилась до теоретического минимума в 2*N операций, т.е. это позволило значительно поднять эффективность пересылки массива.[37]

Разберёмся теперь с назначением флага направления DF. Отметим сначала, что этот флаг позволяет производить пересылку массива в прямом направлении (от первого элемента к последнему) при значении DF=0 и в обратном направлении (от последнего элемента массива к его первому элементу) при DF=1, отсюда и название флага – флаг направления пересылки массива.

Пересылка массива в обратном направлении – не прихоть программиста, а часто единственный способ правильного присвоения значений массивов. Правда следует сразу сказать, что флаг направления влияет на правильное присваивание одному массиву значения другого массива только в том случае, если эти массивы перекрываются в памяти (т.е. один массив полностью или частично занимает то же место в памяти, что и второй массив). В качестве примера на рис. 9.1 показано два случая перекрытия массивов A и B в памяти. Из этого рисунка видно, что для случая 9.1 а) необходима пересылка в прямом направлении с флагом DF=0, а для случая 9.1 б) правильный результат присваивания массивов получается при обратном направлении пересылки элементов массива с флагом DF=1.

 

      Массив В       Массив А
             
             
  Массив А       Массив В    
          ...  
             
  ...          
               
               
               
   
а). Должно быть DF=0   б). Должно быть DF=1  
   
  Рис. 9.1. Два случая перекрытия массивов в памяти при пересылке.
                     

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

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

Продолжим изучение строковых команд. Команды сравнения двух операндов cmpsb и cmpsw имеют тот же формат память-память, что и команды movsb и movsw. Команды cmpsb и cmpsw выполняются по схеме:

cmp <ds,si>,<es,di>; φ(di); φ(si)

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

Как мы знаем, команды сравнения необходимы для работы команд условного перехода. С командами сравнения cmpsb и cmpsw удобно использовать команды-префиксы повторения repe/repz и repne/repnz. Эти команды похожи на команду rep, но обеспечивают возможность досрочного выхода из цикла по значению флага ZF=0 (для команд repe/repz) и ZF=1 (для команд repne/repnz).

В качестве примера рассмотрим следующую задачу. Как мы знаем, строки текста можно сравнивать между собой не только на равенство и неравенство, но и с помощью других операций отношения (больше, меньше и т.д.). При этом строки считаются упорядоченными в так называемом лексикографическом порядке (а по-простому – как в словаре). С помощью строковых команд и префиксов повторения операцию сравнения двух строк можно так реализовать на Ассемблере (правда, здесь строки одинаковой длины, сравнение строк разной длины реализуется более сложно):

 

N equ 20000

Data segment

X db N dup (?)


Y db N dup (?)

...

Data ends

Code segment

assume cs:Code,ds:Data,es:Data,ss:Stack

...

mov cx,N

Cld

lea si,X

lea di,Y







Date: 2015-10-18; view: 358; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.007 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию