<<
>>

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

Система команд процессора содержит пять команд, поддерживающих описанные ранее операции. Эти команды выполняют логические операции над битами опе- рандов. Размерность операндов, естественно, должна быть одинакова.
Например, если размерность операндов равна слову (16 битов), то логическая операция вы- полняется сначала над нулевыми битами операндов, и ее результат записывается на место бита 0 результата. Далее команда последовательно повторяет эти дей- ствия над всеми битами с первого до пятнадцатого. Возможные варианты размер- ности операндов для каждой команды можно найти в приложении. Далее перечислены базовые команды процессора, поддерживающие работу с логическими данными: Я and операнд_l,операнд_2 — операция логического умножения. Команда выпол- няет поразрядно логическую операцию И (конъюнкцию) над битами операндов операнд_l и операнд_2. Результат записывается на место операнд_l. ш orоперанLl,операнд_2 — операция логического сложения. Команда выполняет поразрядно логическую операцию ИЛИ (дизъюнкцию) над битами операндов операнд_l и операнд_2. Результат записывается на место операнд_l. * хоrоперанд_l,операнд_2 — операция логического исключающего сложения. Ко- манда выполняет поразрядно логическую операцию исключающего ИЛИ над битами операндов операнд_l и операнд_2. Результат записывается на место опе- ранд_l. и test операнд_l,операнд_2 — операция проверки (способом логического умноже- ния). Команда выполняет поразрядно логическую операцию # над битами опе- рандов операнд_l и операнд_2. Состояние операндов остается прежним, изме- няются только флаги ZF, SF, и PF, что дает возможность анализировать состояние отдельных битов операнда без изменения их состояния в исходных операндах. not операнд — операция логического отрицания. Команда выполняет поразряд- ное инвертирование (замену значения на обратное) каждого бита операнда. Результат записывается на место операнда.
Для представления роли логических команд в системе команд процессора очень важно понять области их применения и типовые приемы их использования при программировании. Далее мы будем рассматривать логические команды в контек- сте обработки последовательности битов. Очень часто некоторая ячейка памяти должна играть роль индикатора, показы- вая, например, занятость некоторого программного или аппаратного ресурса. Так как эта ячейка может принимать только два значения — занято (1) или свободно (0), то отводить под нее целый байт очень расточительно, логичнее для этой цели использовать бит. А если таких индикаторов много? Объединив их в пределах од- ного байта или слова, можно получить довольно существенную экономию памяти. Посмотрим, что могут сделать для этого логические команды. С помощью логических команд возможно выделение отдельных битов в опе- ранде с целью их установки, сброса, инвертирования или просто проверки на опре- деленное значение. Для организации подобной работы с битами второй операнд обычно играет роль маски. Путем установки в 1 битов этой маски и определяются нужные для конкретной операции биты первого операнда. Покажем, какие логи- ческие команды могут применяться для этой цели. Для установки определенных разрядов (битов) в 1 применяется команда or операнд_l,операнд_2 В этой команде второй операнд, играющий роль маски, должен содержать еди- ничные биты на месте тех разрядов, которые должны быть установлены в 1 в пер- вом операнде: or еах,10b ;установить 1-й бит в регистре еах Для сброса определенных разрядов (битов) в 0 применяется команда and операнд_l,операнд_2 В этой команде второй операнд, играющий роль маски, должен содержать ну- левые биты на месте тех разрядов, которые должны быть установлены в 0 в первом операнде: . and еах ,Qfffffffdh ;сбросить в 0 1-й бит в регистре еах Для выяснения того, какие биты в обоих операндах различаются, или для ин- вертирования заданных битов в первом операнде применяется команда хоr операнд_l,операнд_2 Интересующие нас биты маски (второго операнда) при выполнении команды ХОRдолжны быть единичными, остальные — нулевыми: хоr еах,lθb ;инвертировать 1-й бит в регистре еах jz mеs ;переход, если 1-й бит в аl был единичным Для проверки состояния заданных битов в первом операнде применяется команда test операнд_l,операнд_2 Проверяемые биты первого операнда в маске (втором операнде) должны иметь единичное значение. Алгоритм работы команды TEST подобен алгоритму работы команды AN D, но он не меняет значения первого операнда.
Результатом команды является установка значения флага нуля ZF: * если ZF = 0, то в результате логического умножения получился ненулевой ре- зультат, то есть хотя бы один единичный бит маски совпал с соответствующим единичным битом первого операнда; * если ZF= 1, то в результате логического умножения получился нулевой резуль- тат, то есть ни один единичный бит маски не совпал с соответствующим еди- ничным битом первого операнда. Таким образом, если любые соответствующие биты в обоих операндах установ- лены, то ZF = 0. Для реакции на результат команды TEST целесообразно использо- вать команду перехода на метку JNZ (Jump if Not Zero) — переход, если флаг нуля ZF ненулевой, или команду с обратным действием JZ (Jump if Zero) — переход, если флаг нуля ZF нулевой. Например, testеах,00θθθθlθh jnz ml ;переход если 4-й бит равен 1 Начиная с системы команд процессора iЗ86, набор команд для поразрядной обработки данных расширился. При использовании этих команд необходимо ука- зывать одну из директив: .386, .486 и т. д. Следующие две команды позволяют осу- ществить поиск первого установленного в 1 бита операнда. Поиск можно произве- сти как с начала, так и от конца операнда: * bsfоперан^l,операнд_2 — сканирование битов вперед (BitScaning Forward). Команда просматривает (сканирует) биты второго операнда от младшего к стар- шему (от бита 0 до старшего бита) в поисках первого бита, установленного в 1. Если таковой обнаруживается, в первый операнд заносится номер этого бита в виде целочисленного значения. Если все биты второго операнда равны 0, то флаг нуля ZF устанавливается в 1, в противном случае флаг ZF сбрасывается в 0. mоv аl,02h , bsf bх,аl ;bх=l jz ml ;переход, если аl=ООh Ш bsrоперан^l,операнд_2 — сканирование битов в обратном порядке (Bit Scaning Reset). Команда просматривает (сканирует) биты второго операнда от старше- го к младшему (от старшего бита к биту 0) в поисках первого бита, установлен- ного в 1. Если таковой обнаруживается, в первый операнд заносится номер это- го бита в виде целочисленного значения.
При этом важно, что позиция первого единичного бита слева все равно отсчитывается относительно бита 0. Если все биты второго операнда равны 0, то флаг нуля ZF устанавливается в 1, в против- ном случае флаг ZF сбрасывается в 0. Листинг 9.1 демонстрирует пример применения команд BSR и BSF. Введите код и исследуйте работу программы в отладчике (в частности, обратите внимание на то, как меняется содержимое регистра ВХ после выполнения команд BSF и BSR). Интерес представляют еще несколько из группы логических команд, позволя- ющих реализовать доступ к конкретному биту операнда. Они, как и предыдущие, появились в моделях процессоров Intel, начиная с iЗ86. Поэтому при их использо- вании не забывайте указывать одну из директив: .386, .486 и т. д. Операнд может находиться как в памяти, так и в регистре общего назначения. Положение бита задается смещением его относительно младшего бита операнда. Смещение может как задаваться в виде непосредственного значения, так и содержаться в регистре общего назначения. В'качестве значения смещения вы можете использовать ре- зультаты работы команд BSR и BSF. Все команды присваивают значение выбранно - го бита флагу СF. Команда проверки бита ВТ (Bit Test) переносит значение бита в флаг CF: bt операнд,смещение_бита Например, , bt ах,5 ;проверить значение бита 5 jnc ml ;переход, если бит = О Команда проверки и установки бита BTS (Bit Test and Set) переносит значение бита в флаг CF и затем устанавливает проверяемый бит в 1: bts операнд, смещение_бита Например, mоv ах , 10 bts pole,ах ;проверить и установить 10-й бит в pole j'с ml ;переход, если проверяемый бит был равен 1 Команда проверки и сброса бита BTR (Bit Test and Reset) переносит значение бита во флаг CF и затем устанавливает этот бит в 0: . btr операнд,смещение_бита Команда проверки и инвертирования бита ВТС (Bit Test and Convert) переносит значение бита в флаг CF и затем инвертирует значение этого бита: btc операнд,смещение_бита
<< | >>
Источник: В. И. Юров. Assembler. Учебник для вузов. 2-е изд. 2003

Еще по теме Логические команды:

  1. Определение команды.
  2. § 4.5. Деятельность команд в организации
  3. Признаки команды.
  4. Пример настройки и реабилитации в футбольной команде
  5. Работа с другими командами
  6. Четыре шага по созданию эффективной команды
  7. Кто становится лидером команды
  8. Логическое ударение
  9. МЫШЛЕНИЕ СЛОВЕСНО-ЛОГИЧЕСКОЕ
  10. Логическая последовательность вопросов
  11. ШЕСТЬ СТУПЕНЕЙ НА ПУТИ СОЗДАНИЯ КОМАНДЫ.
  12. 3.2.4. Логический анализ основных понятий
  13. 3.9. Логические ошибки
  14. По единому логическому основанию
  15. Логические ошибки вопроса
  16. 3.3. Логический контроль анкеты
  17. 1.3. Логическая структура вопроса
  18. Создание деловой команды «Вероятно, я не лучший советчик в этом вопросе».
  19. Словесно-логическая память