Справочник по языку Ассемблера IBM PC

       

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


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


Формальная логика работает на уровне утверждений истинно

и ложно. Для микропроцессора это, как правило, означает 1

и 0 соответственно.


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

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


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

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




        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 целесообразно использовать команду перехода метка (Jump if Not Zero) — переход, если флаг нуля zf ненулевой, или команду с обратным действием — метка (Jump if Zero) — переход, если флаг нуля zf = 0. 

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

операнд_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         ...   

операнд_1,операнд_2 (Bit Scaning Reset) — сканирование битов в обратном порядке.

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

При этом важно, что позиция первого единичного бита слева отсчитывается все равно относительно бита 0. Если все биты операнд_2 равны 0, то флаг нуля zf устанавливается в 1, в противном случае флаг zf сбрасывается в 0.

Листинг 1 демонстрирует пример применения команд bsr и bsf. Введите код и исследуйте работу программы в отладчике (в частности, обратите внимание на то, как меняется содержимое регистра bx после команд bsf и bsr).



   Листинг 1 Сканирование битов ;prg_9_1.asm masm model   small stack   256 .data   ;сегмент данных .code   ;сегмент кода main:   ;точка входа в программу         mov     ax,@data         mov     ds,ax ;... .486    ;это обязательно         xor     ax,ax         mov     al,02h         bsf     bx,ax   ;bx=1         jz      m1      ;переход, если al=00h         bsr     bx,ax m1: ;...         mov     ax,4c00h        ;стандартный выход         int     21h end     main   

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

операнд,смещение_бита (Bit Test) — проверка бита.

Команда переносит значение бита в флаг cf.

          bt      ax,5    ;проверить значение бита 5         jnc     m1      ;переход, если бит = 0   

<


операнд,смещение_бита (Bit Test and Set) — проверка и установка бита.

Команда переносит значение бита в флаг cf и затем устанавливает проверяемый бит в 1.

          mov ax,10         bts     pole,ax ;проверить и установить 10-й бит в pole         jсm1    ;переход, если проверяемый бит был равен 1

операнд,смещение_бита (Bit Test and Reset) — проверка и сброс бита.

Команда переносит значение бита в флаг cf и затем устанавливает этот бит в 0.

операнд,смещение_бита (Bit Test and Convert) — проверка и инвертирование бита.

Команда переносит значение бита в флаг cf и затем инвертирует значение этого бита. 


Содержание раздела