КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Логические командыВ системе команд микропроцессора есть следующий набор команд, поддерживающих работу с логическими данными: and операнд_1, операнд_2 — операция логического умножения. Команда выполняет поразрядно логическую операцию И (конъюнкцию) над битами операндов олеранд_1 и операнд_2. Результат записывается на место операнд_1. or операнд_1, операнд_2 — операция логического сложения. Команда выполняет поразрядно логическую операцию ИЛИ (дизъюнкцию) над битами операндов операнд_1 и операнд_2. Результат записывается на место операнд_1. хоr операнд_1, операнд_2 — операция логического исключающего сложения. Команда выполняет поразрядно логическую операцию исключающего ИЛИ над битами операндов операнд_1 и операнд_2. Результат записывается на место операнд_1. test операнд_1. операнд_2 – операция «проверить» (способом логического умножения). Команда выполняет поразрядно логическую операцию И над битами операндов операнд_1 и операнд_2. Состояние операндов остается прежним, изменяются только флаги zf, sf, и pf, что дает возможность анализировать состояние отдельных битов операнда без изменения их состояния. not операнд — операция логического отрицания. Команда выполняет поразрядное инвертирование (замену значения на обратное) каждого бита операнда. Результат записывается на место операнда.
С помощью логических команд возможно выделение отдельных битов в операнде с целью их установки, сброса, инвертирования или просто проверки на определенное значение. Для организации подобной работы с битами операнд__2 обычно играет роль маски. С помощью установленных в 1 битов этой маски и определяются нужные для конкретной операции биты операнд_1. Для установки определенных разрядов (бит) в 1 применяется команда or операнд_1, операнд_2 В этой команде операнд_2, выполняющий роль маски, должен содержать единичные биты на месте тех разрядов, которые должны быть установлены в 1 в операнд_ 1 оr еах, 10b ;установить 1-й бит в регистре еах Для сброса определенных разрядов (битов) в 0 применяется команда and операнд_1, операнд_2 В этой команде операнд_2, выполняющий роль маски, должен содержать нулевые биты на месте тех разрядов, которые должны быть установлены в 0 в операнд_1 and eax, 0fffffffdh ;сбросить в 0 1-й бит в регистре еах Команда хоr операнд_1, операнд_2 применяется: - для выяснения того, какие биты в операнд_1 и операнд_2 различаются; - для инвертирования состояния заданных бит в операнд_1. Интересующие нас биты маски (операнд_2) при выполнении команды хоr должны быть единичными, остальные — нулевыми. xоr еах, 10b ;инвертировать 1-й бит в регистре еах jz mes ;переход, если 1-й бит в al был единичный Для проверки состояния заданных бит применяется команда test операнд_1, операнд_2 (проверить операнд_1) Проверяемые биты операнд_1 в маске (операнд_2) должны иметь единичное значение. Алгоритм работы команды test подобен алгоритму команды and, но он не меняет значения операнд_1. Результатом команды является установка значения флага нуля zf: - если zf = 0, то в результате логического умножения получился нулевой результат, то есть один единичный бит маски не совпал с соответствующим единичным битом операнд_1; - если zf = 1, то в результате логического умножения получился ненулевой результат, то есть хотя бы один единичный бит маски совпал с соответствующим единичным битом операнд_1. test eax, 00000010h jz ml ;переход если 4-й бит равен 1 Как видно из примера, для реакции на результат команды test целесообразно использовать команду перехода jnz метка (Jump if Not Zero) — переход, если флаг нуля zf ненулевой, или команду с обратным действием — jz метка Qump 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=l jz ml ;переход, если 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,ах ;проверить и установить 10-й бит в pole jс m1 ;переход, если проверяемый бит был равен 1
btr операнд, смещение_бита (Bit Test and Reset) — проверка и сброс бита. Команда переносит значение бита в флаг cf и затем устанавливает этот бит в 0.
btc операнд, смещение_бита (Bit Test and Convert) — проверка и инвертирование бита. Команда переносит значение бита в флаг cf и затем инвертирует значение этого бита.
|