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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

Логические данные

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

Исчисление высказываний очень гармонично сочетается с принципами работы компьютера и основными методами его программирования. Все аппаратные компоненты компьютера построены на логических микросхемах. Система представления информации в компьютере на самом нижнем уровне основана на понятии бита. Бит, имея всего два состояния: 0 (ложно) и 1 (истинно), — естественным образом вписывается в исчисление высказываний.

Согласно теории, над высказываниями (над битами) могут выполняться следующие логические операции:

  • отрицание (логическое НЕ);
  • логическое сложение (логическое включающее ИЛИ);
  • логическое умножение (логическое И);
  • логическое исключающее сложение (логическое исключающее ИЛИ).

Значение операнда

Результат операции

  • отрицание (логическое НЕ) — логическая операция над одним операндом, результатом которой является величина, обратная значению исходного операнда.
    Эта операция однозначно характеризуется следующей таблицей истинности (табл. 1).

Значение операнда 1

Значение операнда 2

Результат операции

  • логическое сложение (логическое включающее ИЛИ) — логическая операция над двумя операндами, результатом которой является “истина” (1), если один или оба операнда имеют значение “истина” (1), и “ложь” (0) — если оба операнда имеют значение “ложь” (0).
    Эта операция описывается с помощью следующей таблицы истинности (табл. 2).

Значение операнда 1

Значение операнда 2

Результат операции

  • логическое умножение (логическое И) — логическая операция над двумя операндами, результатом которой является “истина” (1) только в том случае, если оба операнда имеют значение “истина” (1). Во всех остальных случаях значение операции “ложь” (0).
    Эта операция описывается с помощью следующей таблицы истинности (табл.3).

 

Значение операнда 1

Значение операнда 2

Результат операции

  • логическое исключающее сложение (логическое исключающее ИЛИ) — логическая операция над двумя операндами, результатом которой является “истина” (1), если только один из двух операндов имеет значение “истина” (1), и ложь (0), если оба операнда имеют значение “ложь” (0) или “истина” (1).
    Эта операция описывается с помощью следующей таблицы истинности(табл. 4).

Система команд микропроцессора содержит пять команд, поддерживающих данные операции. Эти команды выполняют логические операции над битами операндов. Размерность операндов, естественно, должна быть одинакова. Например, если размерность операндов равна слову (16 бит), то логическая операция выполняется сначала над нулевыми битами операндов и ее результат записывается на место бита 0 результата. Далее команда последовательно повторяет эти действия над всеми битами с первого до пятнадцатого. Возможные варианты размерности операндов для каждой команды приведены в “Справочнике команд”.

Логические команды

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

and операнд_1,операнд_2 — операция логического умножения.
Команда выполняет поразрядно логическую операцию И (конъюнкцию) над битами операндов операнд_1 и операнд_2. Результат записывается на место операнд_1.

or операнд_1,операнд_2 — операция логического сложения.
Команда выполняет поразрядно логическую операцию ИЛИ (дизъюнкцию) над битами операндов операнд_1 и операнд_2. Результат записывается на место операнд_1.

xor операнд_1,операнд_2 — операция логического исключающего сложения.
Команда выполняет поразрядно логическую операцию исключающего ИЛИ над битами операндов операнд_1 и операнд_2. Результат записывается на место операнд_1.

test операнд_1,операнд_2 — операция “проверить” (способом логического умножения).
Команда выполняет поразрядно логическую операцию И над битами операндов операнд_1 и операнд_2. Состояние операндов остаётся прежним, изменяются только флаги zf, sf, и pf, что даёт возможность анализировать состояние отдельных битов операнда без изменения их состояния.

not операнд — операция логического отрицания.
Команда выполняет поразрядное инвертирование (замену значения на обратное) каждого бита операнда. Результат записывается на место операнда.

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

  • Для установки определённых разрядов (бит) в 1 применяется команда
    or операнд_1,операнд_2.
    В этой команде операнд_2, выполняющий роль маски, должен содержать единичные биты на месте тех разрядов, которые должны быть установлены в 1 в операнд_1.

or eax,10b ;установить 1-й бит в регистре eax

  • Для сброса определённых разрядов (бит) в 0 применяется команда
    and операнд_1,операнд_2.
    В этой команде операнд_2, выполняющий роль маски, должен содержать нулевые биты на месте тех разрядов, которые должны быть установлены в 0 в операнд_1.

and eax,fffffffdh ;сбросить в 0 1-й бит в регистре eax

 

  • Команда xor операнд_1,операнд_2 применяется:
    • для выяснения того, какие биты в операнд_1 и операнд_2 различаются;
    • для инвертирования состояния заданных бит в операнд_1.

 

xor eax,10b ;инвертировать 1-й бит в регистре eax

jz mes ;переход, если 1-й бит в al был единичным

 

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

 

  • Для проверки состояния заданных бит применяется команда
    test операнд_1,операнд_2 (проверить операнд_1).
    Проверяемые биты операнд_1 в маске (операнд_2) должны иметь единичное значение. Алгоритм работы команды test подобен алгоритму команды and, но он не меняет значения операнд_1.
    Результатом команды является установка значения флага нуля zf:
    • если zf = 0, то в результате логического умножения получился нулевой результат, то есть один единичный бит маски, который не совпал с соответствующим единичным битом операнд_1;
    • если zf = 1, то в результате логического умножения получился ненулевой результат, то есть хотя бы один единичный бит маски совпал с соответствующим единичным битом операнд_1.

 

test eax,00000010h

jz m1 ;переход, если 4-й бит равен 1

 

 

Как видно из примера, для реакции на результат команды test целесообразно использовать команду перехода jnz метка (Jump if Not Zero) — переход, если флаг нуля zf ненулевой, или команду с обратным действием — jz метка (Jump if Zero) — переход, если флаг нуля zf = 0.

Следующие две команды позволяют осуществить поиск первого установленного в 1 бита операнда. Поиск можно произвести как с начала так и от конца операнда:

bsf операнд_1,операнд_2 (Bit Scaning Forward) - сканирование битов вперёд.
Команда просматривает (сканирует) биты операнд_2 от младшего к старшему (от бита 0 до старшего бита) в поисках первого бита, установленного в 1. Если таковой обнаруживается, в операнд_1 заносится номер этого бита в виде целочисленного значения. Если все биты операнд_2 равны 0, то флаг нуля zf устанавливается в 1, в противном случае флаг zf сбрасывается в 0.

 

mov al,02h

bsf bx,al ;bx=1

jz m1 ;переход, если al=00h

...

 

bsr операнд_1,операнд_2 (Bit Scaning Reset) — сканирование битов в обратном порядке.
Команда просматривает (сканирует) биты операнд_2 от старшего к младшему (от старшего бита к биту 0) в поисках первого бита, установленного в 1. Если таковой обнаруживается, в операнд_1 заносится номер этого бита в виде целочисленного значения.
При этом важно, что позиция первого единичного бита слева отсчитывается все равно относительно бита 0. Если все биты операнд_2 равны 0, то флаг нуля zf устанавливается в 1, в противном случае флаг zf сбрасывается в 0.


В последних моделях микропроцессоров Intel в группе логических команд появилось ещё несколько команд, которые позволяют осуществить доступ к одному конкретному биту операнда. Операнд может находиться как в памяти, так и в регистре общего назначения. Положение бита задаётся смещением бита относительно младшего бита операнда. Значение смещения может задаваться как в виде непосредственного значения, так и содержаться в регистре общего назначения. В качестве значения смещения вы можете использовать результаты работы команд bsr и bsf. Все команды присваивают значение выбранного бита флагу cf.

bt операнд,смещение_бита (Bit Test) — проверка бита.
Команда переносит значение бита в флаг cf.

 

bt ax,5 ;проверить значение бита 5

jnc m1 ;переход, если бит = 0

 

bts операнд,смещение_бита (Bit Test and Set) — проверка и установка бита.
Команда переносит значение бита в флаг cf и затем устанавливает проверяемый бит в 1.

 

mov ax,10

bts pole,ax ;проверить и установить 10-й бит в pole

jсm1 ;переход, если проверяемый бит был равен 1

btr операнд,смещение_бита (Bit Test and Reset) — проверка и сброс бита.
Команда переносит значение бита в флаг cf и затем устанавливает этот бит в 0.

btc операнд,смещение_бита (Bit Test and Convert) — проверка и инвертирование бита.
Команда переносит значение бита в флаг cf и затем инвертирует значение этого бита.

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

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

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

  • статически, что предполагает задание фиксированного значения с помощью непосредственного операнда;
  • динамически, что означает занесение значения счётчика сдвигов в регистр cl перед выполнением команды сдвига.

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

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

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

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



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 52; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.196 (0.007 с.)