Студопедия

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

Разделы сайта

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






Тема лекции 7. Команды микропроцессора. Логические , строковые .







Логические команды. Система команд микропроцессора имеет средства логического преобразования данных. Под логическими понимаются такие преобразования данных, в основе которых лежат правила формальной логики. Формальная логика работает на уровне утверждений истинно и ложно. Для микропроцессора это, как правило, означает 1 и 0 соответственно. Минимальной единицей данных, с которой работают машинные команды, является байт. Однако на системном уровне часто необходимо иметь возможность работать на предельно низком уровне — на уровне бит. Эти возможности предоставляют логические команды и логические операции; разница между ними в том, что логические команды действуют на этапе выполнения программы, а логические операции - на этапе ее трансляции. На рисунке 4 показаны средства микропроцессора для организации работы с данными по правилам формальной логики.

Рисунок 4. Средства микропроцессора для организации работы с данными по правилам формальной логоки

 

Операнд команды ассемблера в общем случае может представлять собой выражение, которое, в свою очередь, является комбинаций операторов и операндов. Среди этих операторов могут быть и операторы, реализующие логические операции над объектами выражения.

С помощью логических команд возможно выделение отдельных битов в операнде с целью их установки, сброса, инвертирования или просто проверки на определенное значение. Для организации подобной работы с битами операнд_2 обычно играет роль маски. С помощью установленных в 1 битов этой маски и определяются нужные для конкретной операции биты операнд 1.

Для установки определенных разрядов (бит) в 1 применяется команда ог

операнд _1, операнд _2.

В этой команде операнд_2, выполняющий роль маски, должен содержать единичные биты на месте тех разрядов, которые должны быть установлены в 1 в

операнд _1.

or еах, 10Ь установить 1-й бит в регистре еах

Для сброса определенных разрядов (бит) в 0 применяется команда and

операнд_1, операнд_2.

В этой команде операнд_2, выполняющий роль маски, должен содержать нулевые биты на месте тех разрядов, которые должны быть установлены в 0 в

операнд _1.

and eax, fffffffdh; сбросить в 0 1-й бит в регистре еах Команда хог операнд_ 1, операнд_2 применяется:

- для выяснения того, какие биты в операнд. 1 и операнд_2 различаются;

- инвертирования состояния заданных бит в операнд. 1.

Интересующие нас биты маски (операнд_2) при выполнении команды хог должны быть единичными, остальные — нулевыми.

хог еах, 10 b - инвертировать 1-й бит в регистре еах jz mes; переход если 1-й бит в al был единичным (так как маска хог изменяет на противоположный каждый бит начального значения, то повторное применение той же маски к результату восстанавливает первоначальное значение битов).Команда часто применяется для шифрования и в коммуникациях

Для проверки состояния заданных бит применяется команда test операнд_1, операнд_2 (проверить операнд_ 1). Проверяемые биты операнд_ 1 в маске (операнд__2) должны иметь единичное значение. Алгоритм работы команды test подобен алго­ритму команды and, но он не меняет значения операнд. 7. Результатом команды является установка значения флага нуля zf:

- если zf - 0, то в результате логического умножения получился нулевой ре­зультат, то есть один единичный бит маски, не совпал с соответствующим единичным битом операнд 1;

- если zf - 1, то в результате логического умножения получился ненулевой результат, то есть хотя бы один единичный бит маски совпал с соответствующим единичным битом опвранд_1.

Команды сдвига

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

Количество сдвигаемых разрядов, счетчик сдвигов, располагается, как видите, на месте второго операнда и может задаваться двумя способами:

- статически; предполагает задание фиксированного значения с помощью непосредственного операнда;

- динамически; занесением значения счетчикасдвигов в регистр cl перед выполнением команды сдвига.

Исходя из размерности регистра cl, значение счетчика сдвигов может лежать в диапазоне от 0 до 255. В целях оптимизации микропроцессор воспринимает только значение пяти младших битов счетчика, то есть значение лежит в диапазоне от 0 до 31. В последних моделях микропроцессора, в том числе и в микропроцессоре Pentium, есть дополнительные команды, позволяющие делать 64­разрядные сдвиги.

Все команды сдвига устанавливают флаг переноса cf. По мере сдвига битов за пределы операнда они сначала попадают во флаг переноса, устанавливая его равным значению очередного бита, оказавшегося за пределами операнда. Куда этот бит попадет дальше, зависит от типа команды сдвига и алгоритма про­граммы.

По принципу действия команды сдвига можно разделить на два типа:

- команды линейного сдвига;

- команды циклического сдвига.

Команды линейного сдвига.

К командам этого типа относятся команды, осуществляющие сдвиг по следующему алгоритму:

- очередной «выдвигаемый» бит устанавливает флаг cf;

- бит, вводимый в операнд с другого конца, имеет значение 0;

- при сдвиге очередного бита он переходит во флаг cf, при этом значение предыдущего сдвинутого бита теряется.

Команды линейного сдвига делятся на два подтипа:

- команды логического линейного сдвига;

- команды арифметического линейного сдвига.

К командам логического линейного сдвига относятся следующие: shl операнд, счетчиксдвигов (Shift Logical Left) — логический сдвиг влево. Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчик сдвигов. Справа (в позицию младшего бита) вписываются нули;

shr операнд, счетчик сдвигов (Shift Logical Right) — логический сдвиг вправо. Содержимое операнда сдвигается вправо на количество битов, определяемое значением счетчик сдвигов. Слева (в позицию старшего, знакового бита) вписываются нули.

Ниже показан фрагмент программы, который выполняет преобразование двух неупакованных BCD-чисел в слове памяти bcd_dig в упакованное BCD-число в регистре al.

bcd_dig dw 0905h; описание неупакованного BCD-числа 95 mov ax, bcd_dig; пересылка shl ah, 4; сдвиг влево

add al.ah; сложение для получения результата: al=95h Команды циклического сдвига

К командам циклического сдвига относятся команды, сохраняющие значения сдвигаемых бит. Есть два типа команд циклического сдвига:

- команды простого циклического сдвига;

- команды циклического сдвига через флаг переноса cf К командам простого циклического сдвига относятся:

rol операнд, счетчиксдвигов (Rotate Left) — циклический сдвиг влево. Содержимое операнда сдвигается влево на количество бит, определяемое операндом счетчик сдвигов. Сдвигаемые влево биты записываются в тот же операнд справа;

гог операнд, счетчик сдвигов — (Rotate Right) циклический сдвиг вправо. Содержимое операнда сдвигается вправо на количество бит, определяемое операндом счетчик сдвигов. Сдвигаемые вправо биты записываются в тот же операнд слева.

Команды простого циклического сдвига в процессе своей работы осуществляют одно полезное действие, а именно: циклически сдвигаемый бит не только вдвигается в операнд с другого конца, но и одновременно его значение становится значением флага cf. Например, для того чтобы обменять содержимое двух половинок регистра еах, достаточно выполнить следующую последовательность команд: mov eax.ffTOOOOh mov cl, 16 rol eax.cl

Команды циклического сдвига через флаг переноса cf отличаются от команд простого циклического сдвига тем, что сдвигаемый бит не сразу попадает в операнд с другого его конца, а записывается сначала во флаг переноса cf. Лишь следующее исполнение данной команды сдвига (при условии, что она выполняется в цикле) приводит к помещению выдвинутого ранее бита в другой конец операнда К командам циклического сдвига через флаг переноса cf относятся следующие:

rcl операнд, счетчик-сдвигов (Rotate through Carry Left) — циклический сдвиг влево через перенос. Содержимое операнда сдвигается влево на количество бит, определяемое операндом счетчик сдвигов. Сдвигаемые биты поочередно становятся значением флага переноса cf;

rcr операнд, счетчик сдвигов (Rotate through Carry Right) — циклический сдвиг вправо через перенос. Содержимое операнда сдвигается вправо на количество бит, определяемое операндом счетчик сдвигов. Сдвигаемые биты поочередно становятся значением флага переноса cf.

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

рассмотрим, как переписать в регистр Ьх старшую половину регистра еах с одновременным ее обнулением в регистре еах:
mov cx, 16 ; кол-во сдвигов для еах
clc   ; сброс флага cf в О
rcl еах, 1 ; сдвиг крайнего левого бита из еах в cf
rcl bx ; перемещений бита из cf справа в Ьх
loop ml ; цикл 16 раз
rol еах, 16 восстановить правую часть еах

 

Команды простого циклического сдвига можно использовать для операций другого рода. Например, подсчитаем количество единичных бит в регистре еах: xor dx, dx; очистка dx для подсчета единичных бит mov cx, 32; число циклов подсчета cycl:; метка цикла

rr еах, 1; циклический сдвиг вправо на 1 бит

jnc not_one; переход, если очередной бит в cf; не равен единице

inc dx; увеличение счетчика цикла

not_one:

loop cycl; переход на метку cycl, если

; значение в сх не равно 0 Строковые команды.

Для работы со строками, или цепочками символов или чисел в МП предусмотрен ряд специальных команд: movs — пересылка строки; cmps — сравнение двух строк; seas — поиск в строке заданного элемента;

lods — загрузка аккумулятора (регистров AL или АХ) из строки; stos — запись элемента строки из аккумулятора (регистров АХ или AL).

Хотя команды обработки строк, как правило, включаются в программу без явного указания операндов, однако каждая команда, в действительности, использует два операнда. Для команд seas и stos операндом-источником служит аккумулятор, а операнд-приемник находится в памяти. Для команды lods, наоборот, операнд-источник находится в памяти, а приемником служит аккумулятор. Наконец, для команд movs и cmps оба операнда, и источник, и приемник, находятся в памяти.

Все рассматриваемые команды, выполняя различные действия, под­чиняются одинаковым правилам: операнды, находящиеся в памяти, всегда адресуются единообразно: операнд-источник через регистры DS: SI, а операнд- приемник через регистры ES: DI. При однократном выполнении команды обрабатывают только один элемент, а для обработки строки команды должны предваряться одним из префиксов повторения. В процессе обработки строки регистры SI и DI автоматически смещаются по строке вперед (если флаг DF = 0) или назад (если флаг DF = 1), обеспечивая адресацию последующих элементов. Каждая команда имеет модификации для работы с байтами или словами (например, movsb и movsw).

Таким образом, для правильного выполнения команд обработки строк необходимо (в общем случае) предварительно настроить регистры DS: SI и ES: DI, установить или сбросить флаг DF, занести в СХ длину обрабатываемой строки, а для команд seas и stos еще поместить операнд-источник в регистр АХ (или AL при работе с байтами).

Однако сама операция, после всей этой настройки, осуществляется одной командой, которая обычно даже не содержит операндов, хотя может иметь префикс повторения.

Стоит подчеркнуть, что строки, обрабатываемые рассматриваемыми командами, могут находиться в любом месте памяти: в полях данных про­граммы, в системных областях данных, в ПЗУ, в видеобуфере. Например, с помощью команды movs можно скопировать массив данных из одной

массивной переменной в другую, а можно переслать страницу текста на экран

терминала.

; Пример. Чтение из ПЗУ BIOS даты его выпуска; В программном сегменте main proc

mov AX, 0F000h; 3анесем в DS

mov DS, AX; сегментный адрес ПЗУ BIOS

mov SI, 0FFF5h; Смещение к интересующему нас полю

mov AX, data; Настроим ES

mov ES, AX; на сегмент данных программы

mov DI, offset Ь^; Смещение к полю для хранения даты

mov CX, 8; Перенести 8 байт

cld; Движение по строке вперед

rep movsb; Перенос байтов

; Выведем полученнуюинформацию на экран

mov AX, data; Теперь настроим DS

mov DS, AX; на сегмент данных программы

mov АН, 40h; Функция вывода

mov BX, 1; Дескриптор экрана

mov СХ, 8; Вывести 8 байт

mov DX, offset bios; Смещение к строке

int 2Ih; Вызов DOS

; В сегменте данных

bios db 8 dup("); Поле для хранения даты

Основная литература: 4[69-76], 5[186-205], 7[130-134], 9[104-116]. Дополнительная литература: 13[[50-60].

Контрольные вопросы:

1. Какие команды и операторы относятся к средствам логической обработки данных.

2. Опишите действия команды хог и области ее применения.

3. Опишите структуру команд сдвига.

4. Каким образом может задаваться счетчик сдвигов в командах сдвига?

5. На какие два типа можно разделить команды сдвига по принципу действия?

6. По какому алгоритму осуществляется сдвиг в командах линейного сдвига?

7. По какому алгоритму осуществляется сдвиг в командах циклического сдвига?

8. Каким правилам подчиняются все строковые команды?

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.