Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Команда NOT




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

NOT r/m8 NOT r/m16 NOT r/m32

Таблица истинности для оператора NOT приведена ниже (табл. 8.1).

Табл. 8.1

a b a AND b a OR b a XOR b NOT a
           
           
           
           

 

10.3. Массивы битов (разрядные матрицы)

Любое число можно записать в двоичной системе в виде последовательности нулей и единиц. Например, любое 16-разрядное число состоит из 16 двоичных цифр: 0 и 1. Мы можем использовать одно число для хранения шестнадцати различных состояний — флагов. Нам не нужно тратить место на хранение 16 различных переменных, ведь для описания состояния (включено/выключено) вполне достаточно 1 бита. Переменная, используемая для хранения флагов, называется разрядной матрицей или массивом битов.

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

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

Для установки определенных битов массива в единицу (все остальные биты при этом должны остаться без изменения) применяется команда OR. В качестве маски возьмите двоичное число, в котором единицы стоят на месте тех битов, которые вы хотите установить в массиве. Например, если вы хотите установить первый и последний биты массива, вы должны использовать маску 10000001b. Все остальные биты останутся нетронутыми, поскольку 0 OR x всегда возвращает x.

Чтобы сбросить некоторые биты (установить их значение в 0) применяется команда AND. В качестве маски необходимо число, в котором нули стоят на месте тех битов, которые вы хотите сбросить, а единицы — во всех остальных позициях. Поскольку 1 AND x всегда возвращает x, то установятся в 0 только необходимые нам биты.

Пример 1. В регистре AL загружен массив битов. Нужно установить все нечетные позиции в 1. Предыдущее состояние массива неизвестно.

or al,10101010b;маска устанавливает все нечетные биты в 1

Пример 2. В массиве битов, хранящемся в регистре AL, сбросить 0-й и 7-й биты, все остальные оставить без изменения. Исходное состояние массива также неизвестно.

and al,01111110b;каждая 1 в маске сохраняет бит в ее позиции

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

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

10.4. Сдвиг и ротация

Операции поразрядного сдвига перемещают отдельные биты в байте, слове или двойном слове. Сдвиг может быть влево или вправо. При сдвиге вправо на одну позицию крайний правый (младший) бит теряется, а крайний левый замещается нулем. При сдвиге влево теряется крайний левый (старший) бит, а крайний правый замещается нулем. При сдвиге на несколько позиций «выталкивается» указанное количество битов, а «освободившиеся» биты замещаются нулями.

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

Команды SHR и SHL – сдвиг беззнаковых чисел

Команды SHR и SHL поразрядно сдвигают беззнаковые целые числа вправо и влево соответственно. Это самый быстрый способ умножить или разделить целое число на степень двойки.

Представим число 5 в двоичной системе – 0101b. После умножения на 2 мы получим 10, в двоичной системе это число 01010b. Сравнивая два двоичных числа, вы, наверное, заметили, как можно быстро получить из числа 5 число 10: с помощью сдвига на один бит влево, добавив один нуль справа.

Точно так же можно умножить число на любую степень двух. Например, вместо умножения на 16 (2 в степени 4) можно сдвинуть исходное число на 4 бита влево.

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

Команде SHL нужно передать два операнда:

SHL o1, о2

Первый должен быть регистром или адресом памяти, который нужно сдвинуть. Второй операнд определяет число позиций, на которое нужно сдвинуть. Чаще всего это непосредственное значение. Можно использовать в качестве второго операнда и регистр, но только CL – это касается всех операций сдвига и ротации. Сдвиг возможен не более чем на 32 позиции, поэтому принимается в расчет не весь второй операнд, а остаток от его деления на 32.

Старший «вытолкнутый» бит сохраняется в флаге переноса CF, а младший бит заменяется нулем. Кроме флага CF используется флаг знака (SF) и флаг переполнения (OF). За этими флагами нужно следить, выполняя действия над числами со знаком, чтобы избежать превращения положительного числа в отрицательное и наоборот (в этом случае флаги SF и OF устанавливаются в 1).

То же самое, что и SHL, только биты сдвигаются вправо:

SHR o1, о2

Младший бит перемещается в CF, а старший заменяется нулем.

Команды SAL и SAR – сдвиг чисел со знаком

Команды SAL и SAR используются для поразрядного сдвига целых чисел со знаком (арифметического сдвига). Команда SAL – это сдвиг влево, а команда SAR – вправо.

Формат команд таков:

SAL o1, о2

SAR o1, о2

Команда SAR сдвигает все биты, кроме старшего, означающего знак числа – этот бит сохраняется. Младший бит, как обычно, вытесняется в CF. Операнды обеих инструкций такие же, как у SHL и SHR.

Команды RCR и RCL – ротация через флаг переноса

Эти команды выполняют циклический поразрядный сдвиг (ротацию). RCR действует точно так же, как SHR, но вместо нуля в старший бит первого операнда заносится предыдущее содержимое CF. Исходный младший бит вытесняется в CF. Команда RCL работает подобно RCR, только в обратном направлении.

Формат команд таков:

RCR o1, о2

RCL o1, о2

Команды ROR и ROL – ротация с выносом во флаг переноса

Эти команды выполняют другой вариант циклического сдвига: ROR сначала копирует младший бит первого операнда в его старший бит, а потом заносит его в CF; ROL работает в обратном направлении.

ROR ol, о2

ROL ol, о2

Операнды этих команд аналогичны операндам команд RCR и RCL.

10.5. Команда XCHG – меняем местами операнды

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

XCHG ol,o2

Подобно инструкции MOV, она имеет два операнда – ol и о2. Каждый из них может быть 8-, 16- и 32-разрядным, и только один из них может находиться в памяти – требования такие же, как у команды MOV.

xchg еах,еах; меняем местами значения ЕАХ и ЕАХ.

; так реализован NOP – пустой оператор

xchg ebx,ecx; меняем местами значения ЕВХ и ЕСХ

xchg al,ah; меняем местами значения AL и АН

xchg dl,ah;меняем местами значения DL и АН

xchg byte [variable],cl;меняем местами один байт памяти и CL

10.6. Изменение регистра признаков напрямую

Несколько команд позволяют непосредственно модифицировать флаги регистра признаков. Мы рассмотрим четыре команды, которые изменяют флаги IF и ID, то есть флаг прерывания и флаг направления.

Команды СLI и STI

Команды CLI (Clear Interrupt) и STI (Set Interrupt) сбрасывают и устанавливают флаг прерывания IF. Иными словами, при их помощи вы можете запретить или разрешить аппаратные прерывания. Если этот флаг установлен (1), аппаратные прерывания разрешены. Команда CLI сбрасывает флаг (0) – запрещает аппаратные прерывания. Потом вы должны снова разрешить их, выполнив команду STI:

cli; отключить прерывания – использовать только в DOS!

...; теперь мы никем не будем потревожены и можем

; выполнять какие-то действия, например, изменять

; таблицу прерываний

sti; включаем прерывания снова

Команды STD и CLD

Команды STD и CLD модифицируют значение флага DF. Этим флагом пользуется группа команд для обработки строк. Команда CLD сбрасывает этот флаг (что означает отсчет вверх), a STD устанавливает его (отсчет в обратном порядке).

Формат команд простой:

STD

CLD

10.7. Команда LEA – не только вычисление адреса

Имя этой команды – это сокращение от «Load Effective Address», то есть «загрузить эффективный адрес». Она вычисляет эффективный адрес второго операнда и сохраняет его в первом операнде (который может быть только регистром). Синтаксис этой команды требует, чтобы второй операнд был заключен в квадратные скобки, но фактически она не адресует память.

LEA ol, [o2]

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

lea edi, [ebx*4+ecx]; загружает в регистр EDI адрес,

; вычисленный как EDI = ЕВХ*4+ЕСХ

Значение, вычисленное командой LEA, не обязательно рассматривать как адрес: ее можно использовать для целочисленных арифметических вычислений.

 

 




Поделиться с друзьями:


Дата добавления: 2014-12-07; Просмотров: 724; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.027 сек.