Практическая работа 3 ЛОГИЧЕСКИЕ КОМАНДЫ И КОМАНДЫ СДВИГА

3.1  Цель работы

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

3.2  Логические операции

3.2.1 Особенности логических команд

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

-  реализуют поразрядные операции: i-й разряд результата зависит только от i-ых разрядов операндов, при этом действие выполняется сразу над всеми разрядами операндов одновременно;

-  меняют все флаги условий, но интерес вызывает только флаг нуля ZF, (принимает значение 1, если получился нулевой результат, и равен 0 в противном случае). Что касается других флагов, то они, предназначенные для работы с числами, в логических операциях малоинформативны.

Операнды должны иметь одинаковый размер.

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

Таблица 3.1 – Логические команды

Синтаксис

Логика работы

AND op1, op2

op1 = op1 and op2

TEST op1, op2

op1 and op2

OR op1, op2

op1 = op1 or op2

XOR op1, op2

op1 = op1 xor op2

NOT op

op = not op


Таблица 3.2 – Таблица истинности

X

Y

X and Y

конъюнкция

X xor Y

исключающее ИЛИ

X or Y

дизъюнкция

not X

отрицание

1

1

1

0

1

0

1

0

0

1

1

0

0

1

0

1

1

1

0

0

0

0

0

1

Описа-
ние

=1, если оба =1

=1, если оба разные

=1, если хоть один =1

Команда TEST - аналог команды AND, но результат никуда не записывается, выполняется только установка флагов (наиболее информативен флаг ZF).

НЕ нашли? Не то? Что вы ищете?

3.2.2  Применение логических команд

Приводимые ниже положения иллюстрируются примерами, в которых фигурируют регистры AL и BL, имеющие следующие начальные значения:

AL = 00001101b

BL = 00001100b

Второй операнд в командах (op2) – маска (шаблон).

а)  Установка бит в 1 - команда OR (устанавливаемые биты в маске =1, остальные =0).

ПРИМЕР

Установить бит номер нуль в 1.

OR AL, 00000001b ; AL = 1101b

OR BL, 00000001b ; BL = 1101b

б)  Сброс бит в 0 – команда AND (сбрасываемые биты в маске =0, остальные =1).

ПРИМЕР

Сбросить биты номер нуль, один и три.

AND AL, 11110100b ; AL= 00000000b

в)  Инвертирование бит – команда XOR (инвертируемые биты в маске =1, остальные =0).

ПРИМЕР

Инвертировать бит номер нуль.

XOR AL, 0000 0001b ; AL:= 1100b

XOR BL, 0000 0001b ; BL:= 1101b

г)  Проверка состояния бит – команда TEST (интересующие биты в маске =1, остальные =0).

ПРИМЕР

Протестировать состояние бита номер нуль регистра AL.

TEST AL, 00000001b

Результат операции – 00000001b – никуда не записывается, но в соответствии с ним изменяется флаг: ZF=0 – косвенный результат операции. Вывод: так как ZF=0, то результат не нулевой, значит интересующий бит =1 (остальные биты результата гарантированно зануляются, так как сама операция – суть умножение, а соответствующие биты в маске заданы равными нулю).

ПРИМЕР

Протестировать состояние бита номер нуль регистра BL.

TEST BL, 00000001b ; так как ZF=1, значит результат нулевой,

; следовательно, интересующий бит =0

д)  Обнуление регистров - команда XOR

ПРИМЕР

Очистить регистр AL.

XOR АL, АL ; АL:=0

По сравнению с другими приемами - MOV АL, 0 или SUB AL, AL - выполняется быстрее.

3.3  Условный оператор со сложным условием

Если условие сложное, то обычно выполняют проверку составляющих его простых условий, осуществляя после каждой проверки необходимые переходы.

ПРИМЕР

Если бит номер 1 байтовой переменной R равен 0 и бит номер 5 равен 1, перейти на метку DA, иначе на метку NET

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

test R, 10b ; проверка бита номер 1

jnz net ; если бит ≠ 0, переход на net

test R, 100000b ; проверка бита номер 5

jz net ; если бит = 0 ( т. е. ≠1), переход на net

; первый бит = 0 и пятый ≠ 0 ( =1)

da: ……

jmp fin

net: …….

fin: ……

ПРИМЕР

Если бит номер 1 байтовой переменной R равен 0 или бит номер 5 равен 1, перейти на метку DA, иначе на метку net.

Переход на метку DA осуществляется, когда выполняется хотя бы одно условие.

test R, 10b ; проверка бита номер 1

jz da ; если бит = 0, переход на da

; первый бит ≠ 0, необходимо проверить пятый

test R, 100000b ; проверка бита номер 5

jnz da ; если бит. ≠ 0 ( т. е. =1), переход на da

; ни один заданный бит не удовлетворяет заданному условию

; переход на net (следующая команда)

net: …….

jmp fin

da: ……

fin: ……

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

3.4.1 Команды сдвига перемещают (сдвигают) биты в поле операнда op (приемника) влево (L) или вправо (R) на число разрядов, указанных в счетчике:

<мнемокод> op, <счетчик>

Операнд op может быть регистром или памятью, а <счетчик> – либо непосредственным операндом, либо регистром CL.

3.4.2 Команды по принципу действия различаются на линейные и циклические.

Линейные – это логический (беззнаковые числа) и арифметический (знаковые числа) сдвиги, выполняемые по алгоритму: выдвигаемый бит попадает в СF, при этом значение предыдущего сдвинутого бита теряется, а бит, вводимый с другого конца, равен 0.

Логический сдвиг влево (shift left): SHL op, <счетчик>

Логический сдвиг вправо (shift right): SHR op, <счетчик>

Условно действия этих команд можно изобразить так, как показано на рисунке 3.1 (слева - для SHL, справа - для SHR).

CF op op CF

Подпись:

Подпись:

Рисунок 3.1 – Схема действия команд логического сдвига

Замечание: команды сдвигают в памяти переменные, большие байта, так, как если бы они было записаны в "неперевернутом" виде.

ПРИМЕР

Х DW 1FFh ; 00000001 11111111b (X: 11111111b, X+1: 00000001b)

SHL X, 1 ; 00000011 11111110b (X: 11111110b, X+1: 00000011b)

Арифметический сдвиг влево (shift arithmetic left): SAL op, <счетчик>

Арифметический сдвиг вправо (shift arithmetic rigth ): SAR op, <счетчик>

Команда SAL аналогична SHL.

SAR сохраняет знак, восстанавливая его после сдвига каждого очередного бита (рисунок 3.2).

оp CF

 

Рисунок 3.2 – Схема действия команды SAR

3.4.3 Линейные команды применяются для быстрого умножения и деления операнда оp на число, представляющее собой степень двойки 2k:

-  умножение беззнаковых и знаковых чисел (SHL или SAL) – сдвиг на k позиций влево обеспечивает умножение операнда на 2k ;

-  получение неполного частного при делении на 2k беззнаковых (SHR) и знаковых (SAR) чисел - сдвиг операнда на k позиций вправо;

-  получение остатка от деления беззнаковых чисел на 2k – выделить в делимом (операнде) k правых битов.

3.4.4 Особенность циклических сдвигов: "уходящий" бит не теряется, а возвращается в операнд с другого конца и одновременно заносится во флаг CF.

Циклический сдвиг влево (rotate left): ROL op, <счетчик>

Циклический сдвиг вправо (rotate right): ROR op, <счетчик>

Схема действия этих команд изображена на рисунке 4.3 (слева - для ROL, справа - для ROR ).

CF op op CF

 

Рисунок 3.3 – Схема действия команд логического сдвига

ПРИМЕР

MOV CL, 11000011b

ROL CL, 1 ; CF=1, CL=10000111b

MOV BH, 11100010b

ROR BH, 1 ; BH=01110001b, CF=0

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

ПРИМЕР

Поменять местами правую и левую половины регистра AL.

Задание можно выполнить циклическим сдвигом байта на 4 разряда влево (или вправо):

MOV AL, 17h ; AL=00010111b – начальное значение регистра

MOV CL, 4

ROL AL, CL ; AL=01110001b=71h

Циклический сдвиг влево через перенос (rotate lefh through carry):

RCL op, <счетчик>

Циклический сдвиг вправо через перенос (rotate rigth through carry):

RCR op, <счетчик>

По команде RCL все биты первого операнда сдвигаются на одну позицию влево, причем самый левый бит попадает во флаг CF, а прежнее значение этого флага заносится в самый правый разряд операнда (на рисунке 3.4 слева); в команде RCR все аналогично, только осуществляется сдвиг вправо (на рисунке 3.4 справа):

CF op op CF

 

Рисунок 3.4 – Схема действия команд циклического сдвига

ПРИМЕР

Пусть начальное значение CF=0, а регистр BL содержит 11110000b.

RCL BL, 1 ; CF=1, BL=11100000b

RCL BL, 1 ; CF=1, BL=11000001b

Рассматриваемые команды обычно используются при переносе битов из одного регистра (или переменной) в другой.

ПРИМЕР

Сдвинуть на 3 разряда влево значения регистров AL и DH, приписав справа к AL три левых бита регистра DH:

MOV СХ, 3 ; счетчик количества сдвигаемых бит

L: SHL DH, 1 ; в СF бит номер 7 (левый) из DH

RCL AL, 1 ; бит из СF à в бит номер 0 (правый) AL

DEC CX ; CX := CX – 1

CMP CX, 0 ; CX = 0? (все биты перемещены?)

JNE L ; если не все à на L

3.5  Пример программы 1

3.5.1 Формулировка задачи

Если биты номер 2 и 3 ASCII-кода введенного с клавиатуры символа равны 1, инвертировать биты номер 0, 3 и 6 и вывести на дисплей символ, соответствующий измененному коду; иначе протестировать бит номер 5 кода введенного символа.

3.5.2 Постановка задачи

В начале работы предлагается ввести символ, имеющий ASCII-код.

После анализа бит номер 2 и 3 кода выполняется либо инвертирование бит номер 0, 3 и 6 и вывод символа, соответствующего измененному коду, либо тестирование бита номер 5 исходного кода и вывод соответствующего результата.

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

3.5.3  Тестирование программы

Для проверки правильности работы необходимо ввести следующие символы (таблица 3.3).

Таблица 3.3 – Символы для тестирования программы

Номер бита кода символа

Символ

Примечание

7

6

5

4

3

2

1

0

0

1

1

0

1

1

0

1

m (англ)

Подлежит
инвертированию

0

0

1

0

0

1

0

0

$

Результат инвертирования

0

1

1

0

0

1

0

0

4

Подлежит
тестированию

0

1

1

1

1

0

0

0

х (англ)

Подлежит
тестированию

0

1

0

1

0

0

0

0

Р (англ)

Подлежит
тестированию

3.5.4 Листинг программы

model small

.stack 100h

.data

priglash db 'Введите символ->','$'

vivs db 10, 13, 'Символ после изменения кода ->','$'

rez0 db 10, 13, 'Бит = 0','$'

rez1 db 10, 13, 'Бит = 1','$'

.code

start: ; точка входа в программу

mov ax, @data ; загрузка адреса сегмента данных

mov ds, ax

mov dx, offset priglash ; загрузка начального адреса строки в dx

mov ah, 9h ; вывод строки 'Введите символ'

int 21h

mov ah, 1h ; ввод символа

int 21h ; код символа - в al

mov bl, al ; копия кода символа - в bl

; если хотя бы одно условие не выполняется, переход на тестирование

; (см. подробно в п. 3.3)

test bl, 100b ; проверка бита номер 2

jz tst ; если =0, (случай «иначе»), переход на tst

test bl, 1000b ; проверка бита номер 3

jz tst ; если =0, (случай «иначе»), переход на tst

; инвертирование бит номер 0, 3 и 6

xor bl, 01001001b

mov dx, offset vivs ; вывод строки 'Символ после изменения кода' mov ah, 9h

int 21h

mov dl, bl ; вывод символа, код символа в dl

mov ah, 2h

int 21h

jmp fin

tst: test bl, 00100000b ; тестирование бита номер 5

jz r0 ; если бит =0, переход на метку r0

; бит ≠0, вывод сообщения rez1

mov dx, offset rez1 ; вывод строки 'Бит = 1'

mov ah, 9h

int 21h

jmp fin

r0: ; вывод сообщения rez0

mov dx, offset rez0 ; вывод строки 'Бит = 0'

mov ah, 9h

int 21h

fin: mov ah, 1 ; задержка для обозрения

int 21h

mov ax, 4C00h ; завершение работы

int 21h

end start

3.6  Задания для самостоятельной работы

3.6.1 Если первый или третий 3 бит кода введенного с клавиатуры символа равен 1, протестировать бит номер 6 символа D и вывести соответствующее сообщение; иначе установить 1 в четвертый бит кода символа и вывести на дисплей символ, соответствующий измененному коду.

3.6.2 Если седьмой бит кода введенного с клавиатуры символа равен 0, а второй бит равен 1, сбросить седьмой бит кода и вывести на дисплей символ, соответствующий измененному коду; иначе протестировать третий бит G и вывести соответствующее сообщение.

ЛОГИЧЕСКИЕ КОМАНДЫ И КОМАНДЫ СДВИГА. 26

Цель работы.. 26

Логические операции. 26

3.2.1 Особенности логических команд. 26

Применение логических команд. 27

Условный оператор со сложным условием.. 29

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

Пример программы 1. 33

3.5.1 Формулировка задачи. 33

3.5.2 Постановка задачи. 34

Тестирование программы.. 34

3.5.4 Листинг программы.. 34

Задания для самостоятельной работы.. 36