Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
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 при операции встаки и при операции удаления участка редактируемого текста. Продолжим изучение строковых команд. Команды сравнения двух операндов 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
|